Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
hashCode在Java中的工作原理_Java_Hashcode - Fatal编程技术网

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