Java中String字符串拼接比较是否相同

本文探讨了Java中String拼接的两种方式(常量和变量)下,使用`==`和`equals()`比较结果的不同。重点讲解了常量池、栈与堆的作用,以及为何`intern()`方法会导致`==`比较结果改变。
摘要由CSDN通过智能技术生成

==是在基本类型里比较值的大小,在引用类型里是比较数据指向的地址是否相同。

八种基本类型:byte,short,int,long,float,double,boolean,char.

八种基本类型之外的是引用类型,String就是引用类型。

String拼接有两种形式:

1.常量拼接:

String a = "a";

String b ="bc";

String c ="a"+"bc";

String d="abc";

因为是常量,所以会在java常量池中存放一个a和一个bc,在拼接的时候因为没有abc字符串,但常量池中有a,bc会直接将已有的a和bc拼接起来也放在常量池中。再给d赋值abc时常量池已经有直接用就行。用==比较c和d因为用的都是常量池里的abc所以返回的结果是true。

2.变量拼接

String A="a";

String B="bc";

String c=A+B;

String d="abc";

String str=new String("abc"); 

 str是个对象实例会在栈中开辟一块空间,使用new String会在堆中开辟一块空间。对象实例在栈中开辟空间、new String在堆中开辟空间,但里面的字符串abc会存放在常量池中,栈中的str实例会指向堆中new开辟出那块空间的地址,而对象实例str想用abc这个字符串就会在它的堆中指向常量池中abc的地址,放在常量池的目的是:别的对象想调用abc时就不用再开辟新的空间从而造成内存空间的浪费。其他对象也是同样的方法存放字符串。

jvm内存图如下:

 

 c=A+B就是用变量拼接,只要有一个变量就是变量拼接,拼接的原理是StringBuilder,

StringBuilder c=new StringBuilder("");

c.append("a").append("bc").toString(); 

也就是在堆中新开辟出一个空间在空间中进行拼接abc(abc在堆中放了一个)并把abc放常量池中,所以用==比较c和d的值时c的abc是在堆中的而d的abc是在常量池中的所以返回的的结果是false。

String e=c.intern();

如果用了以上方法再比较e==d返回的结果就是true了,因为实例e会把地址指向常量池中。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sshm_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值