查询字符串池

时间:2018-06-24 18:21:50

标签: java

假设我有字符串:

String a = "hello"; 
String b = "h";
String c = "ello";

String d = b+c;

当我检查a==d时,它返回false。

如果错误,请纠正我,该字节码将包含字符串 d 值为 hello ,对吗?我想知道为什么在程序执行期间未从字符串池中提取字符串d,因为 hello 在字符串池中已经可用,因此在检查是否相等时如上所述返回false。 / p>

4 个答案:

答案 0 :(得分:2)

在执行过程中,将创建StringBuilder,它本身将从char数组中创建一个String对象。

样本: StringBuilder dBuilder = new StringBuilder(); dBuilder.append(b); dBuilder.append(c); String d = dBuilder.toString(); //这里是新的String(value,0,count);将被称为 其中value是char数组,count是结果字符串的大小。

答案 1 :(得分:2)

  

如果有误,请纠正我,字节码将包含字符串d值,您好吗?

你错了。 (通过检查字节码,您可以发现自己错了。)

通过串联db在运行时评估c的值。

只有在将bc都声明为final的情况下,这才成立:然后它们都是编译时间常数表达式(*)。

这意味着分配给d的值是一个编译时常量表达式,因此在编译时将其评估为"hello"。但是只有一个"hello"被插入到常量池中,因为没有必要了。

因此,a == d是正确的。


(*)最终性是成为编译时常数的必要但不充分的条件;另一个相关的事实是,它们被分配了一个编译时常量值,即字符串文字值。

答案 2 :(得分:0)

== 运算符检查两个字符串是否指向完全相同的对象。这里的a,b,c参考变量具有不同的哈希码。实际上 == 比较内存地址。如果它们相等,则将返回true和false

答案 3 :(得分:0)

如果您对Java说,请将d值放入池中

String d = (b+c).intern();

它将返回true;这里的示例(https://ideone.com/Y100H4