无序性:无序性是指当我们往HashSet集合里添加数据时,其位置是不确定的。假设只有16个位置当你往容器中添加数据时,其可能在任何位置。
表格内数字表示添加顺序:(HashSet底层是数组加链表(jdk7),jdk8中其底层是数组+链表+红黑树,下面以jdk7为例)
2 | 1 | 3 | |||||||||||||
4 | |||||||||||||||
5 |
不可重复性:当你调用add()方法添加一个数据时,其底层会先通过算法计算出其哈希值,找到添加的位置,接下来:
①:当该位置上没有元素时,直接添加到该位置上,如果存在,再分以下两种情况。
②:当该位置上有元素时(可能是一个,或者以链表形式存在多个),比较他们的哈希值,若不相同,就直接添加。
③:当其位置上有元素且哈希值相同时,调用对象所在类的equals()方法,若返回false,则添加成功,若返回true,则添加失败。
Eg:jdk7中添加成功后,新元素成为该位置上链表的表头。 jdk8中添加成功后,新元素成为该位置上链表的表尾。
Eg:
@Test public void TestHashSet(){ HashSet s1 = new HashSet(); //起初new一个HashSet对象,其是长度为0,并未初始化数组长度。 System.out.println(s1.size()); //当其进行add()操作时,此时它的容量是16, // 当其内部存储量达到当前容量的0.75(HashSet的加载因子)时,扩容, // 其每一次扩容为当前的两倍。 s1.add(123); s1.add(5546); s1.add(234); System.out.println(s1); s1.add(123); //当其检测到相同的对象时,自动去除。 System.out.println(s1); }