还搞不懂集合?一张图带你吃透 ArrayList、HashMap、ConcurrentHashMap 的底层原理(附7张流程图)
还搞不懂集合?一张图带你吃透 ArrayList、HashMap、ConcurrentHashMap 的底层原理(附7张流程图)
目录
- 一、集合框架概览
- 二、List 集合
- 2.1 ArrayList
- 2.2 LinkedList
- 2.3 ArrayList 与 LinkedList 对比
- 三、Set 集合
- 3.1 HashSet
- 3.2 TreeSet
- 3.3 LinkedHashSet
- 四、Map 集合
- 4.1 HashMap 的底层原理
- 4.2 TreeMap
- 4.3 LinkedHashMap
- 五、线程安全的集合
- 六、遍历集合的方式对比
- 七、实际应用场景与选型总结
一、集合框架概览
集合框架是 Java 里最常用的东西,说白了就是用来存数据、取数据的一套工具。
Java 集合主要分为两大接口:
- Collection:存储单个元素
- List:有序可重复 — ArrayList、LinkedList
- Set:无序不可重复 — HashSet、TreeSet、LinkedHashSet
- Map:存储键值对 — HashMap、TreeMap、LinkedHashMap、Hashtable
// 集合框架的继承关系(简化版)Collection├──List(有序,可重复) │ ├──ArrayList—— 数组,查快 │ └──LinkedList—— 链表,插删快 │ ├──Set(无序,不可重复) │ ├──HashSet—— 哈希表,最快 │ ├──TreeSet—— 红黑树,自动排序 │ └──LinkedHashSet—— 链表+哈希,按插入顺序Map(键值对) ├──HashMap—— 数组+链表+红黑树(重要) ├──TreeMap—— 红黑树,Key自动排序 ├──LinkedHashMap—— 链表+哈希,按插入顺序 └──Hashtable—— 线程安全,但基本被淘汰了注:上面这些类的底层实现,面试基本都会问。
整体关系图:
二、List 集合
List 的特点:有序、可重复,通过索引操作元素。
2.1 ArrayList
底层是Object[] 数组。
特点:查快(O(1)),插删慢(要搬数据)。
List<String>list=newArrayList<>();list.add("hello");list.add("world");list.add(1,"java");// 指定位置插入,后面的元素往后挪list.remove("hello");// 按元素删list.remove(0);// 按索引删System.out.println(list.get(0));// 通过索引取值扩容机制:
ArrayList 底层数组默认容量是10(JDK 8)。满了之后会自动扩容——每次扩成原来的1.5 倍。
// 源码简化版(ArrayList.grow)intnewCapacity=oldCapacity+(oldCapacity>>1);// oldCapacity * 1.5如果你知道大概要存多少数据,创建 ArrayList 的时候直接指定初始容量,避免频繁扩容。(
new ArrayList<>(1000))
ArrayList 扩容流程图:
