hashcode使用不在代码中显示

时间:2014-10-30 09:20:38

标签: java collections

我正在学习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));

    }
}

1 个答案:

答案 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.如果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&#39; s .hashCode()(最有可能)会为两者返回不同的结果。

因此,您需要覆盖 .equals().hashCode()才能正常使用。有关详细信息,请参阅javadoc of Object,详细说明两者的合同。

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

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