java String

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

阅读 2.1k
3 个回答

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

JAVA 的字符串常量只能有一份的原则???

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

String d = a + c;

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

新手上路,请多包涵

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏