Java集合-Set

158 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

大家好,我是尚影嫣🌷,一名Java后端程序媛。如果您喜欢我的文章,欢迎点赞➕关注❤️,让我们一起成为更好的我们~🥰

Set集合

Set继承自Collection接口,与Collection基本上一样,没有提供任何额外的方法。

Set集合是一个存储无序且不重复的集合,单值存储。null只能存一个。

HashSet按Hash算法来存储集合中的元素,所以具有良好的存储和查找性能。

HashSet添加元素能否成功,取决于该元素的hashCode()方法和equals()方法。

Set集合没有get方法,取数据只能用迭代器,forEach遍历,或者toArray转成数组。 方法如下:

public class CollectionDemo {

    public static void main(String[] args) {

        // LinkedList使用的是双向链表,增删快,查找慢
        LinkedList<Integer> linkedList = new LinkedList<>();
        //压栈
        linkedList.push(10);
        linkedList.push(20);
        //弹栈
        Integer i = linkedList.pop();
        //打印出20
        System.out.println(i);

        //--------------set
        Set<String> set = new HashSet();
        set.add("1");
        set.add("1");
        set.add("2");
        set.add("3");
        //set没有get()方法,用迭代器取里面的值
        Iterator it = set.iterator();
        while (it.hasNext()) {
            //使用迭代器时,next()每执行一次,指针会下移一位,地址值会+1
            Object o = it.next();
            System.out.println(o);
        }

    }
}

运行结果如下(重复的值没有添加进去)👇

image.png

总结

Set是无序的,先添加的元素不一定会排在前面。同时Set的元素不可重复,相同元素在Set中只会保留一份,可以利用Set的这个特性做集合去重。

在HashSet中,基本的操作都是有HashMap底层实现的,因为HashSet底层是用HashMap存储数据的。

向HashSet中添加元素的时候,会先计算元素的hashcode值,然后通过扰动计算和按位与的方式计算出这个元素的存储位置。如果这个位置为空,则将元素添加进去;如果不为空,会用equals方法比较元素是否相等,相等则不添加,否则找一个空位添加。