我读了这个关于Java字符串池的问题并了解字符串池的基本概念,但仍然不了解其行为。
第一:如果直接赋值并且 s1 和 s2 都引用池中的同一个对象,它就可以工作
String s1 = "a" + "bc";
String s2 = "ab" + "c";
System.out.println("s1 == s2? " + (s1 == s2));
但是如果我更改字符串 s1+="d",那么池应该有一个字符串对象“abcd”?那么当我更改 s2+="d" 时,它应该在池中找到字符串对象“abcd”并将该对象分配给 s2?但事实并非如此,而且它们没有引用同一个对象。这是为什么?
String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2? " + (s1 == s2));
s1 += "d";
s2 += "d";
System.out.println("s1 == s2? " + (s1 == s2));
当您调用时,保证字符串被池化String.intern()
在一根绳子上。
String s1 = "abcd".intern();
String s2 = "abc";
s2 += "d";
s2 = s2.intern();
s1 == s2 // returns true
当编译器看到一个常量时,它足够聪明地优化和池化字符串文字,即:
String s1 = "abcd";
String s2 = "abcd";
s1 == s2 // returns true
Java语言规范 states:
每个字符串文字都是一个引用
(§4.3) 到实例 (§4.3.1, §12.5)
String 类(第 4.3.3 节)。细绳
对象具有恒定的值。细绳
文字,或者更一般地说,字符串
这是常数的值
表达式 (§15.28) - 被“拘禁”,因此
为了共享独特的实例,使用
String.intern 方法。
所以在这种情况下s2 += "d"
,编译器不像你那么聪明,只是汇集起来"d"
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)