Set接口底层实现

Set接口介绍
在这里插入图片描述
set接口的实现类:HashSet、LinkedHashSet和TreeSet
Set接口特点:数据是不能重复的、最多可以存储一个null值
Set接口提供的方法API:
在这里插入图片描述
在这里插入图片描述
HashSet集合
hashSet介绍

HashSet <String> hashSet = new HashSet <String>();
        hashSet.add("语文");
        hashSet.add("数学");
        hashSet.add("英语");
        hashSet.add("语文");

        hashSet.add(null);
        //语文 大物 英语 数学 null 

通过验证:
1、HashSet不能保证数据有序
2、HashSet数据是不能重复的
3、HashSet是可以存储null值

底层数据结构:

电脑中:
内存:高速存储、访问快,数据不能持久
磁盘:存储() 能持久化

hashSet属性:

//map属性是存储数据的,是HashMap类型的数据
private transient HashMap<E,Object> map;
//PRESENT属性, 
private static final Object PRESENT = new Object();

HashSet底层实现是基于HashMap来实现的,将set中存储的值作为HashMap的key来处理,PRESENT是一个填充的value值

HashMap的构造函数

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

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

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


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

HashSet方法:

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

HashSet应用场景:
在做数据去重的场景下使用

LinkedHashSet:

   LinkedHashSet <String> hashSet = new LinkedHashSet <String>();
        hashSet.add("语文");
        hashSet.add("数学");
        hashSet.add("英语");
        hashSet.add("语文");
        hashSet.add(null);

LinkedHashSet特点:
1、数据有序
2、数据不能重复
3、数据是可以存储null的

LinkedHashSet的源码实现:

public class LinkedHashSet<E> extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {

    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }


    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }


    public LinkedHashSet() {
        super(16, .75f, true);
    }


    public LinkedHashSet(Collection<? extends E> c) {
        super(Math.max(2*c.size(), 11), .75f, true);
        addAll(c);
    }
}

通过声明形式可知:其继承自HashSet,其继承了HashSet中所有的属性和方法
构造函数调用父类HashSet中方法如下:

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

LinkedHashSet的实现是基于LinkedHashMap来实现的
LinkedHashSet数据有序的特征是基于LinkedHashMap来保证的,其底层利用双向链表来实现的数据有序

LinkedHastSet的应用场景:
在去重的基础上数据有序

TreeSet

 TreeSet <Integer> treeSet = new TreeSet <Integer>();
        treeSet.add(3);
        treeSet.add(1);
        treeSet.add(6);
        treeSet.add(1);

treesSet特点:
1、数据自然有序(自定义排序,实现Comparator接口)
2、数据不能重复
3、数据不能为null

通过源码可知:TreeSet底层是基于treeMap来实现的

TreeSet引用场景:
数据需要去重,且数据按照特定大小进行排序


版权声明:本文为weixin_49263647原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。