Set接口下的三种实现类集合HashSet、LinkedHashSet和TreeSet

Set接口

在这里插入图片描述

Set接口是Collection接口下的子接口,Set接口下有AbstractSet实现类和SortedSet接口,不管是继承自AbstractSet还是SortedSet,我们接下来要讲的就是以下这三种集合:HashSet、LinkedHashSet、TreeSet

Set集合的本质是基于Map实现的,因此有许多的特点是相似的。这在后面,我会做详细的解释。

Set接口下的集合不可以存储重复的数据,存储的数据是无序的,可以仅仅存储一个NULL值。Set接口下的集合都是线程不安全的

Set接口和Map接口的底层结构是一样的,和Map的区别就是Set是存储单个值,而Map是以键值对Key-Value的形式存储数据

HashSet

HashSet实现自AbstractSet抽象类,是基于HashMap实现Set接口的实现类。

特点:

  • 不可以存储重复的数据
  • 存储的数据是无序的
  • 最多可以存储一个NULL值,且NULL值在第一个位置

HashSet是线程不安全的,会抛出ConcurrentModificationException异常。

HashSet源码解析

我们将从继承关系、属性、默认值、构造方法、扩容机制和常用方法等方式进行解析。

继承关系

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

由此我们可以看出HashSet是继承自AbstractSet,实现了Set接口,Cloneable接口(可克隆)和Serializable接口(可序列化)。

属性

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

由此可以看出,HashSet是基于Map实现的,其中HashSet中存储的元素存放在Map中Key的位置,present填充在Map中Value的位置,这样HashSet就变成了只存放单个值的集合了。如果还不理解,那么我们先继续往下看。

构造方法

//无参构造方法,直接将上面创建的map进行实例化
public HashSet() {
   map = new HashMap<>();}
//有参构造方法,参数中放入Collection接口下的集合
public HashSet(Collection<? extends E> c){
   }
//有参构造方法,参数表示初始化容量
public HashSet(int initialCapacity{
   map = new HashMap<(initialCapacity);}
//有参构造方法,参数表示初始容量大小、加载因子
public HashSet(int initialCapacity, float loadFactor) {
   map = new HashMap<>(initialCapacity, loadFactor);}

默认值

//默认容量大小为16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
//默认加载因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值