hashCode在Java中的工作原理
我有一个hashCode在Java中的工作原理,java,hashcode,Java,Hashcode,我有一个Employee类,我重写了hashCode()方法,而不是equals()方法 public class Employee { public int id; public String name; public Employee (int id, String name) { this.id = id; this.name = name; } @Override public int hashCode() { return name.hashCode(); }
Employee
类,我重写了hashCode()
方法,而不是equals()
方法
public class Employee {
public int id;
public String name;
public Employee (int id, String name) {
this.id = id;
this.name = name;
}
@Override
public int hashCode() {
return name.hashCode();
}
}
现在,客户端添加了3个数据,其中hashCode()
将是相同的
public class EmployeeTest {
public static void main(String...args) {
Employee emp1 = new Employee(11, "Arunan");
Employee emp2 = new Employee(22, "Arunan");
Employee emp3 = new Employee(33, "Arunan");
HashMap<Employee,Employee> map = new HashMap<>();
map.put(emp1, emp1);
map.put(emp2, emp2);
map.put(emp3, emp3);
Employee emp = map.get(emp3);
System.out.println(emp.id);
}
}
公共类EmployeeTest{
公共静态void main(字符串…参数){
员工emp1=新员工(11,“阿鲁南”);
员工emp2=新员工(22,“阿鲁南”);
员工emp3=新员工(33,“阿鲁南”);
HashMap=newHashMap();
map.put(emp1,emp1);
map.put(emp2,emp2);
map.put(emp3,emp3);
emp=map.get(emp3);
系统输出打印项次(emp.id);
}
}
现在根据我的理解,上述3个对象将在hashmap中的同一个bucket中结束。由于没有实现
equals()
,HashMap很难识别特定对象。但是在上面的程序中,我得到了emp3对象,它正确地获取了emp3对象。hashmap是如何工作的?如果两个对象实际上是同一个对象,则equals()的默认实现将返回true。在本例中,您使用放入hashmap中的相同对象(emp3
)来查询hashmap。这就是它工作的原因。如果两个对象实际上是同一个对象,则equals()的默认实现将返回true。在本例中,您使用放入hashmap中的相同对象(emp3
)来查询hashmap。这就是它工作的原因。如果两个对象实际上是同一个对象,则equals()的默认实现将返回true。在本例中,您使用放入hashmap中的相同对象(emp3
)来查询hashmap。这就是它工作的原因。如果两个对象实际上是同一个对象,则equals()的默认实现将返回true。在本例中,您使用放入hashmap中的相同对象(emp3
)来查询hashmap。这就是它起作用的原因。你说得对,他们最终会在同一个桶里
如果没有重写的equals
方法,JVM将只比较对象引用的相等性
在本例中,当您放入映射时,您将同一对象传递给map.get()
,因此引用将相等,因此它与对象匹配
尝试创建:
Employee emp3CantFindMe = new Employee(33, "Arunan")
您会发现,尝试从映射中检索将导致null,尽管它似乎与emp3
相同,但您认为它们最终位于同一个桶中是正确的
如果没有重写的equals
方法,JVM将只比较对象引用的相等性
在本例中,当您放入映射时,您将同一对象传递给map.get()
,因此引用将相等,因此它与对象匹配
尝试创建:
Employee emp3CantFindMe = new Employee(33, "Arunan")
您会发现,尝试从映射中检索将导致null,尽管它似乎与emp3
相同,但您认为它们最终位于同一个桶中是正确的
如果没有重写的equals
方法,JVM将只比较对象引用的相等性
在本例中,当您放入映射时,您将同一对象传递给map.get()
,因此引用将相等,因此它与对象匹配
尝试创建:
Employee emp3CantFindMe = new Employee(33, "Arunan")
您会发现,尝试从映射中检索将导致null,尽管它似乎与emp3
相同,但您认为它们最终位于同一个桶中是正确的
如果没有重写的equals
方法,JVM将只比较对象引用的相等性
在本例中,当您放入映射时,您将同一对象传递给map.get()
,因此引用将相等,因此它与对象匹配
尝试创建:
Employee emp3CantFindMe = new Employee(33, "Arunan")
您会发现,尝试从映射中检索将导致null,即使它似乎与emp3
相同,HashMap首先使用hashCode
查找可能的候选对象,然后使用equals
查找实际要查找的对象。即使是好的hashCode
实现也必然存在不能被视为可忽略的冲突。因此,如果这些冲突经常发生,那么必须使用不相等的相同哈希代码创建对象可能会导致性能下降,但这不会破坏语义。另一种方法(使用相同的对象和不同的hashCode)会破坏语义。HashMap首先使用hashCode
查找可能的候选对象,然后使用equals
查找实际要查找的对象。即使是好的hashCode
实现也必然存在不能被视为可忽略的冲突。因此,如果这些冲突经常发生,那么必须使用不相等的相同哈希代码创建对象可能会导致性能下降,但这不会破坏语义。另一种方法(使用相同的对象和不同的hashCode)会破坏语义。HashMap首先使用hashCode
查找可能的候选对象,然后使用equals
查找实际要查找的对象。即使是好的hashCode
实现也必然存在不能被视为可忽略的冲突。因此,如果这些冲突经常发生,那么必须使用不相等的相同哈希代码创建对象可能会导致性能下降,但这不会破坏语义。另一种方法(使用相同的对象和不同的hashCode)会破坏语义。HashMap首先使用hashCode
查找可能的候选对象,然后使用equals
查找实际要查找的对象。即使是好的hashCode
实现也必然存在不能被视为可忽略的冲突。因此,如果这些冲突经常发生,那么必须使用不相等的相同哈希代码的对象可能会导致性能下降,但这不会破坏sem