HashSet集合

    HashSet集合是如何去除重复元素的。Set集合是没有重复元素的,那是怎样保证集合中元素的唯一性呢?这就得依靠两个方法,hashCode() 和 equals() 方法。
    1) 存储元素(对象)的所在类需要重写这两个方法法。至于怎么重写待会再深究。
    2) 当HashSet集合对象调用add()方法添加元素时,会调用元素自身的hashCode()方法算出一个值,然后根据这个值去内存中找到自己的位置,如果这个位置没有对象,此元素就存放在这个位置上。
    3) 如果这个位置上有对象,则继续调用equals()方法比较,如果equals()方法比较的结果为false,那么证明这两个元素不相同,则在这个位置上存放两个元素。如果equals()方法比较结果为true,那么证明这两个元素相同,则不能存放。
    刚才说道怎样重写hashCode()和equals()方法,当然我们一般都是用eclipse自动生成这两个方法。然后我们发现在hashCode()方法中,eclipse定义了一个系数 final int prime = 31; 为什么这个系数是31呢?为什么就不是32或者21呢?之所以乘以31,其实就是为了尽量保证每个对象的哈希值唯一。在存储的时候可以只通过hashCode方法就可以确定其唯一性,就不用再去麻烦equals方法了。
    1) 31是个素数(一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数),这样的数所存在的公倍数就很少。
    2) 数据存储和查找都是通过hash地址值,所以尽量保证我们得到的哈希值和真实地址值一一对应,从而提高查找效率,而乘以31这个系数可以保证哈希值足够大,而减少重复,也可以保证得出来的哈希值不溢出。
    3) 大家都知道,计算机底层全是二进制,做乘法运算时,使用的是位移运算,如 2*3可以用2 << 3来表示,就是把2对应的2进制向左移动3位。选择31做为系数则是由于一个数乘以31使用位移运算很好计算,如:i * 31 就可以用:  (i << 5) -1 来表示。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值