我正在学习java中的hashcode()
方法。我正在阅读教程
并且看到hashcode()主要用在HashMap,HashTable和HashSet中。
这就是我所理解的,如果我们想要将对象作为键插入,那么我们必须覆盖hashcode()。
其他它无法查找密钥。
我做了一个小例子,我可以在不覆盖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));
}
}
答案 0 :(得分:2)
您使用与Bucket
完全相同的引用,因此使用.hashCode()
和.equals()
的默认实现(分别为System.identityHashCode()
和引用相等)。< / p>
现在尝试:
Set<Bucket> set = new HashSet<>();
// Create two buckets b1, b2 with the same number
set.add(b1); set.add(b2);
该集合的大小为2.如果b1
和b2
相等(它们不是),则该集合的大小为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 。为什么?由于b1
和b2
不是同一个引用,Object
&#39; s .hashCode()
(最有可能)会为两者返回不同的结果。
因此,您需要覆盖 .equals()
和.hashCode()
才能正常使用。有关详细信息,请参阅javadoc of Object
,详细说明两者的合同。
另请注意,.hashCode()
没有&#34;加密值&#34;。这是一个完全合法(尽管无用)的实现:
@Override
public int hashCode()
{
return 42;
}