java - hashcode() 和 equals() 方法

标签 java equals hashcode hashset

<分区>

所以我有一个关于 hashcode() 和 equals() 方法的问题

假设我只是写了一个非常基本的程序来覆盖这两个方法

import java.util.*;

class Employee
{
   private String name;
   private int empid;


   public Employee(String name,int empid)
   {
       this.name=name;
       this.empid=empid;
   }


   public int getEmpid()
   {
       return empid;
   }


   public String getName()
   {
       return name;
   }


   public boolean equals(Object obj)
   {
       System.out.println("equals has just been called...");
       Employee e1=(Employee)obj;
       return ((name.equals(e1.name)) && (empid==e1.empid));
   }


   public int hashCode()
   {
       System.out.println("hashcode called...");
       return empid;
   }

}

然后,假设我写了另一个类来添加和迭代 HashSet 中的元素

class Five
{
   public static void main(String args[])
   {
       HashSet hs1=new HashSet();
       hs1.add(new Employee("Alex",25));
       hs1.add(new Employee("Peter",25));
       hs1.add(new Employee("Martin",25));
       hs1.add(new Employee("Alex",25));


       Iterator itr=hs1.iterator();

       while(itr.hasNext())
       {
           Employee e=(Employee)itr.next();
           System.out.println(e.getEmpid()+"\t"+e.getName());
       }


    }

}

现在的问题是 当我尝试用相同的 empid 再次添加 Alex 时,equals() 总是调用你的时间

因为没有索引 n hashmap 所以如果它首先与之前添加的 Alex 进行检查它将返回 true 并且不应该为其他两个元素调用(peter 和 martin) 但 equals 总是调用 3 次

为什么..?

同一个桶中的对象是否也有索引......??

最佳答案

Equals 总是在 java 散列集合中的 hashCode 方法之后调用,同时添加和删除元素。原因是,如果指定的桶中已经有一个元素,那么 JVM 会检查它是否与它试图放入的元素相同。如果 equals 返回 false,则该元素将添加到同一个桶中,但位于桶列表的末尾。所以现在您在同一个桶中没有单个元素,而是元素列表。

现在在检索元素时,首先会调用 hashCode 以到达所需的存储桶,然后使用 equals 扫描列表以获取所需的元素。

hashCode 的理想实现将确保每个桶的列表大小为 1。因此,元素的检索使用 O(1) 复杂度完成。但是如果在一个桶中的列表中存储了多个元素,那么元素的检索将通过 O(n) 复杂度来完成,其中 n 是列表的大小。

顺便说一句,在 HashSet 的情况下,没有在存储桶中创建列表,而是如果 hashcode 和 equals 相同,则简单地替换对象。 ist创建行为在hashmap中。

关于java - hashcode() 和 equals() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17919464/

相关文章:

java - 如何将字符串日期转换为 Date 类对象

Java:如何为真正没有任何状态的类编写适当的 equals 方法?

java - 如何将 JRadioButton 添加到 JTable 和 ButtonGroup 的两个列中。

java - Spring DI 同时有两个构造函数

Java 使用第 3 方套接字库的好处

java - 哈希集如何检查重复元素?

java - Java检查内存地址中==运算符的作用

.net - 对短和 ushort 的 GetHashCode() 的不同实现感到困惑

java - 在 Java 中实现 hashcode()

java - 如何在Java中根据主题划分RDF三元组