HashSet的无序性和不重复性

无序性:无序性是指当我们往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);
        
    }

你可能感兴趣的:(Javaee学习,链表,java,数据结构)