public class MyString { public static void main(java.lang.String[] args){ String a="Hello"; a=a.trim().concat("World"); String c="HelloWorld"; System.out.println(a==c);//returns false }字符串字面量应该隐式进行intern。然后为什么将a和c视为两个不同的字符串?a和c会指向字符串池中的相同内存引用吗?由a和c返回的哈希码相同,但a == c返回false。有人可以解释为什么返回的值是错误的。
2 回答
呼唤远方
TA贡献1856条经验 获得超11个赞
字符串文字应隐式进行实习
是的
那么为什么a和c被当作两个不同的字符串
因为它们是两个不同的String
实例,所以碰巧具有相同的内容。a
的值不是字符串文字。
守着一只汪
TA贡献1872条经验 获得超3个赞
该方法concat不会将新创建的字符串添加到字符串内部。这是实现concat:
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
在JLS中也记录了以下内容:
在运行时通过串联计算的字符串是新创建的,因此是不同的。
这意味着当代码执行时,将String c="HelloWorld";创建一个新的String并将其添加到该intern中,因为前一个HelloWorldintern不存在。
这两个字符串的位置(引用)不同,因此使用==对其进行检查将返回false。
添加回答
举报
0/150
提交
取消