From 4ad22b21c2d4e2bd485f89a047bde9c1d6e772f2 Mon Sep 17 00:00:00 2001 From: kaka2634 <996529090@qq.com> Date: Sat, 14 Aug 2021 01:17:45 +0800 Subject: [PATCH 1/4] =?UTF-8?q?Update=20Java=E9=9B=86=E5=90=88=E6=A1=86?= =?UTF-8?q?=E6=9E=B6=E5=B8=B8=E8=A7=81=E9=9D=A2=E8=AF=95=E9=A2=98.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java集合框架常见面试题.md | 32 +++++++++++------- .../images/java-collection-hierarchy.png | Bin 0 -> 90889 bytes 2 files changed, 19 insertions(+), 13 deletions(-) create mode 100644 docs/java/collection/images/java-collection-hierarchy.png diff --git a/docs/java/collection/Java集合框架常见面试题.md b/docs/java/collection/Java集合框架常见面试题.md index 5c0c5b38..e604f819 100644 --- a/docs/java/collection/Java集合框架常见面试题.md +++ b/docs/java/collection/Java集合框架常见面试题.md @@ -50,19 +50,21 @@ ### 1.1.1. Java 集合概览 -从下图可以看出,在 Java 中除了以 `Map` 结尾的类之外, 其他类都实现了 `Collection` 接口。 +Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是 `Collecton`接口,主要用于存放单一元素;另一个是 `Map` 接口,主要用于存放键值对。对于`Collection` 接口,下面又有三个主要的子接口:`List`、`Set` 和 `Queue`。 -并且,以 `Map` 结尾的类都实现了 `Map` 接口。 +Java 集合框架如下图所示: -![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/source-code/dubbo/java-collection-hierarchy.png) +![](./images/java-collection-hierarchy.png) -

https://www.javatpoint.com/collections-in-java

-### 1.1.2. 说说 List,Set,Map 三者的区别? +注:图中只列举了主要的继承派生关系,并没有列举所有关系。比方省略了`AbstractList`, `NavigableSet`等抽象类以及其他的一些辅助类,如想深入了解,可自行查看源码。 -- `List`(对付顺序的好帮手): 存储的元素是有序的、可重复的。 +### 1.1.2. 说说 List, Set, Queue, Map 四者的区别? + +- `List`(对付顺序的好帮手): 存储的元素是有序的、可重复的。 - `Set`(注重独一无二的性质): 存储的元素是无序的、不可重复的。 -- `Map`(用 Key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),“x”代表 key,"y"代表 value,Key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。 +- `Queue`(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。 +- `Map`(用 key 来搜索的专家): 使用键值对(key-value)存储,类似于数学上的函数 y=f(x),"x" 代表 key,"y" 代表 value,key 是无序的、不可重复的,value 是无序的、可重复的,每个键最多映射到一个值。 ### 1.1.3. 集合框架底层数据结构总结 @@ -70,19 +72,23 @@ #### 1.1.3.1. List -- `Arraylist`: `Object[]`数组 -- `Vector`:`Object[]`数组 +- `Arraylist`: `Object[]` 数组 +- `Vector`:`Object[]` 数组 - `LinkedList`: 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环) #### 1.1.3.2. Set -- `HashSet`(无序,唯一): 基于 `HashMap` 实现的,底层采用 `HashMap` 来保存元素 -- `LinkedHashSet`:`LinkedHashSet` 是 `HashSet` 的子类,并且其内部是通过 `LinkedHashMap` 来实现的。有点类似于我们之前说的 `LinkedHashMap` 其内部是基于 `HashMap` 实现一样,不过还是有一点点区别的 -- `TreeSet`(有序,唯一): 红黑树(自平衡的排序二叉树) +- `HashSet`(无序,唯一): 基于 `HashMap` 实现的,底层采用 `HashMap` 来保存元素 +- `LinkedHashSet`: `LinkedHashSet` 是 `HashSet` 的子类,并且其内部是通过 `LinkedHashMap` 来实现的。有点类似于我们之前说的 `LinkedHashMap` 其内部是基于 `HashMap` 实现一样,不过还是有一点点区别的 +- `TreeSet`(有序,唯一): 红黑树(自平衡的排序二叉树) + +#### 1.1.3.3 Queue +- `PriorityQueue`: `Object[]` 数组来实现二叉堆 +- `ArrayQueue`: `Object[]` 数组 + 双指针 再来看看 `Map` 接口下面的集合。 -#### 1.1.3.3. Map +#### 1.1.3.4. Map - `HashMap`: JDK1.8 之前 `HashMap` 由数组+链表组成的,数组是 `HashMap` 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间 - `LinkedHashMap`: `LinkedHashMap` 继承自 `HashMap`,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,`LinkedHashMap` 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。详细可以查看:[《LinkedHashMap 源码详细分析(JDK1.8)》](https://www.imooc.com/article/22931) diff --git a/docs/java/collection/images/java-collection-hierarchy.png b/docs/java/collection/images/java-collection-hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..78daf9808454703816958d3e2ce52875612c7345 GIT binary patch literal 90889 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 literal 0 HcmV?d00001 From cfa58e4f68412ea48feef6bb3993fea00234e2b4 Mon Sep 17 00:00:00 2001 From: kaka2634 <996529090@qq.com> Date: Sat, 14 Aug 2021 17:53:39 +0800 Subject: [PATCH 2/4] =?UTF-8?q?Update=20Java=E9=9B=86=E5=90=88=E6=A1=86?= =?UTF-8?q?=E6=9E=B6=E5=B8=B8=E8=A7=81=E9=9D=A2=E8=AF=95=E9=A2=98.md=20-?= =?UTF-8?q?=20add=20chapter=20Queue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java集合框架常见面试题.md | 95 +++++++++++++++---- 1 file changed, 76 insertions(+), 19 deletions(-) diff --git a/docs/java/collection/Java集合框架常见面试题.md b/docs/java/collection/Java集合框架常见面试题.md index e604f819..c960924e 100644 --- a/docs/java/collection/Java集合框架常见面试题.md +++ b/docs/java/collection/Java集合框架常见面试题.md @@ -310,9 +310,66 @@ Output: `TreeSet` 底层使用红黑树,能够按照添加元素的顺序进行遍历,排序的方式有自然排序和定制排序。 -## 1.4. Map 接口 +## 1.4 Collection 子接口之 Queue -### 1.4.1. HashMap 和 Hashtable 的区别 +### 1.4.1 Queue 与 Deque 的区别 + +`Queue` 是单端队列,只能从一端插入元素,另一端删除元素,实现上一般遵循 **先进先出(FIFO)** 规则。 + +`Queue` 扩展了 `Collection` 的接口,根据 **因为容量问题而导致操作失败后处理方式的不同** 可以分为两类方法: 一种在操作失败后会抛出异常,另一种则会返回特殊值。 + +| `Queue` 接口| 抛出异常 | 返回特殊值 | +| ------------ | --------- | ---------- | +| 插入队尾 | add(E e) | offer(E e) | +| 删除队首 | remove() | poll() | +| 查询队首元素 | element() | peek() | + +`Deque` 是双端队列,在队列的两端均可以插入或删除元素。 + +`Deque` 扩展了 `Queue` 的接口, 增加了在队首和队尾进行插入和删除的方法,同样根据失败后处理方式的不同分为两类: + +| `Deque`接口 | 抛出异常 | 返回特殊值 | +| ------------ | ------------- | --------------- | +| 插入队首 | addFirst(E e) | offerFirst(E e) | +| 插入队尾 | addLast(E e) | offerLast(E e) | +| 删除队首 | removeFirst() | pollFirst() | +| 删除队尾 | removeLast() | pollLast() | +| 查询队首元素 | getFirst() | peekFirst() | +| 查询队尾元素 | getLast() | peekLast() | + +事实上,`Deque` 还提供有 `push()` 和 `pop()` 等其他方法,用于模拟栈。 + + +### 1.4.2 ArrayDeque 与 LinkedList 的区别 + +`ArrayDeque` 和 `LinkedList` 都实现了`Deque`接口,两者都具有队列的功能,但两者有什么区别呢? + +- `ArrayDeque` 是基于可变长的数组和双指针来实现,而 `LinkedList` 则通过链表来实现。 + +- `ArrayDeque` 不支持存储 `NULL` 数据,但 `LinkedList` 支持。 + +- `ArrayDeque` 是在 JDK1.6 才被引入的,而`LinkedList` 早在 JDK1.2 时就已经存在。 + +- `ArrayDeque` 插入时可能存在扩容过程, 不过均摊后的插入操作依然为 O(1)。虽然 `LinkedList` 不需要扩容,但是每次插入数据时均需要申请新的堆空间,均摊性能相比更慢。 + +从性能的角度上,选用 `ArrayDeque` 去实现队列要比 `LinkedList` 更好。此外,`ArrayDeque` 也可以用于实现栈。 + +### 1.4.3 说一说 PriorityQueue + +`PriorityQueue` 是在 JDK1.5 中被引入的, 其与 `Queue` 的区别在于元素出队顺序是与优先级相关的,即总是优先级最高的元素先出队。 + +这里列举其相关的一些要点: + +- `PriorityQueue` 利用了二叉堆的数据结构来实现的,底层使用可变长的数组来存储数据 +- `PriorityQueue` 通过堆元素的上浮和下沉,实现了在 O(logn) 的时间复杂度内插入元素和删除堆顶元素。 +- `PriorityQueue` 是非线程安全的,且不支持存储 `NULL` 和 `non-comparable` 的对象。 +- `PriorityQueue` 默认是小顶堆,可以接收一个`Comparator`作为构造参数来比较队列中元素的优先级。 + +`PriorityQueue` 在面试中可能更多的会出现在手撕算法的时候,典型例题包括堆排序、求第K大的数、带权图的遍历等,所以需要学会熟练使用才行。 + +## 1.5. Map 接口 + +### 1.5.1. HashMap 和 Hashtable 的区别 1. **线程是否安全:** `HashMap` 是非线程安全的,`HashTable` 是线程安全的,因为 `HashTable` 内部的方法基本都经过`synchronized` 修饰。(如果你要保证线程安全的话就使用 `ConcurrentHashMap` 吧!); 2. **效率:** 因为线程安全的问题,`HashMap` 要比 `HashTable` 效率高一点。另外,`HashTable` 基本被淘汰,不要在代码中使用它; @@ -357,7 +414,7 @@ Output: } ``` -### 1.4.2. HashMap 和 HashSet 区别 +### 1.5.2. HashMap 和 HashSet 区别 如果你看过 `HashSet` 源码的话就应该知道:`HashSet` 底层就是基于 `HashMap` 实现的。(`HashSet` 的源码非常非常少,因为除了 `clone()`、`writeObject()`、`readObject()`是 `HashSet` 自己不得不实现之外,其他方法都是直接调用 `HashMap` 中的方法。 @@ -368,7 +425,7 @@ Output: | 调用 `put()`向 map 中添加元素 | 调用 `add()`方法向 `Set` 中添加元素 | | `HashMap` 使用键(Key)计算 `hashcode` | `HashSet` 使用成员对象来计算 `hashcode` 值,对于两个对象来说 `hashcode` 可能相同,所以`equals()`方法用来判断对象的相等性 | -### 1.4.3. HashMap 和 TreeMap 区别 +### 1.5.3. HashMap 和 TreeMap 区别 `TreeMap` 和`HashMap` 都继承自`AbstractMap` ,但是需要注意的是`TreeMap`它还实现了`NavigableMap`接口和`SortedMap` 接口。 @@ -436,7 +493,7 @@ TreeMap treeMap = new TreeMap<>((person1, person2) -> { **综上,相比于`HashMap`来说 `TreeMap` 主要多了对集合中的元素根据键排序的能力以及对集合内元素的搜索的能力。** -### 1.4.4. HashSet 如何检查重复 +### 1.5.4. HashSet 如何检查重复 以下内容摘自我的 Java 启蒙书《Head first java》第二版: @@ -479,9 +536,9 @@ final V putVal(int hash, K key, V value, boolean onlyIfAbsent, 对于引用类型(包括包装类型)来说,equals 如果没有被重写,对比它们的地址是否相等;如果 equals()方法被重写(例如 String),则比较的是地址里的内容。 -### 1.4.5. HashMap 的底层实现 +### 1.5.5. HashMap 的底层实现 -#### 1.4.5.1. JDK1.8 之前 +#### 1.5.5.1. JDK1.8 之前 JDK1.8 之前 `HashMap` 底层是 **数组和链表** 结合在一起使用也就是 **链表散列**。**HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。** @@ -520,7 +577,7 @@ static int hash(int h) { ![jdk1.8之前的内部结构-HashMap](images/jdk1.8之前的内部结构-HashMap.png) -#### 1.4.5.2. JDK1.8 之后 +#### 1.5.5.2. JDK1.8 之后 相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。 @@ -528,7 +585,7 @@ static int hash(int h) { > TreeMap、TreeSet 以及 JDK1.8 之后的 HashMap 底层都用到了红黑树。红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。 -### 1.4.6. HashMap 的长度为什么是 2 的幂次方 +### 1.5.6. HashMap 的长度为什么是 2 的幂次方 为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。我们上面也讲到了过了,Hash 值的范围值-2147483648 到 2147483647,前后加起来大概 40 亿的映射空间,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个 40 亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是“ `(n - 1) & hash`”。(n 代表数组长度)。这也就解释了 HashMap 的长度为什么是 2 的幂次方。 @@ -536,17 +593,17 @@ static int hash(int h) { 我们首先可能会想到采用%取余的操作来实现。但是,重点来了:**“取余(%)操作中如果除数是 2 的幂次则等价于与其除数减一的与(&)操作(也就是说 hash%length==hash&(length-1)的前提是 length 是 2 的 n 次方;)。”** 并且 **采用二进制位操作 &,相对于%能够提高运算效率,这就解释了 HashMap 的长度为什么是 2 的幂次方。** -### 1.4.7. HashMap 多线程操作导致死循环问题 +### 1.5.7. HashMap 多线程操作导致死循环问题 主要原因在于并发下的 Rehash 会造成元素之间会形成一个循环链表。不过,jdk 1.8 后解决了这个问题,但是还是不建议在多线程下使用 HashMap,因为多线程下使用 HashMap 还是会存在其他问题比如数据丢失。并发环境下推荐使用 ConcurrentHashMap 。 详情请查看: -### 1.4.8. HashMap 有哪几种常见的遍历方式? +### 1.5.8. HashMap 有哪几种常见的遍历方式? [HashMap 的 7 种遍历方式与性能分析!](https://mp.weixin.qq.com/s/zQBN3UvJDhRTKP6SzcZFKw) -### 1.4.9. ConcurrentHashMap 和 Hashtable 的区别 +### 1.5.9. ConcurrentHashMap 和 Hashtable 的区别 `ConcurrentHashMap` 和 `Hashtable` 的区别主要体现在实现线程安全的方式上不同。 @@ -573,9 +630,9 @@ static int hash(int h) { JDK1.8 的 `ConcurrentHashMap` 不在是 **Segment 数组 + HashEntry 数组 + 链表**,而是 **Node 数组 + 链表 / 红黑树**。不过,Node 只能用于链表的情况,红黑树的情况需要使用 **`TreeNode`**。当冲突链表达到一定长度时,链表会转换成红黑树。 -### 1.4.10. ConcurrentHashMap 线程安全的具体实现方式/底层具体实现 +### 1.5.10. ConcurrentHashMap 线程安全的具体实现方式/底层具体实现 -#### 1.4.10.1. JDK1.7(上面有示意图) +#### 1.5.10.1. JDK1.7(上面有示意图) 首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。 @@ -590,13 +647,13 @@ static class Segment extends ReentrantLock implements Serializable { 一个 `ConcurrentHashMap` 里包含一个 `Segment` 数组。`Segment` 的结构和 `HashMap` 类似,是一种数组和链表结构,一个 `Segment` 包含一个 `HashEntry` 数组,每个 `HashEntry` 是一个链表结构的元素,每个 `Segment` 守护着一个 `HashEntry` 数组里的元素,当对 `HashEntry` 数组的数据进行修改时,必须首先获得对应的 `Segment` 的锁。 -#### 1.4.10.2. JDK1.8 (上面有示意图) +#### 1.5.10.2. JDK1.8 (上面有示意图) `ConcurrentHashMap` 取消了 `Segment` 分段锁,采用 CAS 和 `synchronized` 来保证并发安全。数据结构跟 HashMap1.8 的结构类似,数组+链表/红黑二叉树。Java 8 在链表长度超过一定阈值(8)时将链表(寻址时间复杂度为 O(N))转换为红黑树(寻址时间复杂度为 O(log(N))) `synchronized` 只锁定当前链表或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发,效率又提升 N 倍。 -## 1.5. Collections 工具类 +## 1.6. Collections 工具类 Collections 工具类常用方法: @@ -604,7 +661,7 @@ Collections 工具类常用方法: 2. 查找,替换操作 3. 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合) -### 1.5.1. 排序操作 +### 1.6.1. 排序操作 ```java void reverse(List list)//反转 @@ -615,7 +672,7 @@ void swap(List list, int i , int j)//交换两个索引位置的元素 void rotate(List list, int distance)//旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面 ``` -### 1.5.2. 查找,替换操作 +### 1.6.2. 查找,替换操作 ```java int binarySearch(List list, Object key)//对List进行二分查找,返回索引,注意List必须是有序的 @@ -627,7 +684,7 @@ int indexOfSubList(List list, List target)//统计target在list中第一次出 boolean replaceAll(List list, Object oldVal, Object newVal)//用新元素替换旧元素 ``` -### 1.5.3. 同步控制 +### 1.6.3. 同步控制 `Collections` 提供了多个`synchronizedXxx()`方法·,该方法可以将指定集合包装成线程同步的集合,从而解决多线程并发访问集合时的线程安全问题。 From 04e7b5892830c62582c9cb01e9909e6b507e8d1d Mon Sep 17 00:00:00 2001 From: kaka2634 <996529090@qq.com> Date: Sat, 14 Aug 2021 18:47:40 +0800 Subject: [PATCH 3/4] =?UTF-8?q?Update=20Java=E9=9B=86=E5=90=88=E6=A1=86?= =?UTF-8?q?=E6=9E=B6=E5=B8=B8=E8=A7=81=E9=9D=A2=E8=AF=95=E9=A2=98.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java集合框架常见面试题.md | 47 ++++++++++--------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/docs/java/collection/Java集合框架常见面试题.md b/docs/java/collection/Java集合框架常见面试题.md index c960924e..67953e38 100644 --- a/docs/java/collection/Java集合框架常见面试题.md +++ b/docs/java/collection/Java集合框架常见面试题.md @@ -3,11 +3,12 @@ - [1. 剖析面试最常见问题之 Java 集合框架](#1-剖析面试最常见问题之-java-集合框架) - [1.1. 集合概述](#11-集合概述) - [1.1.1. Java 集合概览](#111-java-集合概览) - - [1.1.2. 说说 List,Set,Map 三者的区别?](#112-说说-listsetmap-三者的区别) + - [1.1.2. 说说 List, Set, Queue, Map 四者的区别?](#112-说说-list-set-queue-map-四者的区别) - [1.1.3. 集合框架底层数据结构总结](#113-集合框架底层数据结构总结) - [1.1.3.1. List](#1131-list) - [1.1.3.2. Set](#1132-set) - - [1.1.3.3. Map](#1133-map) + - [1.1.3.3 Queue](#1133-queue) + - [1.1.3.4. Map](#1134-map) - [1.1.4. 如何选用集合?](#114-如何选用集合) - [1.1.5. 为什么要使用集合?](#115-为什么要使用集合) - [1.2. Collection 子接口之 List](#12-collection-子接口之-list) @@ -22,25 +23,29 @@ - [1.3.1.2. 重写 compareTo 方法实现按年龄来排序](#1312-重写-compareto-方法实现按年龄来排序) - [1.3.2. 无序性和不可重复性的含义是什么](#132-无序性和不可重复性的含义是什么) - [1.3.3. 比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同](#133-比较-hashsetlinkedhashset-和-treeset-三者的异同) - - [1.4. Map 接口](#14-map-接口) - - [1.4.1. HashMap 和 Hashtable 的区别](#141-hashmap-和-hashtable-的区别) - - [1.4.2. HashMap 和 HashSet 区别](#142-hashmap-和-hashset-区别) - - [1.4.3. HashMap 和 TreeMap 区别](#143-hashmap-和-treemap-区别) - - [1.4.4. HashSet 如何检查重复](#144-hashset-如何检查重复) - - [1.4.5. HashMap 的底层实现](#145-hashmap-的底层实现) - - [1.4.5.1. JDK1.8 之前](#1451-jdk18-之前) - - [1.4.5.2. JDK1.8 之后](#1452-jdk18-之后) - - [1.4.6. HashMap 的长度为什么是 2 的幂次方](#146-hashmap-的长度为什么是-2-的幂次方) - - [1.4.7. HashMap 多线程操作导致死循环问题](#147-hashmap-多线程操作导致死循环问题) - - [1.4.8. HashMap 有哪几种常见的遍历方式?](#148-hashmap-有哪几种常见的遍历方式) - - [1.4.9. ConcurrentHashMap 和 Hashtable 的区别](#149-concurrenthashmap-和-hashtable-的区别) - - [1.4.10. ConcurrentHashMap 线程安全的具体实现方式/底层具体实现](#1410-concurrenthashmap-线程安全的具体实现方式底层具体实现) - - [1.4.10.1. JDK1.7(上面有示意图)](#14101-jdk17上面有示意图) - - [1.4.10.2. JDK1.8 (上面有示意图)](#14102-jdk18-上面有示意图) - - [1.5. Collections 工具类](#15-collections-工具类) - - [1.5.1. 排序操作](#151-排序操作) - - [1.5.2. 查找,替换操作](#152-查找替换操作) - - [1.5.3. 同步控制](#153-同步控制) + - [1.4 Collection 子接口之 Queue](#14-collection-子接口之-queue) + - [1.4.1 Queue 与 Deque 的区别](#141-queue-与-deque-的区别) + - [1.4.2 ArrayDeque 与 LinkedList 的区别](#142-arraydeque-与-linkedlist-的区别) + - [1.4.3 说一说 PriorityQueue](#143-说一说-priorityqueue) + - [1.5. Map 接口](#15-map-接口) + - [1.5.1. HashMap 和 Hashtable 的区别](#151-hashmap-和-hashtable-的区别) + - [1.5.2. HashMap 和 HashSet 区别](#152-hashmap-和-hashset-区别) + - [1.5.3. HashMap 和 TreeMap 区别](#153-hashmap-和-treemap-区别) + - [1.5.4. HashSet 如何检查重复](#154-hashset-如何检查重复) + - [1.5.5. HashMap 的底层实现](#155-hashmap-的底层实现) + - [1.5.5.1. JDK1.8 之前](#1551-jdk18-之前) + - [1.5.5.2. JDK1.8 之后](#1552-jdk18-之后) + - [1.5.6. HashMap 的长度为什么是 2 的幂次方](#156-hashmap-的长度为什么是-2-的幂次方) + - [1.5.7. HashMap 多线程操作导致死循环问题](#157-hashmap-多线程操作导致死循环问题) + - [1.5.8. HashMap 有哪几种常见的遍历方式?](#158-hashmap-有哪几种常见的遍历方式) + - [1.5.9. ConcurrentHashMap 和 Hashtable 的区别](#159-concurrenthashmap-和-hashtable-的区别) + - [1.5.10. ConcurrentHashMap 线程安全的具体实现方式/底层具体实现](#1510-concurrenthashmap-线程安全的具体实现方式底层具体实现) + - [1.5.10.1. JDK1.7(上面有示意图)](#15101-jdk17上面有示意图) + - [1.5.10.2. JDK1.8 (上面有示意图)](#15102-jdk18-上面有示意图) + - [1.6. Collections 工具类](#16-collections-工具类) + - [1.6.1. 排序操作](#161-排序操作) + - [1.6.2. 查找,替换操作](#162-查找替换操作) + - [1.6.3. 同步控制](#163-同步控制) From fb609a83ed1804ed6467305c69811e0e0cc6ea07 Mon Sep 17 00:00:00 2001 From: kaka2634 <996529090@qq.com> Date: Sat, 14 Aug 2021 19:03:14 +0800 Subject: [PATCH 4/4] =?UTF-8?q?Update=20Java=E9=9B=86=E5=90=88=E6=A1=86?= =?UTF-8?q?=E6=9E=B6=E5=B8=B8=E8=A7=81=E9=9D=A2=E8=AF=95=E9=A2=98.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collection/Java集合框架常见面试题.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/java/collection/Java集合框架常见面试题.md b/docs/java/collection/Java集合框架常见面试题.md index 67953e38..ce99f804 100644 --- a/docs/java/collection/Java集合框架常见面试题.md +++ b/docs/java/collection/Java集合框架常见面试题.md @@ -333,7 +333,7 @@ Output: `Deque` 扩展了 `Queue` 的接口, 增加了在队首和队尾进行插入和删除的方法,同样根据失败后处理方式的不同分为两类: -| `Deque`接口 | 抛出异常 | 返回特殊值 | +| `Deque` 接口 | 抛出异常 | 返回特殊值 | | ------------ | ------------- | --------------- | | 插入队首 | addFirst(E e) | offerFirst(E e) | | 插入队尾 | addLast(E e) | offerLast(E e) | @@ -342,12 +342,12 @@ Output: | 查询队首元素 | getFirst() | peekFirst() | | 查询队尾元素 | getLast() | peekLast() | -事实上,`Deque` 还提供有 `push()` 和 `pop()` 等其他方法,用于模拟栈。 +事实上,`Deque` 还提供有 `push()` 和 `pop()` 等其他方法,可用于模拟栈。 ### 1.4.2 ArrayDeque 与 LinkedList 的区别 -`ArrayDeque` 和 `LinkedList` 都实现了`Deque`接口,两者都具有队列的功能,但两者有什么区别呢? +`ArrayDeque` 和 `LinkedList` 都实现了 `Deque` 接口,两者都具有队列的功能,但两者有什么区别呢? - `ArrayDeque` 是基于可变长的数组和双指针来实现,而 `LinkedList` 则通过链表来实现。 @@ -357,7 +357,7 @@ Output: - `ArrayDeque` 插入时可能存在扩容过程, 不过均摊后的插入操作依然为 O(1)。虽然 `LinkedList` 不需要扩容,但是每次插入数据时均需要申请新的堆空间,均摊性能相比更慢。 -从性能的角度上,选用 `ArrayDeque` 去实现队列要比 `LinkedList` 更好。此外,`ArrayDeque` 也可以用于实现栈。 +从性能的角度上,选用 `ArrayDeque` 来实现队列要比 `LinkedList` 更好。此外,`ArrayDeque` 也可以用于实现栈。 ### 1.4.3 说一说 PriorityQueue @@ -368,9 +368,9 @@ Output: - `PriorityQueue` 利用了二叉堆的数据结构来实现的,底层使用可变长的数组来存储数据 - `PriorityQueue` 通过堆元素的上浮和下沉,实现了在 O(logn) 的时间复杂度内插入元素和删除堆顶元素。 - `PriorityQueue` 是非线程安全的,且不支持存储 `NULL` 和 `non-comparable` 的对象。 -- `PriorityQueue` 默认是小顶堆,可以接收一个`Comparator`作为构造参数来比较队列中元素的优先级。 +- `PriorityQueue` 默认是小顶堆,但可以接收一个 `Comparator` 作为构造参数,从而来自定义元素优先级的先后。 -`PriorityQueue` 在面试中可能更多的会出现在手撕算法的时候,典型例题包括堆排序、求第K大的数、带权图的遍历等,所以需要学会熟练使用才行。 +`PriorityQueue` 在面试中可能更多的会出现在手撕算法的时候,典型例题包括堆排序、求第K大的数、带权图的遍历等,所以需要会熟练使用才行。 ## 1.5. Map 接口