如何在Java中计算hashCode()
该方法在java中返回什么值?hashCode()
我读到它是一个对象的记忆参考...的哈希值为 1;的哈希值为 97。new Integer(1)
String("a")
我很困惑:是ASCII还是什么类型的值?
该方法在java中返回什么值?hashCode()
我读到它是一个对象的记忆参考...的哈希值为 1;的哈希值为 97。new Integer(1)
String("a")
我很困惑:是ASCII还是什么类型的值?
返回的值绝不保证是对象的内存地址。我不确定类中的实现,但请记住,大多数类将重写,以便语义等效(但不是同一实例)的两个实例将哈希到相同的值。如果类可以在另一个数据结构(如 Set)中使用,则这一点尤其重要,该结构依赖于 与 一致。hashCode()
Object
hashCode()
hashCode
equals
无论如何,没有唯一标识对象实例的方法。如果你想要一个基于底层指针的哈希码(例如在Sun的实现中),请使用 - 这将委托给默认方法,而不管它是否已被覆盖。hashCode()
System.identityHashCode()
hashCode
但是,甚至可以为多个对象返回相同的哈希值。有关说明,请参阅注释,但这里有一个示例程序,该程序不断生成对象,直到找到两个具有相同.当我运行它时,它很快找到两个匹配的,平均在向映射添加大约86,000个长包装器对象(和键的整数包装器)之后。System.identityHashCode()
System.identityHashCode()
System.identityHashCode()
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
哈希码是一个整数值,表示调用哈希码的对象的状态。这就是为什么设置为 1 的将返回哈希码“1”的原因,因为哈希码及其值是相同的。字符的哈希码等于其 ASCII 字符代码。如果您编写自定义类型,则负责创建一个最能代表当前实例状态的良好实现。Integer
Integer's
hashCode