Java Set集合详解及Set与List的区别

Java中的Set集合是继承Collection的接口,是一个不包含重复元素的集合。

    下图是Set集合的源码。

Java Set集合详解及Set与List的区别

Set和List都是以接口都形式来进行声明。Set主要包含三种存放数据类型都变量,分别是HashSet,LinkedHashSet,TreeSet.

HashSet LinkedHashSet TreeSet的主要使用情境
        HashSet,从名称就可以看出肯定是和Hash这样的数据结构有关,打开HashSet源码可以看到一个很熟悉到对象

对 就是它HashMap, 熟不熟悉,意不意外,你以为和List同在一个Collection下,他们就很不同么,而且HashSet如果在第一次调用的时候就是new HashMap();

Java Set集合详解及Set与List的区别

 

public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}

 
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}
 

public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
以上是HashSet,1.9版本的的构造器,可见HashSet的底层就是HashMap来构建的并可以添加初始容量和加载因子,来调节反应时间或是空间容量.

 

public boolean add(E e) {//hashset添加元素,即向hashmap下put元素,这也是为什么hashset不会出现重复的元素
    return map.put(e, PRESENT)==null;
}
LinkedHashSet    

Java Set集合详解及Set与List的区别
        当看到源码的时候同时是大吃一斤了吧,没想到,万万没想到竟然不是链表加hash加什么集合,而是:LinkedHashMap。

Java Set集合详解及Set与List的区别

         也就是说这完完全全就是LinkedHashMap的数据结构,并且符合其所有属性和性质,有序,不可重复。

接下来再看看 TreeSet:

    Java Set集合详解及Set与List的区别

从这里也可以看出TreeSet同样也是以TreeMap作为存储结构,有序,不可重复。

 实际上,可以看出,set的实体类主要就是以map为基础,相对应的使用环境和意义也和对应的map相同。

    那为什么会构造Set这个集合呢?
    实际上就是利用map的key-value键值对的方式,通过key的唯一的特性,主要将set构建的对象放入key中,以这样的方式来使用集合的遍历一些特性,从而可以直接用Set来进行调用。
--------------------- 
作者:任玉 
来源:CSDN 
原文:https://blog.csdn.net/xiaoxiaovbb/article/details/80439643 
版权声明:本文为博主原创文章,转载请附上博文链接!