gpt4 book ai didi

java - 哈希码使用未显示在代码中

转载 作者:行者123 更新时间:2023-11-30 03:41:55 25 4
gpt4 key购买 nike

我正在学习java中的hashcode()方法。我正在浏览教程看到hashcode()主要用在HashMap、HashTable和HashSet中。这就是我的理解,如果我们想插入一个对象作为键,那么我们必须重写hashcode()。否则它将无法查找 key 。我做了一个小例子,我可以在不覆盖 hashCode 的情况下实现这一点。那么 hashCode() 的具体用途是什么?

看下面的代码

package hashcode;

public class Bucket {

private int number;

public void setNumber(int number) {
this.number = number;
}

public int getNumber() {
return number;
}

@Override
public String toString() {
return "" + number;
}

}


package hashcode;

import java.util.Hashtable;

public class MainHashcodeExample {

public static void main(String[] args) {

Hashtable<Bucket, String> map = new Hashtable<>();
Bucket bucket = new Bucket();
bucket.setNumber(100);
map.put(bucket, "A");

System.out.println(map.get(bucket));

}
}

最佳答案

您对 Bucket 使用完全相同的引用,因此 .hashCode().equals() 的默认实现是使用(分别是 System.identityHashCode() 和引用相等)。

现在尝试:

Set<Bucket> set = new HashSet<>();

// Create two buckets b1, b2 with the same number

set.add(b1); set.add(b2);

集合的大小为 2。如果 b1b2 相等(但事实并非如此),则集合的大小为 1。

现在,让我们假设您实现了 .equals(),但没有实现 .hashCode():

// no hashCode(), but...

@Override
// simplified
public boolean equals(@Nullable final Object obj)
{
// instanceOf works with null, so this works
if (!(obj instanceOf Bucket))
return false;
return ((Bucket) obj).number == number;
}

然后运行上面的代码...集合的大小仍为 2。为什么?因为 b1b2 不是同一个引用,并且 Object.hashCode() 会(很可能) )为两者返回不同的结果。

因此,您需要覆盖两者 .equals().hashCode() 才能正确使用。请参阅javadoc of Object有关更多详细信息,详细解释了两者的契约(Contract)。

另请注意,.hashCode() 没有“加密值”。这是一个完全合法(尽管无用)的实现:

@Override
public int hashCode()
{
return 42;
}

关于java - 哈希码使用未显示在代码中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26649111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com