hashCode()
方法在java中返回什么值?
我读到它是一个对象的内存引用… new Integer(1)
的哈希值是 1; String("a")
的散列值是 97。
我很困惑:它是 ASCII 还是什么类型的值?
原文由 Jothi 发布,翻译遵循 CC BY-SA 4.0 许可协议
hashCode()
方法在java中返回什么值?
我读到它是一个对象的内存引用… new Integer(1)
的哈希值是 1; String("a")
的散列值是 97。
我很困惑:它是 ASCII 还是什么类型的值?
原文由 Jothi 发布,翻译遵循 CC BY-SA 4.0 许可协议
hashCode()
返回的值绝不保证是对象的内存地址。我不确定 Object
类中的实现,但请记住大多数类将覆盖 hashCode()
这样两个实例在语义上是等价的(但不是同一个实例)将散列为相同的值。如果这些类可以在另一个数据结构(例如 Set)中使用,这一点尤其重要,它依赖于 hashCode
与 equals
一致。
无论如何,没有 hashCode()
唯一标识一个对象的实例。如果您想要基于底层指针的哈希码(例如在 Sun 的实现中),请使用 System.identityHashCode()
- 这将委托给默认的 hashCode
方法,无论它是否已被覆盖。
尽管如此,即使 System.identityHashCode()
也可以为多个对象返回相同的散列。请参阅评论以获取解释,但这是一个示例程序,它会不断生成对象,直到找到两个具有相同 System.identityHashCode()
的对象。当我运行它时,它会快速找到两个匹配的 System.identityHashCode()
,在将大约 86,000 个 Long 包装器对象(和键的 Integer 包装器)添加到地图后平均。
public static void main(String[] args) {
Map<Integer,Long> map = new HashMap<>();
Random generator = new Random();
Collection<Integer> counts = new LinkedList<>();
Long object = generator.nextLong();
// We use the identityHashCode as the key into the map
// This makes it easier to check if any other objects
// have the same key.
int hash = System.identityHashCode(object);
while (!map.containsKey(hash)) {
map.put(hash, object);
object = generator.nextLong();
hash = System.identityHashCode(object);
}
System.out.println("Identical maps for size: " + map.size());
System.out.println("First object value: " + object);
System.out.println("Second object value: " + map.get(hash));
System.out.println("First object identityHash: " + System.identityHashCode(object));
System.out.println("Second object identityHash: " + System.identityHashCode(map.get(hash)));
}
示例输出:
Identical maps for size: 105822
First object value: 7446391633043190962
Second object value: -8143651927768852586
First object identityHash: 2134400190
Second object identityHash: 2134400190
原文由 danben 发布,翻译遵循 CC BY-SA 3.0 许可协议
8 回答6.5k 阅读
4 回答683 阅读✓ 已解决
2 回答3.4k 阅读
3 回答1.9k 阅读✓ 已解决
1 回答2.1k 阅读✓ 已解决
1 回答2.1k 阅读✓ 已解决
1 回答959 阅读✓ 已解决
哈希码是一个整数值,表示调用它的对象的状态。这就是为什么设置为 1 的
Integer
将返回哈希码“1”的原因,因为Integer's
哈希码及其值是相同的。字符的哈希码等于它的 ASCII 字符代码。如果您编写自定义类型,您有责任创建一个良好的hashCode
最能代表当前实例状态的实现。