List与Map整理

ArrayList
线程:不安全
实现方式:数组
初始大小:10
扩容:(原数组容量+原数组容量/2),如果(原数组容量+原数组容量/2)<传入的minCapacity,则扩容到minCapacity
数组最大值:Integer.MAX_VALUE - 8,由于有一些vms会在数组头存储一些字,为了防止内存溢出所以数组最大值为Max-8
fast-fail:迭代器实现了fast-fail截止,防止在迭代过程中修改集合导致并发问题,通过判断List中的mod修改次数,与迭代器初始化的mod修改次数做比较,如果不相同则抛出concurrentModificationException,迭代器类下remove与next方法会检查fast-fail快速失败错误
排序:原来使用归并排序方法,最新使用插入排序优化后的归并排序
 
CopyOnWriteArrayList
线程:安全,ReentrantLock,对数组进行修改时,把当前对象的数组拷贝一份newElements,先对newElements进行操作,操作完再复制给对象的数组,减少对查询类操作的锁定
实现方式:数组,数组使用volatile修饰,每次getArray方法都能获得最后一修改后的数组
初始化大小:0
扩容:添加元素时,都是通过Arrays.copyOf()方法新创建一个长度等于(当前长度+1)的新数组
迭代器:使用COWIterator内部类,遍历时直接访问CopyOnWriteArrayList的数组,可以实时获得数组的最新值
readObject方法:从一个流中反序列化集合时,会重新初始化锁,UNSAFE.putObjectVolatile(this, lockOffset, new ReentrantLock());
 
LinkedList
线程:不安全
实现方式:单向链表,定义了head与tail节点,
初始大小:0,初始化时head与tail都是Null
peek():查看head节点信息
poll():获得head信息,并且从链表中删除掉
offer(E e):添加到tail节点后
fast-fail:迭代器实现了fast-fail截止,防止在迭代过程中修改集合导致并发问题,通过判断List中的mod修改次数,与迭代器初始化的mod修改次数做比较,如果不相同则抛出concurrentModificationException,迭代器类下remove与next方法会检查fast-fail快速失败错误
1、定了first头节点(first.pre=null && first.item != null)、last尾节点(last.next=null && last.item != null)
2、clear()清空链表,设置first=last=null,每个节点值设置为null,每个节点next以及每个节点pre设置为null,
3、Node<E> node(int index)获得index位置的节点Node,技巧:先判断index是在size/2之前还是之后,减少一半的查询次数
 
Vector
线程:安全,通过synchronized实现
实现方式:数组
初始大小:10
扩容:如果capacityIncrement=0,原数组容量*2,否则新容量为原数组容量+capacityIncrement,然后通过Arrays.copyOf()新建数组复制给原有的数组引用
数组最大值:Integer.MAX_VALUE - 8,由于有一些vms会在数组头存储一些字,为了防止内存溢出所以数组最大值为Max-8
fast-fail:迭代器实现了fast-fail截止,防止在迭代过程中修改集合导致并发问题,通过判断List中的mod修改次数,与迭代器初始化的mod修改次数做比较,如果不相同则抛出concurrentModificationException,迭代器类下remove与next方法会检查fast-fail快速失败错误
 
 
Stack
线程:安全,通过synchronized实现
实现方式:数组,通过继承Vector实现主要功能
初始大小:10
peek():查看栈顶信息(不删除)
 
 
HashMap
线程:不安全
实现方式:JDK1.8开始,链地址法(数组+单向链表),如果单向链表数量大于阈值8,则使用红黑树方式保存(红黑树优点是查询效率高,O(NlogN));如果单向链表数量小于8则使用链表保存。
初始大小:16
扩容:原数组长度*2
 
 
Hashtable
key、value不能为空
线程:安全,通过synchronized实现
实现方式:链地址法(数组+单向链表)
初始大小:11
 
TreeMap
线程:安全,通过synchronized实现
实现方式:红黑树
 
ConcurrentHashMap
线程:安全,通过compareAndSwapObject+synchronized方式,自旋+synchronized方式保证线程安全。
实现方式:链地址法(数组+单向链表),数组使用volatile修饰(volatile Node<K,V>[] table),数组大小为2的倍数,如果单向链表数量大于阈值8,则使用红黑树方式保存(红黑树优点是查询效率高,O(NlogN));如果单向链表数量小于8则使用链表保存。
初始大小:16
迭代器:直接访问数组
 
HashSet
线程:不安全
实现方式:使用HashMap实现的
初始大小:16
扩容:原数组长度*2
 
收藏文章数量从多到少与“把书读薄”是一个道理
原文地址:https://www.cnblogs.com/use-D/p/9717668.html