hashcode()和equals()方法

桑迪

所以我对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());
       }


    }

}

现在的问题是,当我尝试再次使用相同的empids equals()再次添加Alex时,通常称为thee次

因为没有索引n哈希图,所以如果首先使用先前添加的Alex检查它,它将返回true,并且不应为其他两个元素(彼得和马丁)调用,但总是调用3次

为什么..??

是同一存储桶中的对象也具有索引吗?

阿桑(Juned Ahsan):

EqualshashCode在添加和删除元素时,总是在Java哈希集合中方法之后调用原因是,如果指定存储桶中已经有一个元素,那么JVM会检查它是否与尝试放入的元素相同。如果equals返回false,则将该元素添加到同一存储桶中,但在该存储桶的列表末尾。因此,现在您只是在同一存储桶中没有单个元素,而是一个元素列表。

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

的理想实现hashCode将确保每个存储桶中列表的大小为1。因此,使用O(1)复杂度完成元素的检索。但是,如果列表中某个存储桶中存储有多个元素,则元素的返回将由O(n)复杂度完成,其中n是列表的大小。

顺便说一句,在HashSet的情况下,不会在存储桶中创建任何列表,而是仅在哈希码和equals相同时替换该对象。ist的创建行为在哈希图中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

实现hashCode和equals方法,但类是最终的

Groovy:生成equals和hashCode方法

如何实现hashCode和equals方法

HashMap 忽略覆盖的 hashCode 和 equals 方法

toString()、equals() 和 hashCode() 方法的註釋或實現?

虽然hashCode()和equals()方法是真实的HashMap的containsKey()返回false

在Object方法中延迟加载的实体:toString,equals和hashCode

可以添加的equals()和hashCode()方法糟蹋东西

Google Guava / Equivalence /不同的equals()和hashCode()方法实现

为什么UserRole实现Serializable并覆盖equals()和hashcode()方法

如何获取Checkstyle跳过Eclipse生成的equals()和hashcode()方法?

是否必须为最终类重写equals()和hashCode()方法

Java中的hashCode和equals方法之间的关系

为什么需要覆盖Java中的equals和hashCode方法?

如何在JPA的BaseEntity中实现equals()和hashcode()方法?

为什么Entry接口定义了equals和hashCode之类的方法?

什么时候需要覆盖equals和hashcode方法?

我应该始终重写equals,hashcode和toString方法吗?

Java中的哪些类正在重写equals()和hashCode()方法?

LocalDateTime 精度问题装备我的 equals 和 hashCode 方法

SCJP HashCode()和Equals()混淆

Java:自动equals()和hashCode()

结合hashCode()和equals()更快?

Java equals()和hashCode()的更改

尽管实现了equals和hashcode方法,但是Hashmap的get和containskey方法无法检索对象

hashCode和equals方法中的异常在Java中是否被允许和接受?

有关实体中的Hashcode和Equals和toString方法的问题

什么是HashCodeBuilder和EqualsBuilder,它们用于重写hashcode()和equals()方法?

我是否还需要使用 compareTo 方法覆盖 hashCode 和 equals 方法?