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 还是有极微几率相同的)。
|
|