Java——框架——Java集合框架(持续更新)

概述

        Java集合框架在每个jdk版本都有可能增加新的工具类,本人写这篇文章不保证是最全的集合框架,尽量保证此文章有遗漏或者滞后时会及时更新文章内容。此文章主要是框架工具类概览。如果想了解重点(HashMap,ConcurrentHashMap等)详细内容,请读者跳转具体详述文章查看。

        以下文字描述为杂记和历史发展内容,不感兴趣的小伙伴可直接忽略。
        结构划分方面:集合框架是用于将若干元素放入到一个容器之中,常见的为俩种。分为Map键值对存储和Collection单一元素存储。
        线程安全方面:最早集合框架1.0版本只有Vector和HashTable。估计开发者认为集合框架应该都是线程安全的。因此Vector和HashTable所有方法都加了synchronized。但是synchronized毕竟影响效率,所以后期又加入了HashMap和ArrayList等线程非安全工具类。但是又暴露出线程安全问题。最后又在java.util.concurrent包中逐步增加ConcurrentHashMap等并发安全的工具类。

Map

         Map是键值对key-value的集合框架。常用于根据key值找对应的value,如果调用put时key值重复则覆盖老的值。

实现类数据结构线程安全引入版本简述
HashTable数组+链表
synchronized
1.01. 初始容量为11,负载因子为 0.75。
HashMap数组+链表+红黑树(1.8)1.2HashMap是集合框架中的重中之重,希望读者自行找文章查询其原理。
1. 初始容量为16,负载因子为 0.75。
2. jdk1.8之后链表增加了红黑树,提升链表的效率,链表树化的阈值是8。因为泊松分布。
TreeMap红黑树1.21. 数据结构采用红黑树,所以TreeMap符合红黑树特性。因为底层使用红黑树,所以此结构为排序结构,当使用场景需要排序的Map时,可以使用此Map,排序实现原理使用的是红黑树(二叉树)的中序遍历。
WeakHashMap数组+链表1.21. 数据结构采用数组+链表,初始容量为16,负载因子为0.75。
与HashMap最重要的区别是使用的弱引用,其余与HashMap几乎一样。
LinkHashMap数组+链表+红黑树(1.8)1.41.继承自HashMap。
2. 用链表维护Entry的顺序,默认是插入顺序。通过维护afterNodeRemoval,afterNodeInsertion,afterNodeAccess这三个方法实现的每个元素的链表结构。
与HashMap最重要的区别是使用链表维护各个Entry的顺序,其余与HashMap几乎一样。
IdentityHashMap数组+链表1.41. 初始容量为32,负载因子为2/3。
2. 对象是否重复是使用引用判断。
与HashMap最重要的区别是使用引用判断对象是否一致,其余与HashMap几乎一样。
ConcurrentHashMapSegment 数组+链表+红黑树(1.8)
分段锁
1.5ConcurrentHashMap是集合框架中的重中之重,希望读者自行找文章查询其原理。1. 初始容量为16,负载因子为0.75。
2. 采用分段锁保证线程安全。

Collection

         Collection是单一数据的集合框架。Collection包括List,Set和Queue。List为顺序存储的集合,Set主要用于排重。Queue用于队列处理。

Set

         Set主要用于单一元素排重的集合框架。
         所有Set都是用Map实现的,Set 的入参为Map的key,value为类中的固定成员变量Object。

         例如HashSet

private static final Object PRESENT = new Object();
public HashSet() {
    map = new HashMap<>();
}
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
实现类数据结构线程安全引入版本特性简述
HashSetHashMap1.21. 底层为为HashMap,value为一个Object。
TreeSetTreeMap1.21. 底层为为TreeMap,value为一个Object。
LinkedHashSetLinkedHashMap1.41. 底层为为LinkHashMap,value为一个Object。
EnumSet1.51. 值为枚举的集合类。
CopyOnWriteArraySetCopyOnWriteArrayList1.51. 底层为CopyOnWriteArrayList。
ConcurrentSkipListSetConcurrentSkipListMap1.61. 底层为ConcurrentSkipListMap。

List

实现类数据结构线程安全引入版本特性简述
Vector数组
synchronized
1.01. 底层为数组的有序集合,默认长度为10。
2. 当添加元素时,超过长度后进行扩容。新数组的长度为原数组的2倍。
Stack数组
synchronized
1.0继承Vector
具备后进先出的特点
通过返回len -1的数组元素实现栈的特点
ArrayList数组1.21. 底层为数组的有序集合,默认长度为10。
2. 默认长度为10,当添加元素时,超过长度后进行扩容。新数组的长度为原数组的1.5倍。
LinkList链表1.21.底层为链表的有序集合。
2.添加元素时维护链表的指针即可,无需扩容缩容。
CopyOnWriteArrayList数组
ReentrantLock
1.51.底层为数组的有序集合,每次增加都进行一次长度+1的扩容。
2.线程安全使用ReentrantLock,每次操作时都加锁保证线程安全。

queue

         jdk 1.5增加的新的框架,数据结构为队列。下面主要从三部分简述,
         一:直接实现 queue接口的实现类。
         二:Deque双端队列。
         三:BlockingQueue阻塞队列。

         其中比较重点的为阻塞队列。最重要的特点增加阻塞方法:
         一.put:如果队列满了,则等待阻塞当前线程。
         二.take:如果队列空了,则等待阻塞当前线程。

下面表格为直接实现queue接口的实现类。

实现类数据结构线程安全引入版本特性简述
PriorityQueue
排序队列
最小二叉堆
默认容量为11
1.51. 底层使用最小二叉堆实现排序逻辑。
ConcurrentLinkedQueue链表
cas
1.51. 底层使用链表。
2.算法使用的是 Michael & Scott的改进版本。
Deque 双端队列
实现类数据结构线程安全引入版本特性简述
ArrayDeque底层用的数组
初始容量为16
1.61. 底层使用数组实现。
BlockingQueue

阻塞队列,新增主要两个阻塞方法 take和put 方法。
1.put:如果队列满了,则等待。
2.take:如果队列空了,则等待。

实现类数据结构线程安全引入版本特性简述
ArrayBlockingQueue底层用的数组
初始容量为16
1.51. 有界阻塞队列。
LinkedBlockingQueue底层用的链表1.51. 无界阻塞队列(Integer最大值)。
SynchronousQueue1.51. 容量为0的单一元素阻塞队列。
2.只有一个元素,在多线程之间传递数据。
3.必须先有一个线程take.才能有另外一个线程put。
PriorityBlockingQueue二叉堆1.5有序的阻塞队列常见特性如下:
1. 阻塞队列有序。
2.内部使用ReentrantLock和cas保证线程安全。
3.内部使用二叉堆保证顺序。
DelayQueue基于PriorityQueue1.5按照等待时间排序的等待队列。
LinkedTransferQueue链表1.7增加transfer方法:添加完元素后等待,直到别的线程取走元素。一个线程放入,多个线程取走。

总结

         java集合框架将会持续更新,且会不断丰富各个工具类的内容。如文章有错误之处,欢迎各位同学留言指正。十分感谢。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值