HashSet如何重写了hashcode()和equals()

       在集合框架中,set接口是以保证元素的唯一性而出名的,在实际开发中,set接口也很广泛的应用,在set接口中hashset是非常常用的一种实现类.

那么今天讲一下hashset是如何保证的元素唯一.

      hashset存储自定义类型 保证元素唯一 需要重写hashcode和equals方法
      hashcode()与equals()方法。
                先比较hashCode
                如果hashCode不同 添加到集合
                如果hahhCode相同   继续比较equlas
                如果内容相同 则不添加
                如果内容不同 则添加

       hashcode重写以后可以将元素内的地址值进行比较,如果地址值相同,那么就直接pass掉,不去进行equals的判断,元素的地址值不同,那么这两个元素可能不同,如果元素的地址值相同,那么这两个元素的内容肯定是相同的.所以使用hashset进行判断的时候可以省去很多判断所花费的时间,提高了运行时候的效率性,

      因为集合内元素的地址值是java为每个元素赋予的唯一的一个,具有唯一性,那么我们是不是可以说在set接口内,如果相同了,那么就代表两个元素是相同的,那为什么有说两个地址值不同,元素可能不同呢?难道有相同的情况吗?

public class Demo02_HashSet {

 

      public staticvoid main(String[] args) {

           HashSet<String>set = newHashSet<String>();

          

           set.add("abc");

           set.add("bcd");

           set.add("abc");

           set.add("农丰");

           set.add("儿女");

           System.out.println(set);

          

           Strings = "abc";

           System.out.println(s.hashCode());

          

           System.out.println("农丰".hashCode());

           System.out.println("儿女".hashCode());

      }

}

       有兴趣的小伙伴可以试一试农丰和女儿这两个元素的地址值是不是相同,我测试的结果是,他们的地址值是相同的,内容却不同.因为hashcode的地址值是通过固定算法算出来的,所以通过计算的出来农丰和女儿的地址值是相同的,为了避免这种例外情况的发生,我们需要在这种特殊情况下使用equals进行再次判断.


      在调用hashcode和equals方法已经被重写过了,在源码中的重写方法是这样的

    public int hashCode() {

       int h= hash;

       if (h== 0 && value.length > 0) {

           char val[]= value;

 

           for (int i = 0; i < value.length; i++) {

                h= 31 * h + val[i];

           }

           hash = h;

       }

       return h;

    }

 

  public booleanequals(Object anObject) {

       if (this == anObject) {

           return true;

       }

       if (anObjectinstanceof String) {

           String anotherString = (String) anObject;

           int n= value.length;

           if (n== anotherString.value.length) {

                charv1[] = value;

                charv2[] = anotherString.value;

                inti = 0;

                while(n-- != 0) {

                    if(v1[i] !=v2[i])

                            return false;

                    i++;

                }

                returntrue;

           }

       }

       return false;

    }



      下面通过一个综合性的例题展示给大家,set接口下,的hashset的用法.

双色球规则:双色球每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1—33中选择;蓝色球号码从1—16中选择.请随机生成一注双色球号码

publicclassTest01 {

    publicstaticvoidmain(String[] args) {

       //1.创建Random随机数对象

       Randomran = newRandom();

      

       //2.创建HashSet用于保存不重复的红球

       HashSet<Integer>hs = newHashSet<>();

      

       //3.循环判断红球数量是否小于6

       while(hs.size() < 6) {

        // 4.球数量小于6个就产生一个红球.添加到HashSet

           intnum= ran.nextInt(33) + 1;

           hs.add(num);

       }

      

       //5.在生成一个红球

       intblueBall= ran.nextInt(16) + 1;

      

       //6.打印中奖号码

       System.out.println("双色球中奖号码:");

       System.out.print("红球是: ");

      

       for(Integer redBall : hs){

           System.out.print(redBall+ " ");

       }

      

       System.out.println();

       System.out.println("蓝球是: " + blueBall);

    }

}

我已经反复练习过几次这几个代码,感觉对hashset的使用会有一些从底层到实际使用的很好认知过程.

    


 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用HashSet时,如果要将自定义对象作为元素存储在其,则需要重写该对象的hashCode()和equals()方法。 hashCode()方法用于确定元素的哈希值,用于在HashSet确定元素的位置。 equals()方法用于比较两个元素是否相等。如果两个元素的hashCode()值相同,则会调用equals()方法来确定它们是否相等。 重写这两个方法的规则如下: - hashCode()方法: 1. 在同一对象多次调用hashCode()应该返回相同的整数。 2. 如果equals()比较两个对象相等,则它们的hashCode()返回值应该相同。 3. hashCode()返回值不一定唯一,不同对象可能会返回相同的整数。 - equals()方法: 1. 自反性: 对于任何非空引用x,x.equals(x)应该返回true。 2. 对称性: 对于任何非空引用x和y,当且仅当y.equals(x)返回true时,x.equals(y)也应该返回true。 3. 传递性: 对于任何非空引用x,y,z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也应该返回true。 4. 一致性:对于任何非空引用x和y,多次调用x.equals(y)应该始终返回相同的结果在使用HashSet的时候,为了保证对象的唯一性,需要重写对象的hashCodeequals方法。 hashCode方法用于生成对象的哈希码,HashSet在添加对象时会使用该哈希码来判断对象是否重复。 equals方法用于判断两个对象是否相等。如果重写hashCode方法,一般也要重写equals方法。 重写这两个方法时,需要遵循以下规则: 1.如果两个对象相等,那么它们的hashCode值一定相等。 2.如果两个对象的hashCode值相等,那么它们不一定相等。 3.equals方法需要遵循传递性,对称性和自反性

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值