当前位置 博文首页 > 龚厂长的博客:java8 常用集合类汇总详解之Set

    龚厂长的博客:java8 常用集合类汇总详解之Set

    作者:[db:作者] 时间:2021-07-26 14:48

    接上一篇文章《java8 常用集合类汇总详解之List》,本文介绍集合Set。

    Set的实现类主要是HashSet、TreeSet、LinkedHashSet、CopyOnWriteArraySet。
    Set有一个最大的特点就是没有重复元素。 因此可以使用Set去重。
    Set接口没有提供像List.get()一样直接获得某个指定元素的方法,不过它提供遍历所有元素的方法。

    1、HashSet

    HashSet其实是基于HashMap实现的,下面是该类的构造方法:

    	public HashSet() {
            map = new HashMap<>();
        }
    

    该类的所有操作都委托给HashMap完成。
    HashMap的key记录HashSet的元素,value都是Object对象。下面是属性map和Object对象的定义:

        private transient HashMap<E,Object> map;
        private static final Object PRESENT = new Object();
    

    下面是add方法新增一个元素,可以看到value永远都是PRESENT:

        public boolean add(E e) {
            return map.put(e, PRESENT)==null;
        }
    

    2、TreeSet

    TreeSet也是基于TreeMap实现的,该类的所有操作都委托给TreeMap完成,也是使用TreeMap的key记录TreeSet的元素,value都是Object对象。

    3、LinkedHashSet

    LinkedHashSet是HashSet的子类,LinkedHashSet基于LinkedHashMap实现,该类的所有操作都委托给LinkedHashMap完成。
    如果不指定初始容量,默认初始容量为16。

    前面三个类都是基于Map实现的,因为Map的key天然具有不重复的特性,因此可以保证集合中元素不相等。

    4、CopyOnWriteArraySet

    CopyOnWriteArraySet内部使用CopyOnWriteArrayList存储元素,其所有的操作也是委托给CopyOnWriteArrayList完成,基本都是调用CopyOnWriteArrayList中的同名方法。
    CopyOnWriteArrayList可以参见文章《java8 常用集合类汇总详解之List》。

        private final CopyOnWriteArrayList<E> al;
    
        /**
         * Creates an empty set.
         */
        public CopyOnWriteArraySet() {
            al = new CopyOnWriteArrayList<E>();
        }
    

    向CopyOnWriteArraySet中插入元素前,会先比较集合中当前已有的元素,如果有相等的元素,则不插入。

    cs