常用类-String
2.String
2.1 String的理解和创建对象
-
String对象用于保存字符串,也就是一组字符序列
-
字符串常量对象是用双引号括起来的字符序列,如"你好"、"12.9"
-
字符串的字符使用Unicode字符编码,一个字符(无论字母还是汉字)占两个字节
-
String类有很多的构造器,构造器的重载
较常用的构造方法
String s1 = new String(); String s2 = new String(String original); String s3 = new String(char[] a); String s4 = new String(char[] a,int startIndex,int count); String s5 = new String(byte[] b); -
String类实现了接口Serializable:String可以串行化,可以进行网络传输
String类实现了接口Comparable:String对象可以比较大小
-
String是final类,不能被其他的类继承
-
String有属性,private final char value[];用于存储字符串内容
-
一定要注意:value是一个final类型,不可修改其地址(具体字符可以修改)
2.2 创建String对象的两种方式
方式一:直接赋值
String s = "hsp";
先从常量池查看是否有"hsp"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。
s最终指向的是常量池的空间地址

方式二:调用构造器
String s = new String("hsp");
先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有"hsp",重新创建;如果有,直接calue指向
最终指向的是堆中的空间地址

课堂测试:
String a = "abc";
String b = "abc";
System.out.println(a.equals(b)); //true;比较的是value数组
System.out.println(a == b); //true;两者在常量池中的地址相同
String a = "hsp";
String b = new String("hsp");
System.out.println(a.equals(b)); //true
System.out.println(a == b); //false;堆的地址和常量池的地址不相同
//intern()方法是返回字符串数据在常量池中的地址
System.out.println(a == b.intern()); //true
System.out.println(b == b.intern()); //false
Person p1 = new Person();
p1.name = "hspedu";
Person p2 = new Person();
p1.name = "hspedu";
System.out.println(p1.name.equals(p2.name)); //true;比较内容
System.out.println(p1.name == p2.name)); //true
System.out.println(p1.name == "hspedu"); //true
String s1 = new String("bcde");
String s2 = new String("bcde");
System.out.println(s1 == s2); //false
//画出内存布局图

2.3 String对象的特性
String是一个final类,代表不可变的字符序列
字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的
//以下语句创建了几个对象
String s1 = "hello";
s1 = "haha";
//创建了两个对象
//注意"hello"和"haha"属于字符串对象,内容不可变,所以"haha"需要重新在常量池创建
//但对于是s1这个String,不可修改其地址,具体字符可以修改(相当于不换地址换指向)

//以下语句创建了几个对象
String a = "hello" + "abc";
//创建一个对象
//编译器不是傻子,可以优化==>String a = "helloabc"
//以下语句创建了几个对象
String a = "hello";
String b = "abc";
String c = a + b;
//String c = a + b;
//1.先创建一个StringBuilder sb = new StringBuilder()
//2.执行sb.append("hello")
//3.执行sb.append("abc")
//4.String s = sb.toString()
//最后其实是c指向堆中的对象(String) value[] ->池中的"helloabc"

重要规则:
String s1 = "ab" + "cd",常量相加,看的是池;String s2 = a +b,变量相加,是在堆中
public class Test1{
String str = new String("hsp");
final char[] ch = {'j','a','v','a'};
public void change(String str,char ch[]){
str = "java";
ch[0] = 'h';
}
public static void main(String[] args){
Test1 ex = new Text1();
//调用方法会产生新栈,新栈随着方法结束而结束
ex.change(ex.str,ex.ch);
System.out.print(ex.str + "and");
System.out.println(ex.ch)
}
}
2.4 String类的常见方法
String类是保存字符常量的。每次更新需要重新开辟空间,效率比较低。所以设计StringBuilder和StringBuffer增强功能提高效率
-
equals // 区分大小写,判断内容是否相等
-
equalsIgnoreCase //忽略大小写的判断内容是否相等
-
length // 获取字符的个数,字符串的长度
-
indexOf //获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1
-
lastindexOf //获取字符在字符串中最后1次出现的索引,索引从0开始,如找不到,,返回-1
-
substring //截取指定范围的子串
String name = "hello,张三"; name.substring(6); //索引6开始截取的字符串 name.substring(0,5); //索引0开始截取,截取到索引5-1的位置(前开后闭) -
trim //去前后空格
-
charAt:获取某索引处的字符,注意不能使用Str[index]这种方式(即不能当作数组直接获取,如str[0])
第二组String相关的方法:
-
toUpperCase //转化成大写
-
toLowerCase //转换成小写
-
concat //拼接字符串
String name = "hello,张三"; s1 = s1.concat("你好").concat("我是李四"); -
replace 替换字符串中的字符
- 注意,s1.replace方法执行后,返回的结果如果用s1接收,s1才是被替换过的
- 否则对s1没有任何影响
-
split 分割字符串,对于某些分割字符,我们需要 转义比如|\\等
String poem = "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆件路径"; String[] split = poem.split(","); //以逗号分割String poem = "E:\\aaa\\bbb"; String[] split = poem.split("\\\\"); //对字符串进行分割时,如果有特殊字符,需要加入转义符\ //输出E: aaa bbb -
compareTo //比较两个字符串的大小,前大返回正数;后大返回负数;相等则为0
- 长度一样:返回两值差
- 长度不同:返回长度差
-
toCharArray //转换成字符数组
-
format//格式字符串,%s字符串%c字符%d 整型 %.2f浮点型

浙公网安备 33010602011771号