假设我有字符串:
String a = "hello";
String b = "h";
String c = "ello";
String d = b+c;
当我检查a==d
时,它返回false。
如果错误,请纠正我,该字节码将包含字符串 d 值为 hello ,对吗?我想知道为什么在程序执行期间未从字符串池中提取字符串d,因为 hello 在字符串池中已经可用,因此在检查是否相等时如上所述返回false。 / p>
答案 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值,您好吗?
你错了。 (通过检查字节码,您可以发现自己错了。)
通过串联d
和b
在运行时评估c
的值。
只有在将b
和c
都声明为final
的情况下,这才成立:然后它们都是编译时间常数表达式(*)。
这意味着分配给d
的值是一个编译时常量表达式,因此在编译时将其评估为"hello"
。但是只有一个"hello"
被插入到常量池中,因为没有必要了。
因此,a == d
是正确的。
(*)最终性是成为编译时常数的必要但不充分的条件;另一个相关的事实是,它们被分配了一个编译时常量值,即字符串文字值。
答案 2 :(得分:0)
== 运算符检查两个字符串是否指向完全相同的对象。这里的a,b,c参考变量具有不同的哈希码。实际上 == 比较内存地址。如果它们相等,则将返回true和false
答案 3 :(得分:0)