A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 暮色醉玄阳 中级黑马   /  2014-10-19 21:06  /  893 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1、HashSet是无序的,没有下标这个概念。HashSet集合中元素不可重复(元素的内容不可重复);
   2、HashSet 底层用的也是数组。
   3、HashSet如何保证元素不重复?Hash算法和equals方法。
      当向数组中利用add(Object obj)添加对象的时候,系统先找对象的hashCode:
      int hc=obj.hashCode(); 返回的hashCode 为整数值。
      int I=hc%n;(n 为数组的长度),取得余数后,利用余数向数组中相应的位置添加数据,以n 为6 为例,
      如果I=0则放在数组a[0]位置,如果I=1则放在数组a[1]位置。
      如果equals()返回true,则说明数据重复。如果equals()返回false,则再找其他的位置进行比较。
      这样的机制就导致两个相同的对象有可能重复地添加到数组中,因为他们的hashCode 不同。
      如果我们能够使两个相同的对象具有相同hashcode,才能在equals()返回为真。
        
      在实例中,定义student 对象时覆盖它的hashcode。
      因为String类会自动覆盖,所以比较String 类的对象时,不会出现相同的string 对象的情况。
      现在,在大部分的JDK 中,都已经要求覆盖了hashCode。
    结论:如将自定义类用hashSet 来添加对象,一定要覆盖hashcode()和equals(),
      覆盖的原则是保证当两个对象hashcode 返回相同的整数,而且equals()返回值为True。
      如果偷懒,直接将hashCode方法的返回值设为常量;虽然结果相同,但会多次地调用equals(),影响效率。
      我们要保证相同对象的返回的hashCode 一定相同,也要保证不相同的对象的hashCode 尽可能不同
      (因为数组的边界性,hashCode 还是有极微几率相同的)。

1 个回复

倒序浏览
hashcode!!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马