ITPub博客

首页 > 应用开发 > Java > HashSet中重写haseCode和equals

HashSet中重写haseCode和equals

原创 Java 作者:山有木xi 时间:2020-02-29 18:49:06 1 删除 编辑

为了保存数量不确定的数据,以及保存具有映射关系的数据,Java提供了集合类

集合中的Set,类似一个大罐子,可以依次把1至多个对象存入Set集合,Set集合通常无法记住元素的添加顺序

而Set集合中不允许包含两个相同的元素加入同一个Set集合中,在多个线程同时访问同一个HashSet时,多个线程同时修改HashSet集合时,则必须通过代码来保证其同步

那么HashSet是怎么样区分不同元素的?这就要说到了 hashCode和equals

在HashSet集合加了一个元素时, HashSet会调用该对象的 hashCode方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在HashSet中的位置,如果两个元素通过equals方法比较返回true,但他们的hashCode方法返回值不相等,HashSet将会把他们存放在不同的位置,依然可以添加成功

也就是说HashSet辨别元素是否相同是通过equals判断相等加上对比hashCode值

下面看一段代码

class h
{
   public boolean equals( object obj)
{
        return true;
}
}
class z
{
   public int hashCode()
{
        return 1;
}
}
class t
{
   public int hashCode()
{
        return 2;
}
   public boolean equals( object obj)
{
        return true;
}
}
public class HashSetTest
{
  public static void main(String[] args)
  {
  var b=new HashSet();
  b.add(new h);
  b.add(new h);
  b.add(new z);
  b.add(new z);
  b.add(new t);
  b.add(new t);
  System.out.println(b);
  }
}

结果是:

h@5674dd,h@0987as,z@1,z@1,t@2

也就是说,

两个h对象通过equals方法比较返回true,但HashSet依然把他们当做两个对象

两个z对象通过hashCode返回相同值, 但HashSet依然把他们当做两个对象

两个t对象 通过equals方法比较返回true, 通过hashCode返回相同值,此时, HashSet才将他们当为一个对象

可见:当把一个对象放入HashSet中如果重写 equals 就应该重写 hashCode

当 equals对比两个对象相等时,如果hashCode不同,则会将两个相同的元素添加入 HashSet,这就和Set集合的规 则冲突 了

此时,还有一种极端情况:如果hashCode相等,而equals不同,会怎么样呢?

那么,将会更麻烦,HashSet试图将他们放在一起,但是又不行

所以, 将会采用链式结构,保存多个对象,进而影响性能,导致性能下降

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917874/viewspace-2677836/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle OCA(Java),IBM高级工程师认证,中国软件行业人才(高级c语言),高级Android工程师,对数据库并发与性能调优也有一定了解

注册时间:2019-04-25

  • 博文量
    147
  • 访问量
    390768