了解集合之前咱们先看下关系图
放大图片
从图中可以看出,集合分为两个部分,Map和Collection,
Map中咱们常用的有HashMap、ConcurrentHashMap;List常用的集合有ArrayList、LinkedList;Set常用的有HashSet、TreeSet;Queue今天是咱们的重点,下面会详细介绍用法。
List
想了解ArrayList、LinkedList源码的童鞋点击传送
Vactor:底层数据结构是数组结构,线程安全。
ArrayList:底层数据结构是数组结构,非线程安全,查询快,增删慢。
LinkedList:底层数据结构是链表结构,非线程安全,增删快查询慢。
CopyOnWriteArrayList:(每次写数据都会复制一个副本,然后再改变引用),合适读多写少的场景,线程安全
set
HashSet:无需不可重复
SortedSet:有序不可重复
TreeSet:基于红黑树实现
ConCurrentSkipListSet:通过跳跃表实现
Queue
BlockingQueue(线程池使用)
ArrayBlockingQueue(公平、非公平)
ArrayBlockingQueue fairQueue = new ArrayBlockingQueue(1000,true);
内部维护一个数组
offer(E e);//数组满的时候返回false,如果没满,那么插入数据到Array中
add(E e);//数组是满的那么add会抛出IllegalStateException异常
put(E e);//
LinkedBlockingQueue(两个独立锁提高并发)
生产者和消费者采用了独立的锁来控制数据同步
新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素
LinkedBlockingQueue(Integer.MAX_VALUE);
添加方法:
内部使用可重入锁保证线程安全
put(e); //该方法没有返回值,当队列已满时,会阻塞当前线程
offer(e,timeout,unit);//当队列已满时,会阻塞给定时间
offer(e);//不会阻塞,直接返回
takeLock这个可重入锁保证线程安全
enqueue()方法实现节点的添加
AtomicInteger保证原子性
获取方法:
take();
poll(timeout,unit);//队列为空,则阻塞给定的时间
poll();//队列为空,则直接返回null
takeLock这个可重入锁保证线程安全
dequeue()从队头取出元素
AtomicInteger保证原子性
PriorityBlockingQueue(compareTo排序实现优先)
内部维护了一个object数据
支持优先级的无界队列,可以自定义排序规则
取出的数据是队列中最小的
存储:[a, d, c, e, z]
取出:a c d e z
SynchronousQueue(不存储数据,可用于传递数据)
是一个不存储元素的阻塞队列,每一个put操作必须等待一个take操作,否则不能继续添加元素
阻塞:put(e);
阻塞:take();
DelayQueue(缓存失效、定时任务)
支持获取元素的无界阻塞队列
ConcurrentLinkedQueue extends AbstractQueue implements Queue 线程安全
方法
添加:
offer(e);//add
获取:
poll();//获取并删除首节点
peek();//获取首节点
TransferQueue(接口)
LinkedTransferQueue (线程安全)
tryTransfer();// 如果存在一个消费者已经等待接收它,则立即传送指定的元素,否则返回false,并且不进入队列
transfer();// 如果存在一个消费者已经等待接收它,则立即传送指定的元素,否则等待直到元素被消费者接收
take();
Deque
ArrayyDeque:类似LinkedList
Map
Dictionary
HsahTable:线程安全,插入效率高,读取效率低
HashMap:非线程安全
ConcurrentMap:分段锁,线程安全,插入效率低,查询效率高
今天先到这里了,对文章感兴趣的童鞋关注下博主吧~~