使用 HashMap、HashSet 等时覆盖 hashCode?

Overriding hashCode when using HashMap, HashSet etc?

问题在标题中。我使用 HashMap 如下:

Map<Player, Partner> m = new HashMap<Player, Partner>();
//do some on m

其中 PlayerPartner 都只是代表 data-model 的 POJO

public class Player{

    private int id;

    private String name;
    //etc, GET, SET
}

public class Partner{

    private int id;

    private String name;
    //etc, GET, SET
}

我想说 类 中的两个 objects 是等价的 iff​​ 他们有同样 id。那么,我应该写 hashCode 类似

的东西吗?
public int hashCode(){
    return id;
}

这是正确的方法吗?当我要使用 HashMap 或类似的东西时为什么要使用它?

这样的hashCode会起作用。您还必须以一致的方式覆盖 equals

@Override
public boolean equals(Object other)
{
    if (!(other instanceof Player))
        return false;
    Player op = (Player) other;
    return id == op.id;
}

对象存储在哈希桶中,假设您有 100 个对象,如果 100 个 return 哈希码值中的 50 个为“123”,其余 50 个 return 为“124”存储在不同的两个桶中,因此减少了所需的搜索时间。

虽然搜索的首要目的是找到对象所属的桶,一旦找到桶,然后调用equls方法找到对象

不是将所有对象存储在一个地方(搜索很困难),基于哈希的集合将具有相同哈希码值的对象组合在一起,每个这样的组都存储在一个称为哈希桶的地方