【发布时间】:2020-07-15 15:37:14
【问题描述】:
我有以下代码:
public class Test{
public static void main(String []args){
String x = "a";
String y = "a";
System.out.println(System.identityHashCode(x) == System.identityHashCode(y)); //true
System.out.println(x.hashCode() == y.hashCode()); //true
y = y+"b";
System.out.println(x); // "a"
System.out.println(y); // "ab"
System.out.println(System.identityHashCode(x) == System.identityHashCode(y)); //false
System.out.println(x.hashCode() == y.hashCode()); //false
}
}
首先我创建 2 个字符串 x 和 y。然后我检查它们的 HashCodes 并且它们是相同的,所以这意味着它们是一个对象并且它们指向一个内存位置。但是当我改变 y 值时,x 的值不会改变。如果我再次检查它们的哈希码,它们是不同的,这意味着 2 个不同的对象和 2 个不同的内存位置。为什么会这样?为什么当 y 改变时 x 不改变? (因为我们只是在改变一个内存的内容)
我按照this 问题的建议使用哈希码。
更新: 我的困惑有两个原因:
a) 我认为相同的哈希码表示相同的对象(您可以查看 this 和 this 问题,了解我错的详细解释。)
b) 字符串是不可变的,如果值发生变化,则会创建新字符串(如下面的答案所述。)
【问题讨论】:
-
具有相同的哈希码不意味着对象是相同的! Hashcode 是一个 int,所以这里只有 40 亿个可能的 hashcode,但是还有更多可能的字符串,所以肯定会有冲突。