String对象的创建以及String之间的比较

String对象的创建以及String之间的对比

2023.2.14

在java中,String对象不可变,值创建后不可被更改,创建String对象的方式有很多,常见的方式有:

方法名说明
public String()创建一个空白字符串对象,不含有任何内容
public String(char[] chs)根据字符数组的内容,来创建字符串对象
public String(String original)根据传入的字符串内容,来创建字符串对象
String s=“abc”直接赋值的方式创建字符串对象,内容就是abc

使用"==“进行比较时,比较的时基本类型数据的值,以及引用数据类型的地址
由于String变量在Java中是引用数据类型,所以在用”=="进行比较时

  1. 两个字符串变量都由直接赋值的方式创建:
String s1="abc";
String s2="abc";
System.out.println(s1==s2);  //输出true

在创建s1的过程中,jvm首先会创建字符串"abc"并将其存放在常量池中,所以在创建s2时,“abc"已经存在于常量池,s2直接引用常量池中的"abc”,s1与s2地址相同,故输出true

  1. 两个字符串变量都是由字符数组的内容创建:
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

  1. 第一个字符串变量由直接赋值方式创建,第二个字符串变量由传入的字符串内容进行创建:
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一个对象,此时创建两个对象(有时面试会问)

  1. 前两个字符串由直接赋值的方式创建,第三个由String对象和字符串拼接的方式获得
String s1 = "abc";        
String s2 = "ab";        
String s3 = s2 + "c";        
System.out.println(s1 == s3);  //输出false

当字符串之间使用 + 号串联(拼接)的时候,系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接,拼接后,再调用其toString方法转换为String类型

  1. 第一个字符串由直接赋值的方式创建,第二个字符串由多个字符串拼接获得
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()方法即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值