java中StringBuffer对象的哈希码是如何生成的?
How hash code is generated for StringBuffer object in java?
我正在 java 学习 String
并且在学习的过程中我了解到哈希码是为每个字符串生成的。
我想知道在StringBuffer
的情况下hash码是如何生成的。
StringBuffer
extends Object
class directly and it does not override hashCode
from Object
class. So the implementation of StringBuffer::hashCode
is the same as for Object::hashCode
.
StringBuffer
class 不会覆盖从 Object
class 继承的 hashCode()
方法StringBuffer
实例 Object
class 的 hashCode
实现被使用。
这是因为 StringBuffer
是一个可变对象,与 String
不同,您可以在 StringBuffer
对象创建后轻松修改其状态。这使得它不适合用于任何基于 "hash" 的数据结构,例如 HashMap
,因为它会不一致。
Object
class的hashCode
方法是native方法,一般通过将对象的内部地址转换为整数作为哈希码值来实现,也可以不是因为它依赖于 JVM 的内部实现,而是在不可变的 String
class 中 hashCode
被覆盖并使用 String
对象的内容实现它在散列数据结构中使用一致。
就像简单的实验一样,您可以 运行 验证该理论的片段:
StringBuffer s1 = new StringBuffer("foo");
StringBuffer s2 = new StringBuffer("foo");
System.out.println(s1.hashCode() == s2.hashCode());
System.out.println(s1.toString().hashCode() == s2.toString().hashCode());
这将输出 false
和 true
。这是因为 String
实例实际上是使用对象的状态来计算哈希码,所以 s1.toString()
和 s2.toString()
.
都是一样的
我正在 java 学习 String
并且在学习的过程中我了解到哈希码是为每个字符串生成的。
我想知道在StringBuffer
的情况下hash码是如何生成的。
StringBuffer
extends Object
class directly and it does not override hashCode
from Object
class. So the implementation of StringBuffer::hashCode
is the same as for Object::hashCode
.
StringBuffer
class 不会覆盖从 Object
class 继承的 hashCode()
方法StringBuffer
实例 Object
class 的 hashCode
实现被使用。
这是因为 StringBuffer
是一个可变对象,与 String
不同,您可以在 StringBuffer
对象创建后轻松修改其状态。这使得它不适合用于任何基于 "hash" 的数据结构,例如 HashMap
,因为它会不一致。
Object
class的hashCode
方法是native方法,一般通过将对象的内部地址转换为整数作为哈希码值来实现,也可以不是因为它依赖于 JVM 的内部实现,而是在不可变的 String
class 中 hashCode
被覆盖并使用 String
对象的内容实现它在散列数据结构中使用一致。
就像简单的实验一样,您可以 运行 验证该理论的片段:
StringBuffer s1 = new StringBuffer("foo");
StringBuffer s2 = new StringBuffer("foo");
System.out.println(s1.hashCode() == s2.hashCode());
System.out.println(s1.toString().hashCode() == s2.toString().hashCode());
这将输出 false
和 true
。这是因为 String
实例实际上是使用对象的状态来计算哈希码,所以 s1.toString()
和 s2.toString()
.