java String

发布于 2022-09-11 16:42:35 字数 173 浏览 17 评论 0

String b="abcd"
String a= "a"
String c="bcd"
String d=a+c
system.out.println(d==b)// false
为什么是 false 根据java字符串常量只能有一份的原则,应该是true才对。
这里的内存图是什么样的

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

故事还在继续 2022-09-18 16:42:35

String在比较值的时候需要用equals方法,b.equals(d)返回的是true,b的对象是"abcd"这个字符串的引用地址,而d是"a"和"bcd"拼接后的一个新对象,两个的引用地址不相同,所以==返回的是false,内存图得大神弄下,我也是菜鸡水平程序员。。。

潜移默化 2022-09-18 16:42:35
JAVA 的字符串常量只能有一份的原则???

什么时候这种虚拟机优化,都能被当做原则了,我的天,谁给你保证的???

String d = a + c;

这个赋值当然是在这句执行的时候才会计算啊,计算出来的是一个新的变量,而不是字符串常量池里的那个。
说起来,这里也有一个优化的问题,字符串拼接会被优化为类似于 StringBuilder 操作
你要非要说,为啥常量计算不直接编译的时候就能计算了,就完事了呗……
这个是程序正确性的问题了,已经不是优化的问题了。

早茶月光 2022-09-18 16:42:35

首先要明确的是 引用数据类型 == 比较的是地址值,a+c 是StringBuffer 在起作用的
d==b 为false是因为其实是创建了一个StringBuffer对象,然后用StringBuffer对象执行append方法来创建出字符串对象“abcd”,调用toString,然后再转换成为String。但是这个转换后的String对象,是创建对象的,给放在堆里面,指向的内存地址的引用,而c是字符串常量的,所以当然不相等了啊,重点是在string相加的得到string字符串的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文