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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoxiaovbb/article/details/80439643

Set是什么?

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

    下图是Set集合的源码。


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

HashSet LinkedHashSet TreeSet的主要使用情境

        HashSet,从名称就可以看出很定是和Hash这样的数据结构有关,打开HashSet源码可以看到一个很熟悉到对象惊恐


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

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    

        当看到源码的时候同时是大吃一斤了吧,没想到,万万没想到竟然不是链表加hash加什么集合,而是:


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

接下来再看看 TreeSet:

    

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

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

    那为什么会构造Set这个集合呢?

    实际上是将map的key-value键值对的方式,通过key的唯一的特性,主要将set构建的对象放入key中,以这样的方式来使用集合遍历的一些特性。

猜你喜欢

转载自blog.csdn.net/xiaoxiaovbb/article/details/80439643