目录标题
优秀文档
digitalocean Collections
baeldung Collections
码神爆肝数据结构——总长5w字,附带例题
[Q&A] 为什么要使用集合?
数组声明之后, 长度不可变,数据类型也不可变。存储特点为 有序可重复,特点单一。
集合可以 存储不同类型,不同数量的对象。
[Q&A] 什么是无序性?
无序性是指存储的数据在底层数组中并非按照 数组索引的顺序添加,而是根据 数据的哈希值决定的。
[Q&A] 什么是不可重复性?
不可重复性是指添加的元素时,不仅仅equals
还要hashCode
同时相等才相等。
Collection接口架构图
Collection | Key-Value | Ordering | Duplicate Elements | Random Access | Null Element | Thread Safety |
---|---|---|---|---|---|---|
键值对 | 有序 | 可重复 | 随机读取 | 允许存null | 线程安全 | |
ArrayList | ❌ | ✅ | ✅ | ✅ | ✅ | ❌ |
Vector | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
LinkedList | ❌ | ✅ | ✅ | ❌ | ✅ | ❌ |
Stack | ❌ | ✅ | ✅ | ❌ | ✅ | ✅ |
CopyOnWriteArrayList | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ |
HashSet | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ |
LinkedHashSet | ❌ | ❌ | ✅ | ❌ | ||
TreeSet | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
CopyOnWriteArraySet | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
ConcurrentSkipListSet | ❌ | ❌ | ✅ | |||
HashMap | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ |
LinkedHashMap | ✅ | ❌ | ||||
TreeMap | ✅ | ✅ | ❌ | ✅ | ❌ | ❌ |
ConcurrentHashMap | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ |
Hashtable | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ |
Properties | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ |
[Q&A] 如何选用集合?
如果你知道是Set,但是不知道是哪个Set,就用HashSet。
如果你知道是List,但是不知道是哪个List,就用ArrayList。
如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。
key-value形式的数据结构时,选Map
特点:key不重复, value随意
HashMap key无序 数组+链表/红黑树 k,v均可为null
HashTable key无序 数组+链表 k,v均不可为null 线程安全
LinkedHashMap key FIFO 数组+链表/红黑树+双向链表
TreeMap Key自定义排序,默认升序 红黑树
ConcurrentHashMap 相当于线程安全的HashMap 数组+链表/红黑二叉树
ConcurrentSkipListMap 相当于线程安全的TreeMap
保证元素唯一时,选Set
特点:不重复
HashSet 无序 基于HashMap的Key实现
LinkedHashSet 有序 FIFO 基于LinkedHashMap实现
TreeSet 自定义排序,默认升序 基于TreeMap红黑树
CopyOnWriteArraySet 相当于线程安全的HashSet 高并发类
ConcurrentSkipListSet 相当于线程安全的TreeSet 高并发类
不需要保证元素唯一时,就选List
特点:有序可重复
ArrayList FIFO 更适合遍历 底层使用 Object[]存储
Vector FIFO 更适合遍历 底层使用 Object[]存储 线程安全
LinkedList FIFO 更适合插入删除 双向链表
Stack LIFO
CopyOnWriteArrayList 相当于线程安全的ArrayList
Map
⭐️ Java初始化map
的几种方式
⭐️ Java创建空map
的几种方法
⭐️ Java创建不可变map
的几种方法
⭐️ Java如何删除
map中的元素
⭐️ Java HashMap
/LinkedHashMap
/TreeMap
/HashTable
原理解析
⭐️ HashTable
、HashMap
区别
⭐️ 如何创建线程安全
的Map
⭐️ Collections.synchronizedMap
和ConcurrentHashMap
区别
⭐️ Java中HashMap
常用方法
1・key相同时,value覆盖
原来的而不是拒绝存入和set相反。
⭐️ Java中EnumMap
常用方法
⭐️ Java中LinkedHashMap
常用方法
List
⭐️ Java中ArrayList常用方法
1・存取元素时间复杂度为O(1)
2・增删元素时间复杂度为O(n)
3・查询元素时间复杂度为O(log n)
(已排序的),O(n)
(未排序的)
Further Reading :时间复杂度函数图像
⭐️ Arrays.asList()
和 new ArrayList()
区别
⭐️ Arrays.asList()
和 List.of()
区别
⭐️ java中删除
list元素的几种方法
⭐️ Java 中 List 集合取交集 我有你也有
⭐️ Java 中 List 集合取并集 你我都有啥
⭐️ Java 中 List 集合取差集 我有你没有
⭐️ Java 中 List 集合取补集 除了我你还有啥
Set
HashSet
LinkedHashSet
⭐️TreeSet
1・HashSet插入数据最快
,其次LinkHashSet,最慢的是TreeSet因为内部实现排序。
2・HashSet无序
,LinkHashSet保证FIFO
,TreeSet内部实现排序
,也可以自定义排序。
3・HashSet和LinkHashSet允许存null
,TreeSet插入null会报NullPointerException。
4・三者都非线程安全
,如果要使用线程安全可以Collections.synchronizedSet()
。
Deque
Stack
Queue
⭐️ Queue常用方法
⭐️优先队列PriorityQueue
介绍
⭐️Java中的阻塞队列
遍历
⭐️ Java 数组 双指针遍历场景
⭐️ Java List的7种遍历及性能对比
⭐️ Java Set的6种遍历及性能对比
⭐️ Java Map的18种遍历及性能对比
⭐️ Java Properties的4种遍历方式