对不起......关于这个愚蠢/愚蠢的问题,伙计们:
为什么没有应用equals()
和hashCode()
?
目前,它们只能按照我预期的HashSet
工作。
更新
偶然重复键值5,但不调用equals和hashCode。
我也想在Value上应用它。
就像HashSet在本例中调用equal和hashCode一样,为什么hashMap不被称为equals和hashCode,即使是key。
UPDATE2 - ANSWER
将调用HashMap的键(class-> HashCode,equals)。 谢谢你们。 我对此有点困惑。 :)
public class Employee {
int id;
String name;
int phone;
public Employee(int id, String name, int phone) {
this.id = id;
this.name = name;
this.phone = phone;
}
// Getter Setter
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Employee other = (Employee) obj;
System.out.println("Employee - equals" + other.getPhone());
if (this.id != other.id) {
return false;
}
if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) {
return false;
}
if (this.phone != other.phone) {
return false;
}
return true;
}
@Override
public int hashCode() {
System.out.println("Employee - hashCode" );
int hash = 3;
hash = 67 * hash + this.id;
hash = 67 * hash + (this.name != null ? this.name.hashCode() : 0);
hash = 67 * hash + this.phone;
return hash;
}
}
____________________________________________________________________________________
public class MapClass {
public static void main(String[] args) {
Map<Integer,Employee> map = new HashMap<Integer,Employee>();
map.put(1, new Employee(1, "emp", 981));
map.put(2, new Employee(2, "emp2", 982));
map.put(3, new Employee(3, "emp3", 983));
map.put(4, new Employee(4, "emp4", 984));
map.put(5, new Employee(4, "emp4", 984));
**//UPDATE**
map.put(5, new Employee(4, "emp4", 984));
System.out.println("Finish Map" + map.size());
Set<Employee> set = new HashSet<Employee>();
set.add(new Employee(1, "emp", 981));
set.add(new Employee(2, "emp2", 982));
set.add(new Employee(2, "emp2", 982));
set.add(new Employee(3, "emp3", 983));
set.add(new Employee(4, "emp4", 984));
set.add(new Employee(4, "emp4", 984));
System.out.println(set.size());
}
}
输出
Finish Map5
Employee - hashCode
Employee - hashCode
Employee - hashCode
Employee - equals982
Employee - equals982
Employee - hashCode
Employee - hashCode
Employee - hashCode
Employee - equals984
Employee - equals984
4
答案 0 :(得分:6)
EVEN键值5重复但不调用equals和hashCode
是的,它会在键上调用hashCode,即Integer。
我想在Value
上应用它
现实的剂量:Java HashMaps不会那样工作。他们只检查重复项的密钥,而不是值,这是应该的。
如果要在Map中检查Employee的哈希值,那么必须才能成为密钥。周期。
另一种可能的解决方案是下载其中一个可用的多图。
修改以查看它正在调用hashCode和equals,将Map的键类型更改为如下所示:
class MyInt {
private Integer i;
public MyInt(Integer i) {
this.i = i;
}
public Integer getI() {
return i;
}
@Override
public int hashCode() {
System.out.println("MyInt HashCode: " + i.hashCode());
return i.hashCode();
}
@Override
public boolean equals(Object obj) {
System.out.printf("MyInt equals: [%s, %s]%n", i, obj);
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyInt other = (MyInt) obj;
if (i == null) {
if (other.i != null)
return false;
} else if (!i.equals(other.i))
return false;
return true;
}
@Override
public String toString() {
return i.toString();
}
}
然后像这样填写你的地图:
Map<MyInt,Employee> map = new HashMap<MyInt,Employee>();
map.put(new MyInt(1), new Employee(1, "emp", 981));
map.put(new MyInt(2), new Employee(2, "emp2", 982));
map.put(new MyInt(3), new Employee(3, "emp3", 983));
map.put(new MyInt(4), new Employee(4, "emp4", 984));
map.put(new MyInt(5), new Employee(4, "emp4", 984));
map.put(new MyInt(5), new Employee(4, "emp4", 984));
你会看到:
MyInt HashCode: 1
MyInt HashCode: 2
MyInt HashCode: 3
MyInt HashCode: 4
MyInt HashCode: 5
MyInt HashCode: 5
MyInt equals: [5, 5]
答案 1 :(得分:3)
HashMap使用Key值的equals / hashCode(在您的情况下为Integer)。我想那就是你要问的,对吧?
您在地图中有重复项的原因是您是否为同一员工使用新密钥。
map.put(4, new Employee(4, "emp4", 345));
map.put(5, new Employee(4, "emp4", 345)); // You are using 5 as the key
// for the "same" object you did
// in the previous line
如果您做了类似
的事情 // in main
addEmployee(new Employee(4, "emp4", 345));
addEmployee(new Employee(4, "emp4", 345));
private void addEmployee(Employee e)
{
map.put(e.getId(), e);
}
然后你不会在你的收藏中看到任何重复。
答案 2 :(得分:3)
HashMap使用键作为索引,而不是值。 (这是hashCode(),并且可能在上面的代码中的Integer类上调用equals())
答案 3 :(得分:0)
您正在使用HashMap<Integer, Employee>
,看起来如此,因此Integer
将被哈希处理。由于密钥为1,2,3,4,5
,因此HashMap
的大小应为5。