黑马程序员技术交流社区

标题: HashSet集合 [打印本页]

作者: 暮色醉玄阳    时间: 2014-10-19 21:06
标题: HashSet集合
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 还是有极微几率相同的)。

作者: 暮色醉玄阳    时间: 2014-10-19 21:07
hashcode!!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2