一、分类
Java集合大致分为 List、Set、Map 、Queue四种,
List代表有序、重复的集合;
Set代表无序、不可重复的集合;
Map则代表具有映射关系的集合
Queue Java5增加,代表一种队列的集合
二、List - 有序 | 重复
常见的list有ArrayList、LinkedList、CopyOnWriteArrayList、Vector等
- ArrayList 数据结构数组,查询时间O(1) 插入O(n)
- LinkedList 数据结构双链表,实现Deque(双向队列),查询时间O(n) 查询时间O(1)
- CopyOnWriteArrayList 线程安全的list, 采用“读写锁” 思想。允许多个线程以非同步的方式读,当有线程写时它会将整个List复制一个副本给它(写在副本),适合读多写少这种场景。
- Vector synchronized实现的线程安全
三、Set - 无序、不可重复
常见的Set有HashSet、TreeSet、LInkedHashSet、CopyOnWriteHashSet等
- HashSet 内部是HashMap Value是固定的Object。因此数据结构可以当成是数组+链表。能存空,查询O(1) 插入O(n)
- TreeSet TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。常用于需要对值排序的场景,支持两种排序方式,自然排序(默认升序)和定制排序(CompareTo 返回0:相等 正数: 大于 负数:小于)
- LInkedHashSet 内部是LInkedHashMap ,LinkedHashSet会维护“插入顺序
四、Map
常见的Map有HashMap、LinkedHashMap、TreeMap、HashTable、CurrentHashMap(没有CopyOnWriteMap实现)等
- HashMap 内部数组+链表 ,查询时间O(1) 插入O(n),可存重复值(元素可以为null) 线程不安全,无序
- LinkedHashMap 双向链表+HashMap 内部通过双向链表管理了 插入顺序和访问顺序(内存缓存中用的较多)。accessOrder设置:false 插入顺序(默认),为true:访问顺序。
- TreeMap 底层采用红黑树的实现 ,查询和插入都是O(logN) ,同TreeSet一样 用在需要对值排序的场景
- HashTable synchronized实现的线程安全
- CurrentHashMap 内部是一个Segment数组,每个Segment结构与HashMap类似。采用“分段锁” 思想,Segment线程安全用的是可重入锁ReentrantLock。(get、clear函数是弱一致)
五、QUEUE
分为阻塞队列和非阻塞队列。
1、非阻塞队列 - 线程不会阻塞,通过CAS尝试
LinkedList : 实现了Deque接口(双向),支持队列、尾插入元素,Deque只有2个实现类(LinkedList、LinkedBlockingDeque)
PriorityQueue : 优先队列,本质维护一个有序列表。可自然排序亦可传递comparator构造函数实现自定义排序。
ConcurrentLinkedQueue:基于链表线程安全的队列。增加删除O(1) 查找O(n)
2、阻塞队列 - 线程阻塞,等待唤醒。(生产消费者模式)
- LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。 (1.7)
- LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。 (1.7)
3、常见方法
参考:https://blog.csdn.net/u012240455/article/details/81844055
六、Collection接口和Collections工具类.
1.java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。List、Set、Vector都继承了他。
2.Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索、线程安全等各种操作。
- 排序
void reverse(List list):反转
void shuffle(List list),随机排序
void sort(List list),按自然排序的升序排序
void sort(List list, Comparator c);定制排序,由Comparator控制排序逻辑
void swap(List list, int i , int j),交换两个索引位置的元素
void rotate(List list, int distance),旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面。
- 查找,替换操作
int binarySearch(List list, Object key), 对List进行二分查找,返回索引,注意List必须是有序的
int max(Collection coll),根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll)
int max(Collection coll, Comparator c),根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)
void fill(List list, Object obj),用元素obj填充list中所有元素
int frequency(Collection c, Object o),统计元素出现次数
int indexOfSubList(List list, List target), 统计targe在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target).
boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替换旧元素。
- 同步控制
Collections.SynchronizedList()
Collections.SynchronizedSet()
Collections.synchronizedMap()
备注:
2个数组求全集可以转成hashSet 交集可以用Collections的retainAll 差集可以用Collection的removeAll方法
参考:https://www.cnblogs.com/a2b1/p/7520099.html
七、原理
HashMap原理
https://blog.csdn.net/visant/article/details/80045154
https://www.jianshu.com/p/8b372f3a195d/
LinkedHahMap原理:https://www.jianshu.com/p/8f4f58b4b8ab
CurrentHashMap原理 https://blog.csdn.net/qq_38490078/article/details/79541270
八、其它
HashMap和HashTab的区别https://blog.csdn.net/mynameishuangshuai/article/details/52748731
TreeSet和TreeMaphttps://www.cnblogs.com/pony1223/p/7907173.html
集合框架面试题目https://blog.csdn.net/xiamiflying/article/details/73050577
参考:
https://www.jianshu.com/p/589d58033841
https://blog.csdn.net/world_snow/article/details/79073234