2 回答
TA贡献1725条经验 获得超7个赞
每当在使用类的实现的实例上调用时,该类StringBuffer不会重写hashCode()从类继承的方法。ObjecthashCodeStringBufferObjecthashCode
这是因为它是一个可变对象,与创建后您可以轻松修改对象的状态StringBuffer不同。这使得它不适合在任何基于“散列”的数据结构(例如 a)中使用,因为它会不一致。StringStringBufferHashMap
hashCode类的方法是Object本地方法,通常通过将对象的内部地址转换为整数作为哈希码值来实现,也可能不是,因为这取决于 JVM 的内部实现,但在不可变类String中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()。
TA贡献1806条经验 获得超8个赞
StringBuffer
直接扩展Object
类,并且不会覆盖hashCode
类Object
。所以 的实现StringBuffer::hashCode
与 的实现相同Object::hashCode
。
添加回答
举报