Java集合学习笔记
ArrayList
- 数据结构为Array数组;
- 通过索引下标实现了随机取值效率高;
- 增删效率低,因为增加或删除需要移动数组中的元素;
Vector
- 数据结构同于ArrayList
- 底层比ArrayList多一个Synchronized锁;
CopyOnWriteArrayList
- 数据结构与ArrayList相同,数组Array
- 写时加锁复制:ReetrantLock保证线程安全,修改数组之前拷贝一份,操作新数组,并赋值给Array,旧数组丢弃;
- 读取操作无锁,读取的是旧数组,写不会阻塞读,读写分离
- 弱一致性:写操作会生成新的数组,读的数据就可能被修改,迭代器也是弱一致性,读的是快照;
LinkedList
- 数据结构: 链表,维护一个内部类Node,元素以Node节点的Item属性存在,同时维护next和prev记录前驱后继的指针;
- 双端队列,实现了Deque接口,支持首部和尾部存取元素;
ArrayBlockingQueue数组阻塞队列
- 静态数组,容量固定必须指定长度,没有扩容机制,没有元素的下标位置null占位;
- 锁:ReentrantLock,读取使用同一把锁,操作的是同一个数组对象;
- 阻塞:
notEmpty 出队: 队列count为0,无元素可取时,阻塞在该对象上;
notFull 入队: 队列count为数组length,放不进元素时,阻塞在该队列上; - 入队 从队列首部开始添加元素,记录putIndex(到队尾时位置为0)唤醒notEmpty;
- 出队 从队列首部取元素,记录takeIndex 唤醒notFull;
- 先进先出,读写互相排斥;
LinkedBlockingQueue
- 数据结构: 链表Node 容量可选,默认为Integer.MAX_VALUE,内部类Node存储元素;
- 锁分离: 存取胡不排斥,操作是不同的Node对象;
takeLock 取Node节点保证前驱后继不会乱;
putLock 存Node节点保证前驱后继不会乱; - 阻塞同ArrayBlockingQueue
- 入队: 队尾入队 记录last节点
- 出队: 队首出队 记录head节点
- 删除元素时两把锁一起加
- 先进先出
HashMap
- JDK1.7 HashMap
数据结构 数组+链表
存储下标 = hashcode % length - JDK1.8 HashMap
数据结构 数组+单向链表+红黑树
红黑树: 当链表高度达到8,数组长度达到64时采用红黑树;
ConcurrentHashMap
- JDK1.7
数据结构 Segement extend ReentrantLock + HashEntry(Node)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 九世!
评论