|
50 | 50 |
|
51 | 51 | ### 1.1.1. Java 集合概览
|
52 | 52 |
|
53 |
| -从下图可以看出,在 Java 中除了以 `Map` 结尾的类之外, 其他类都实现了 `Collection` 接口。 |
| 53 | +Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是 `Collecton`接口,主要用于存放单一元素;另一个是 `Map` 接口,主要用于存放键值对。对于`Collection` 接口,下面又有三个主要的子接口:`List`、`Set` 和 `Queue`。 |
54 | 54 |
|
55 |
| -并且,以 `Map` 结尾的类都实现了 `Map` 接口。 |
| 55 | +Java 集合框架如下图所示: |
56 | 56 |
|
57 |
| - |
| 57 | + |
58 | 58 |
|
59 |
| -<p style="text-align:center;font-size:13px;color:gray">https://www.javatpoint.com/collections-in-java</p> |
60 | 59 |
|
61 |
| -### 1.1.2. 说说 List,Set,Map 三者的区别? |
| 60 | +注:图中只列举了主要的继承派生关系,并没有列举所有关系。比方省略了`AbstractList`, `NavigableSet`等抽象类以及其他的一些辅助类,如想深入了解,可自行查看源码。 |
62 | 61 |
|
63 |
| -- `List`(对付顺序的好帮手): 存储的元素是有序的、可重复的。 |
| 62 | +### 1.1.2. 说说 List, Set, Queue, Map 四者的区别? |
| 63 | + |
| 64 | +- `List`(对付顺序的好帮手): 存储的元素是有序的、可重复的。 |
64 | 65 | - `Set`(注重独一无二的性质): 存储的元素是无序的、不可重复的。
|
65 |
| -- `Map`(用 Key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),“x”代表 key,"y"代表 value,Key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。 |
| 66 | +- `Queue`(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。 |
| 67 | +- `Map`(用 key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),"x" 代表 key,"y" 代表 value,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。 |
66 | 68 |
|
67 | 69 | ### 1.1.3. 集合框架底层数据结构总结
|
68 | 70 |
|
69 | 71 | 先来看一下 `Collection` 接口下面的集合。
|
70 | 72 |
|
71 | 73 | #### 1.1.3.1. List
|
72 | 74 |
|
73 |
| -- `Arraylist`: `Object[]`数组 |
74 |
| -- `Vector`:`Object[]`数组 |
| 75 | +- `Arraylist`: `Object[]` 数组 |
| 76 | +- `Vector`:`Object[]` 数组 |
75 | 77 | - `LinkedList`: 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
|
76 | 78 |
|
77 | 79 | #### 1.1.3.2. Set
|
78 | 80 |
|
79 |
| -- `HashSet`(无序,唯一): 基于 `HashMap` 实现的,底层采用 `HashMap` 来保存元素 |
80 |
| -- `LinkedHashSet`:`LinkedHashSet` 是 `HashSet` 的子类,并且其内部是通过 `LinkedHashMap` 来实现的。有点类似于我们之前说的 `LinkedHashMap` 其内部是基于 `HashMap` 实现一样,不过还是有一点点区别的 |
81 |
| -- `TreeSet`(有序,唯一): 红黑树(自平衡的排序二叉树) |
| 81 | +- `HashSet`(无序,唯一): 基于 `HashMap` 实现的,底层采用 `HashMap` 来保存元素 |
| 82 | +- `LinkedHashSet`: `LinkedHashSet` 是 `HashSet` 的子类,并且其内部是通过 `LinkedHashMap` 来实现的。有点类似于我们之前说的 `LinkedHashMap` 其内部是基于 `HashMap` 实现一样,不过还是有一点点区别的 |
| 83 | +- `TreeSet`(有序,唯一): 红黑树(自平衡的排序二叉树) |
| 84 | + |
| 85 | +#### 1.1.3.3 Queue |
| 86 | +- `PriorityQueue`: `Object[]` 数组来实现二叉堆 |
| 87 | +- `ArrayQueue`: `Object[]` 数组 + 双指针 |
82 | 88 |
|
83 | 89 | 再来看看 `Map` 接口下面的集合。
|
84 | 90 |
|
85 |
| -#### 1.1.3.3. Map |
| 91 | +#### 1.1.3.4. Map |
86 | 92 |
|
87 | 93 | - `HashMap`: JDK1.8 之前 `HashMap` 由数组+链表组成的,数组是 `HashMap` 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间
|
88 | 94 | - `LinkedHashMap`: `LinkedHashMap` 继承自 `HashMap`,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,`LinkedHashMap` 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。详细可以查看:[《LinkedHashMap 源码详细分析(JDK1.8)》](https://www.imooc.com/article/22931)
|
|
0 commit comments