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。有人可以解释为什么返回的值是错误的。
答案 0 :(得分:1)
对于字符串文字,应该隐式进行
可以。
然后为什么将a和c视为两个不同的字符串
因为它们是两个不同的String
实例,所以碰巧具有相同的内容。 a
的值不是字符串文字。
答案 1 :(得分:0)
方法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,因为先前的HelloWorld
在intern中不存在。
两个字符串的位置(引用)不同,因此使用==检查它们会返回false。