使用 HashMap、HashSet 等时覆盖 hashCode?
Overriding hashCode when using HashMap, HashSet etc?
问题在标题中。我使用 HashMap
如下:
Map<Player, Partner> m = new HashMap<Player, Partner>();
//do some on m
其中 Player
和 Partner
都只是代表 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方法找到对象
不是将所有对象存储在一个地方(搜索很困难),基于哈希的集合将具有相同哈希码值的对象组合在一起,每个这样的组都存储在一个称为哈希桶的地方
问题在标题中。我使用 HashMap
如下:
Map<Player, Partner> m = new HashMap<Player, Partner>();
//do some on m
其中 Player
和 Partner
都只是代表 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方法找到对象
不是将所有对象存储在一个地方(搜索很困难),基于哈希的集合将具有相同哈希码值的对象组合在一起,每个这样的组都存储在一个称为哈希桶的地方