【发布时间】:2019-08-11 05:48:03
【问题描述】:
我正在尝试查看字符串对象在 Java 中是如何工作的。
String value1 = "Good";
String value2 = "Good";
System.out.println(Integer.toHexString(value1.hashCode()));
System.out.println(Integer.toHexString(value2.hashCode()));
System.out.println(value1 == value2);
而且显示的是同一个地址
21f4dd
21f4dd
是的
我知道这两个变量指向存储在堆中的同一个对象。但是我在使用连接时被卡住了。
String value3 = "Bad";
System.out.println(Integer.toHexString(value3.hashCode()));
value3 += " enough";
System.out.println(Integer.toHexString(value3.hashCode()));
String value4 = "Bad enough";
System.out.println(Integer.toHexString(value4.hashCode()));
System.out.println(value3 == value4);
显示
103e5
c35f20b
c35f20b
假
连接后,有一个新的字符串对象,其值为“Bad enough”。我将此对象分配给 2 个变量,value3 和 value4 也打印它们的地址。
我的问题是 value3 和 value4 的地址是相同的,所以这意味着它们指向同一个对象,但是为什么 Java 在比较这两个变量时返回 false?
【问题讨论】:
-
哈希码不是内存中的地址。快速阅读Wikipedia article 会澄清。
-
另外,在 Java 中使用
==运算符比较字符串是错误的。看来您不了解 Java 的基础知识,所以我强烈建议您阅读一本书。 Thinking Java 之类的东西。 -
默认的
hashCode实现返回内存地址,但是很遗憾String.hashCode被覆盖了。 -
试试
System.identityHashCode(value3) -
@Sweeper 默认哈希码实现不返回内存地址。垃圾收集器可以在内存中移动 Java 对象,但它们的身份哈希码在移动后将保持不变。