java copyonwritearrayset_Java 源码 - java.util.concurrent.CopyOnWriteArraySet

1 HashSet如何保证元素不重复?

要弄清楚HashSet如何保证里面的元素不重复,得从以下两个方面入手:

它底层的存储结构是什么?

插入时是如何判断元素是否存在?

当我们弄清楚上面两个问题之后我们也可以明白HashSet为什么是无序的了。

1)HashSet的底层存储逻辑

且看源码:

public class HashSet

extends AbstractSet

implements Set, Cloneable, java.io.Serializable{

static final long serialVersionUID = -5024744406713321676L;

private transient HashMap map;

// Dummy value to associate with an Object in the backing Map

private static final Object PRESENT = new Object();

/**

* Constructs a new, empty set; the backing HashMap instance has

* default initial capacity (16) and load factor (0.75).

*/

public HashSet() {

map = new HashMap<>();

}

...

}

复制代码

我们可以看出来HashSet的底层存储结构是一个HashMap,并且HashSet的元素作为该Map的Key进行存储,HashMap的Key的存储是无序并且不可重复,这就解释了HashSet中如何保证元素不重复

2)插入逻辑

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

复制代码

直接put到map当中

3)总结

由以上内容我们可以知道HashSet的底层存储结构是HashMap,并且插入到HashSet中元素作为map的key进行存储,这就保证HashSet的一下特点:

HashSet中的元素不重复的

HashSet中的元素是无序的

2 HashSet增删(改查?)原理

我们从上一小节了解到HashSet的底层存储结构是HashMap,那么它的增删也就是map的put和remove

1)增

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

复制代码

直接put到map当中

2)删

public boolean remove(Object o) {return map.remove(o)==PRESENT;}

复制代码

直接在map中移除即可,非常简单

3 CopyOnWriteArraySet为什么能支持并发?

在搞清楚

CopyOnWriteArraySet为什么能支持并发

这个问题之前,我们先来想想以下几个问题:

HashSet对应的并发类为什么叫CopyOnWriteArraySet,而不是叫CopyOnWriteHashSet呢?

CopyOnWriteArraySet和CopyOnWriteArrayList有没有关系?

我想一旦我们弄清楚上面两个问题我们就是知道

CopyOnWriteArraySet为什么能支持并发?

先来看看CopyOnWriteArraySet的部分源码:

public class CopyOnWriteArraySet extends AbstractSet

implements java.io.Serializable {

private static final long serialVersionUID = 5457747651344034263L;

private final CopyOnWriteArrayList al;

/**

* Creates an empty set.

*/

public CopyOnWriteArraySet() {

al = new CopyOnWriteArrayList();

}

...

}

复制代码

从源码中神奇地发现CopyOnWriteArraySet的底层存储结构竟然是CopyOnWriteArrayList,那么我们就可以知道它的名字的由来了,并且知道它支持并发的原理跟CopyOnWriteArrayList是一样的。

4 CopyOnWriteArraySet的增删(改查?)原理

1)增

public boolean add(E e) {

return al.addIfAbsent(e);

}

复制代码

看方法名我们就是如果CopyOnWriteArrayList中不存在某元素才会添加成功

2)删

public boolean remove(Object o) {

return al.remove(o);

}

复制代码

直接从CopyOnWriteArrayList中移除

5 总结

HashSet是如何保证元素的不重复和无序

答:因为HashSet的底层存储结构是HashMap,并且HashSet中的元素是作为Map的Key存储到Map中,所以HashMap中Key是不重复且无序,所以HashSet中的元素也就是不重复和无序的

HashSet的增删(改查?)原理

HashSet的增删原理很简单,就是map的put和remove,为什么没有改查呢?那是因为HashSet中的元素是无序的,没办法根据索引进行查询和修改

CopyOnWriteArraySet支持并发的原理

CopyOnWriteArraySet之所以叫CopyOnWriteArraySet,是因为它的底层存储结构是CopyOnWriteArrayList,同时也就是保证了它的并发安全性

CopyOnWriteArraySet的增删(改查?)原理

CopyOnWriteArraySet继承了AbstractSet,跟HashSet一样只有增删,没有改查,增删原理也就是调用CopyOnWriteArrayList的增删方法,只不过增的时候需要判断一下List中是否存储该元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值