所以我对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次
为什么..??
是同一存储桶中的对象也具有索引吗?
Equals
hashCode
在添加和删除元素时,总是在Java哈希集合中的方法之后调用。原因是,如果指定存储桶中已经有一个元素,那么JVM会检查它是否与尝试放入的元素相同。如果equals返回false,则将该元素添加到同一存储桶中,但在该存储桶的列表末尾。因此,现在您只是在同一存储桶中没有单个元素,而是一个元素列表。
现在,在检索元素时,将首先调用hashCode到达所需的存储桶,然后使用等号扫描列表以获取所需的元素。
的理想实现hashCode
将确保每个存储桶中列表的大小为1。因此,使用O(1)复杂度完成元素的检索。但是,如果列表中某个存储桶中存储有多个元素,则元素的返回将由O(n)复杂度完成,其中n是列表的大小。
顺便说一句,在HashSet的情况下,不会在存储桶中创建任何列表,而是仅在哈希码和equals相同时替换该对象。ist的创建行为在哈希图中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句