当使用HashMap, HashSet等时重写hashCode



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

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

其中PlayerPartner都是代表数据模型的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
}

我想说这些类的两个对象是等价的如果它们具有相同的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个对象中有50个返回哈希码值"123",其余50个返回"124",它们存储在不同的两个桶中,从而减少了所需的搜索时间。

搜索的第一个目标是找到对象所属的桶,一旦找到桶就调用equals方法来查找对象

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

最新更新