一、集合类型
(1)集合
List Queue Set Map
List Queue Set 实现Collection接口
(2)Collections工具类
reverse(List list):反转
shuffle(List list),随机排序
sort(List list, Comparator c);定制排序,由Comparator控制排序逻辑
swap(List list, int i , int j),交换两个索引位置的元素
rotate((List list, int distance),旋转
binarySearch(List list, Object key), 对List进行二分查找,返回索引,注意List必须是有序的
max(Collection coll, Comparator c),根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)
fill(List list, Object obj),用元素obj填充list中所有元素
frequency(Collection c, Object o),统计元素出现次数
indexOfSubList(List list, List target), 统计targe在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target).
boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替换旧元素
emptyXXX(),返回一个空的只读集合(这不知用意何在?)
singleXXX(),返回一个只包含指定对象,只有一个元素,只读的集合。
unmodifiablleXXX(),返回指定集合对象的只读视图。
synchronizedXXX()等方法,来将集合包装成线程安全的集合
二、List
List | 存储方式 | 初始容量 | 容量增长 | 同步方式 |
---|---|---|---|---|
ArrayList | 数组 | 空数组,10 | oldSize + oldSize/2 | |
Vector | 数组 | 10,增量为0 | oldSize + oldSize | synchronized |
LinkedList | jdk6带头结点的双向循环链表 jdk7不带头结点的双向链表,增加两个节点指针first、last指向首尾节点 | |||
CopyOnWriteArrayList | 数组 | 0 | ReentrantLock |
三、Queue
(1)offer,add 区别:
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。
这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。
(2)poll,remove 区别:
remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
(3)peek,element区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。
Queue | 存储方式 | 初始容量 | 容量增长 | 同步方式 |
---|---|---|---|---|
PriorityQueue | 数组,comparator | 11 | oldCapacity + ((oldCapacity < 64) ? (oldCapacity + 2) : (oldCapacity >> 1)) | |
ConcurrentLinkedQueue | 链表 | CAS | ||
DelayQueue | PriorityQueue | ReentrantLock Condition | ||
ArrayBlockingQueue | 数组,是否fair | ReentrantLock、Empty和Full Condition | ||
LinkedBlockingQueue | 链表 | take和put ReentrantLock、Empty和Full Condition | ||
LinkedTransferQueue | 链表 | LockSupport | ||
PriorityBlockingQueue | 数组 | oldCap + ((oldCap < 64) ? (oldCap + 2) : (oldCap >> 1)) | ReentrantLock、Condition | |
SynchronousQueue | TransferQueue,TransferStack,是否fair | CAS |
Deque继承Queue
Deque | 存储方式 | 初始容量 | 容量增长 | 同步方式 |
---|---|---|---|---|
LinkedList | 链表 | |||
ArrayDeque | 数组 | 8 | n << 1 | |
ConcurrentLinkedDeque | 链表 | CAS | ||
LinkedBlockingDeque | 链表 | Integer.MAX_VALUE | ReentrantLock、Empty和Full Condition |
四、Map
Map | 存储方式 | 初始容量 | 容量增长 | 同步方式 | 特性 |
---|---|---|---|---|---|
HashMap | jdk7 entry数组 + 链表 jdk8 Node数组 + 链表/红黑树 | 16 | table.size*2 | key、value可空 | |
Hashtable | 数组 | 11 | table.size*2 + 1 | synchronized | key、value不可空 |
LinkedHashMap | 链表 | 记录添加顺序 | |||
TreeMap | 红黑树,comparator | 默认key不可空,排序 | |||
EnumMap | key数组 value数组 enum.ordinal下标 | key不可空 value为空使用NULLObject填充 | |||
ConcurrentHashMap | JDK7:Segment数组 + HashEntry数组 + 链表 JDK8:Node数组 + 链表 + 红黑树 | 分段锁 ReentranLock、 synchronized和CAS | key、value不可空 | ||
ConcurrentSkipListMap | 跳跃链表 | key、value不可空 |
五、Set
Set | 存储方式 |
---|---|
HashSet | HashMap |
LinkedHashSet | LinkedHashMap |
TreeSet | TreeMap |
ConcurrentSkipListSet | ConcurrentSkipListMap |
CopyOnWriteArraySet | CopyOnWriteArrayList |
六、常见题目
(1)说说List,Set,Map三者的区别
(2)Arraylist 与 LinkedList 区别
RandomAccess接口、双向链表和双向循环链表
(3)ArrayList 与 Vector 区别呢?为什么要用Arraylist取代Vector呢
(4)说一说 ArrayList 的扩容机制吧
(5)HashMap 和 Hashtable 的区别
(6)HashMap 和 HashSet区别
(7)HashSet如何检查重复
(8)HashMap的底层实现
JDK1.8之前
JDK1.8之后
(9)HashMap 的长度为什么是2的幂次方
(10)HashMap 多线程操作导致死循环问题
(11)ConcurrentHashMap 和 Hashtable 的区别
(12)ConcurrentHashMap线程安全的具体实现方式/底层具体实现
JDK1.7、JDK1.8
(13)comparable 和 Comparator的区别
Comparator定制排序、重写compareTo方法实现排序
(14)集合框架底层数据结构总结
Collection
1. List
2. Set
Map