String对象的创建以及String之间的对比
2023.2.14
在java中,String对象不可变,值创建后不可被更改,创建String对象的方式有很多,常见的方式有:
方法名 | 说明 |
---|---|
public String() | 创建一个空白字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(String original) | 根据传入的字符串内容,来创建字符串对象 |
String s=“abc” | 直接赋值的方式创建字符串对象,内容就是abc |
使用"==“进行比较时,比较的时基本类型数据的值,以及引用数据类型的地址
由于String变量在Java中是引用数据类型,所以在用”=="进行比较时
- 两个字符串变量都由直接赋值的方式创建:
String s1="abc";
String s2="abc";
System.out.println(s1==s2); //输出true
在创建s1的过程中,jvm首先会创建字符串"abc"并将其存放在常量池中,所以在创建s2时,“abc"已经存在于常量池,s2直接引用常量池中的"abc”,s1与s2地址相同,故输出true
- 两个字符串变量都是由字符数组的内容创建:
char[] chs = {'a', 'b', 'c'};
String s3 = new String(chs);
String s4 = new String(chs);
System.out.println(s3==s4); //输出false
在创建s3,s4的过程中,两个字符串都是由new
关键字得到的,其两个字符串都将放入堆空间中,所以s3,s4是两个不同的对象,地址不同,故输出true
- 第一个字符串变量由直接赋值方式创建,第二个字符串变量由传入的字符串内容进行创建:
String s5 = "abc";
String s6 = new String("abc");
System.out.println(s5==s6); //输出false
同上,关键字new
创建出来的字符串放在堆空间中,而直接赋值的字符串放在常量池中,但是此时s6所在行代码只创建了一个对象,即s6所指向的对象,原因是s5所在行代码已经将"abc"放在常量池中,在创建s6所指向的对象时会在常量池中找"abc"这样一个字符串,如果有,则不创建"abc"字符串,只会new一个对象;若常量池中没有"acb"字符串,则在运行s6所在行代码时会先创建"abc"字符串对象,再new一个对象,此时创建两个对象(有时面试会问)
- 前两个字符串由直接赋值的方式创建,第三个由String对象和字符串拼接的方式获得
String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
System.out.println(s1 == s3); //输出false
当字符串之间使用 + 号串联(拼接)的时候,系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接,拼接后,再调用其toString方法转换为String类型
- 第一个字符串由直接赋值的方式创建,第二个字符串由多个字符串拼接获得
String s1 = "abc";
String s2 = "a" + "b" + "c";
System.out.println(s1 == s2); //输出true
Java存在常量优化机制,在编译的时候,就会将"a" + “b” + “c” 拼接为 “abc”,由于在创建s1字符串对象时已经创建"abc"字符串,所以s2只需引用"abc"字符串
综上所述,用"=="对String进行比较麻烦,故而在进行String变量比较时,若只需考虑字符串内容的对比,直接使用equals()
方法即可