Java之集合(二十七)其它集合

  转载请注明源出处:http://www.cnblogs.com/lighten/p/7551368.html 

1.前言

  本章介绍剩余的3个集合类:ConcurrentSkipListSet、CopyOnWriteArrayList、CopyOnWriteArraySet。因为这三个集合类的实现都比较简单,就一并描述了。Set相关的两个类不用说,一般都是借助其它集合实现的,所以比较简单,CopyOnWriteArrayList也并不复杂。

2.ConcurrentSkipListSet

  该Set集合是基于上章所讲的ConcurrentSkipListMap实现的,所有的方法都是调用ConcurrentSkipListMap的方法。数据结构只有一个ConcurrentNavigableMap<E,Object> m。该集合中的元素都是m中的key值,而m中的value放置的是True的Boolean对象。其它的也没有什么值得说明的。

3.CopyOnWriteArrayList

  这个类是线程安全类型的ArrayList的变种,所有涉及变化的操作都是刷新一个新的拷贝的数组。通常来说这种做法的代价很高,但是如果遍历操作大大超过变化的操作,这也许是一种更高效的方法,当你不想或不能同步遍历的时候这十分有用。整体看就像是一个快照,迭代器创建好了就不再受到变化的操作变化其本身内容。null元素也是允许的。

  数据结构就是一个锁和一个数组。和ArrayList不同,该list变化操作(add,remove等)都是copy了一个全新的数据,get方法获取的是当前数组的指定元素,没有加锁。add方法如下:

  所有修改操作都加了锁,可以从上面代码看出,是获取的当前数组,然后扩容1,拷贝到新数组,然后设置替换成当前数组。

4.CopyOnWriteArraySet

  该Set不同于其它Set,之前所讲的Set都是基于Map实现的,这个Set是基于3中所讲的CopyOnWriteArrayList实现的。所使用的方法也就是list中的方法,add方法使用的是addIfAbsent,因为Set不允许重复的元素。

  逻辑不难理解,其它的也没什么特别的。

posted @ 2017-09-19 13:27  dark_saber  阅读(304)  评论(0编辑  收藏  举报