From 0b2ab04d3f35c46c159e9a9d31d63d2413af4d08 Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Tue, 7 Jun 2022 17:15:01 +0800
Subject: [PATCH 01/15] Update JAVA.md
---
JAVA.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/JAVA.md b/JAVA.md
index c53b8ca..53b7bd8 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1012,7 +1012,7 @@ class LRUCache {
1.类名.class(就是一份字节码)
2.Class.forName(String className);根据一个类的全限定名来构建Class对象
- 3.每一个对象多有getClass()方法:obj.getClass();返回对象的真实类型
+ 3.每一个对象都有getClass()方法:obj.getClass();返回对象的真实类型
**使用场景:**
@@ -6276,4 +6276,4 @@ Raft使用**心跳机制**来触发选举。当server启动时,初始状态都
- 基于JWT的Token,数据从cache或者数据库中获取
- 基于Tomcat的Redis,简单配置conf文件
-- 基于Spring的Redis,支持SpringCloud和Springb
\ No newline at end of file
+- 基于Spring的Redis,支持SpringCloud和Springb
From 1eb1fcb8a84ae5201e1d0e83a824ee3949e21c79 Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Tue, 7 Jun 2022 17:35:45 +0800
Subject: [PATCH 02/15] Update JAVA.md
---
JAVA.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/JAVA.md b/JAVA.md
index 53b7bd8..fa10457 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1061,6 +1061,8 @@ Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Err
### 数据结构

+
+参考:https://www.runoob.com/java/java-collections.html
#### **1、ArrayList和LinkedList**
From c2ebb6a45468a3dd852c2dfde6149215535312e3 Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Tue, 7 Jun 2022 17:40:26 +0800
Subject: [PATCH 03/15] Update JAVA.md
---
JAVA.md | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/JAVA.md b/JAVA.md
index fa10457..1b69781 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1059,10 +1059,17 @@ Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Err
### 数据结构
-
-
+
+Java集合框架
+
+
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。
+
集合框架体系如图所示

-参考:https://www.runoob.com/java/java-collections.html
+
参考:https://www.runoob.com/java/java-collections.html
+
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
+
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
+
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
+
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
#### **1、ArrayList和LinkedList**
From 7dd5e6eaeb729e7223bfa8fb7dd36342b8b5a95c Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Tue, 7 Jun 2022 17:43:53 +0800
Subject: [PATCH 04/15] Update JAVA.md
---
JAVA.md | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/JAVA.md b/JAVA.md
index 1b69781..8dde31a 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1062,14 +1062,16 @@ Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Err
Java集合框架

-
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。
+
从上面的集合框架图可以看到,**Java 集合框架主要包括两种类型的容器**
+ 一种是集合(Collection),存储一个元素集合
+ 另一种是图(Map),存储键/值对映射。
集合框架体系如图所示

参考:https://www.runoob.com/java/java-collections.html
-
集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:
-
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
-
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
-
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
+
集合框架是一个用来代表和操纵集合的统一架构。**所有的集合框架都包含如下内容**:
+ 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
+ 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
+ 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
#### **1、ArrayList和LinkedList**
From 6294f4bb5f0539f3411ec279a663a1731c155a67 Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Tue, 7 Jun 2022 17:45:32 +0800
Subject: [PATCH 05/15] Update JAVA.md
---
JAVA.md | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/JAVA.md b/JAVA.md
index 8dde31a..3ab922d 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1062,13 +1062,15 @@ Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Err
Java集合框架

-
从上面的集合框架图可以看到,**Java 集合框架主要包括两种类型的容器**
+
从上面的集合框架图可以看到
+**Java 集合框架主要包括两种类型的容器**
一种是集合(Collection),存储一个元素集合
另一种是图(Map),存储键/值对映射。
集合框架体系如图所示

参考:https://www.runoob.com/java/java-collections.html
-
集合框架是一个用来代表和操纵集合的统一架构。**所有的集合框架都包含如下内容**:
+
集合框架是一个用来代表和操纵集合的统一架构。
+**所有的集合框架都包含如下内容**:
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
From 1923e1ccdf84bd41d7a4a12aad1cd428c6d5a8fa Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Tue, 7 Jun 2022 17:47:38 +0800
Subject: [PATCH 06/15] Update JAVA.md
---
JAVA.md | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/JAVA.md b/JAVA.md
index 3ab922d..749789b 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1063,16 +1063,24 @@ Throwable 是 Java 语言中所有错误或异常的超类。下一层分为 Err
Java集合框架

从上面的集合框架图可以看到
+
**Java 集合框架主要包括两种类型的容器**
+
一种是集合(Collection),存储一个元素集合
+
另一种是图(Map),存储键/值对映射。
+
集合框架体系如图所示

参考:https://www.runoob.com/java/java-collections.html
集合框架是一个用来代表和操纵集合的统一架构。
-**所有的集合框架都包含如下内容**:
+
+**所有的集合框架都包含如下内容:**:
+
接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
+
实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
+
算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
#### **1、ArrayList和LinkedList**
From 923f470b9a786fe389978dae8cbfee6308a9ab7a Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Tue, 7 Jun 2022 17:48:35 +0800
Subject: [PATCH 07/15] Update JAVA.md
---
JAVA.md | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/JAVA.md b/JAVA.md
index 749789b..0409131 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1066,9 +1066,9 @@ Java集合框架
**Java 集合框架主要包括两种类型的容器**
- 一种是集合(Collection),存储一个元素集合
+ 1.一种是集合(Collection),存储一个元素集合
- 另一种是图(Map),存储键/值对映射。
+ 2.另一种是图(Map),存储键/值对映射。
集合框架体系如图所示

@@ -1077,11 +1077,11 @@ Java集合框架
**所有的集合框架都包含如下内容:**:
- 接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
+ 1.接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
- 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
+ 2.实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
- 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
+ 3.算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
#### **1、ArrayList和LinkedList**
From 140ac4a5a05cd3df8834e23b22fa74e16d91f1eb Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Tue, 7 Jun 2022 22:36:19 +0800
Subject: [PATCH 08/15] Update JAVA.md
---
JAVA.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/JAVA.md b/JAVA.md
index 0409131..46cf8cb 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1162,6 +1162,12 @@ for(Integer i:list){
角度:数据结构+扩容情况+put查找的详细过程+哈希函数+容量为什么始终都是2^N,JDK1.7与1.8的区别。
参考:https://www.jianshu.com/p/9fe4cb316c05
+
+看似简单的hashCode和equals面试题,竟然有这么多坑! :https://zhuanlan.zhihu.com/p/58337357
+
+最通俗易懂搞定HashMap的底层原理:https://zhuanlan.zhihu.com/p/79507868
+
+
**数据结构:**
From 78def5cf3a9177376ba30cd2cc7f7c759fc2a4a8 Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Tue, 7 Jun 2022 22:45:50 +0800
Subject: [PATCH 09/15] Update JAVA.md
---
JAVA.md | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/JAVA.md b/JAVA.md
index 46cf8cb..625dbce 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1167,11 +1167,43 @@ for(Integer i:list){
最通俗易懂搞定HashMap的底层原理:https://zhuanlan.zhihu.com/p/79507868
+Java hashCode() 和 equals()的若干问题解答:https://www.cnblogs.com/skywang12345/p/3324958.html
+
+HashMap 1.7和1.8的区别 --答到面试官怀疑人生:https://blog.csdn.net/weixin_44141495/article/details/108402128
+
+**HashMap中的put方法**
+```JAVA
+public V put(K key, V value) {
+ if (key == null)
+ return putForNullKey(value);
+ int hash = hash(key.hashCode());
+ int i = indexFor(hash, table.length);
+ for (Entry e = table[i]; e != null; e = e.next) {
+ Object k;
+ if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
+ V oldValue = e.value;
+ e.value = value;
+ e.recordAccess(this);
+ return oldValue;
+ }
+ }
+
+ modCount++;
+ addEntry(hash, key, value, i);
+ return null;
+ }
+```
+ 会先调用hashCode方法得到该元素的hashCode值
+
+ 然后查看table中是否存在该hashCode值,如果存在则调用equals方法重新确定是否存在该元素,如果存在,则更新value值,否则将新的元素添加到HashMap中
+
+**从这里可以看出,hashCode方法的存在是为了减少equals方法的调用次数,从而提高程序效率。**
**数据结构:**
HashMap在底层数据结构上采用了数组+链表+红黑树,通过散列映射来存储键值对数据
+
**扩容情况:**
From 75746d72aa9acaf9b8cbe3302e78b5f27c55abe5 Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Tue, 7 Jun 2022 22:47:41 +0800
Subject: [PATCH 10/15] Update JAVA.md
---
JAVA.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/JAVA.md b/JAVA.md
index 625dbce..898da97 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1194,15 +1194,16 @@ public V put(K key, V value) {
return null;
}
```
- 会先调用hashCode方法得到该元素的hashCode值
+ 1、会先调用hashCode方法得到该元素的hashCode值
- 然后查看table中是否存在该hashCode值,如果存在则调用equals方法重新确定是否存在该元素,如果存在,则更新value值,否则将新的元素添加到HashMap中
+ 2、然后查看table中是否存在该hashCode值,如果存在则调用equals方法重新确定是否存在该元素,如果存在,则更新value值,否则将新的元素添加到HashMap中
**从这里可以看出,hashCode方法的存在是为了减少equals方法的调用次数,从而提高程序效率。**
**数据结构:**
HashMap在底层数据结构上采用了数组+链表+红黑树,通过散列映射来存储键值对数据
+

**扩容情况:**
From f675d69319cf364df875bc230caf27ba3c40e3d7 Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Wed, 8 Jun 2022 23:22:02 +0800
Subject: [PATCH 11/15] Update JAVA.md
---
JAVA.md | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 97 insertions(+)
diff --git a/JAVA.md b/JAVA.md
index 898da97..9ef0f14 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1140,6 +1140,103 @@ for(Integer i:list){
if(i==3) list.remove(i);
}
```
+
+```java
+package collection;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * https://juejin.cn/post/6879291161274482695
+ * https://zhuanlan.zhihu.com/p/37476508
+ *
+ * 【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator
+ * 方式,如果并发操作,需要对 Iterator 对象加锁。
+ *
+ *
+ * 反例:test1()没有异常,test2抛出java.util.ConcurrentModificationException
+ * 解释:
+ * (1)迭代器类里有这俩变量:
+ * int cursor; // index of next element to return :下一个要返回的变量的下标
+ * int lastRet = -1; // index of last element returned; -1 if no such :上一个返回过的变量的下标
+ *
+ * (2)调用list.remove的时候,--size了;
+ * -- 即test1() remove("1")后,size变为1,而cursor也等于1,hasNext判断为false就已经退出循环了
+ * -- 即test2() remove("2")后,size变为1,而cursor等于2,hasNext判断为true就已经退出循环了
+ *
+ * (3)hasNext:只有在下一个变量的下标不等于size的时候,集合还有下一个元素
+ * public boolean hasNext() {
+ * return cursor != size;
+ * }
+ *
+ */
+public class FailFast {
+ public static void main(String[] args) {
+ test();
+ System.out.println("test finish, test1 start..");
+ test1();
+ System.out.println("test1 finish, test2 start..");
+ test2(); // 37行
+ }
+
+ /**
+ * 正例:
+ */
+ static void test() {
+ List list = new ArrayList<>();
+ list.add("1");
+ list.add("2");
+
+ Iterator iterator = list.iterator();
+ while (iterator.hasNext()) {
+ String item = iterator.next();
+ if ("2".equals(item)) {
+ iterator.remove();
+ }
+ }
+ }
+
+ /**
+ * 反例1
+ */
+ static void test1() {
+ List list = new ArrayList<>();
+ list.add("1");
+ list.add("2");
+
+ for (String item : list) {
+ System.out.println("item=" + item); // 未遍历到2,就已经退出循环了
+ if ("1".equals(item)) {
+ list.remove(item);
+ }
+ }
+ }
+
+ /**
+ * 反例2
+ */
+ static void test2() {
+ List list = new ArrayList<>();
+ list.add("1");
+ list.add("2");
+
+ /**
+ Exception in thread "main" java.util.ConcurrentModificationException
+ at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:911)
+ at java.util.ArrayList$Itr.next(ArrayList.java:861)
+ at collection.FailFast.test2(FailFast.java:88)
+ at collection.FailFast.main(FailFast.java:37)
+ */
+ for (String item : list) { // 88行:也是先调用迭代器 iterator.hasNext() 判断,再调用iterator.next()取下一个原始
+ if ("2".equals(item)) {
+ list.remove(item);
+ }
+ }
+ }
+}
+```
**fail—fast:**快速失败
From abd5e4bfdb8a761d9acf97b86178171529addb18 Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Wed, 8 Jun 2022 23:22:51 +0800
Subject: [PATCH 12/15] Update JAVA.md
---
JAVA.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/JAVA.md b/JAVA.md
index 9ef0f14..418465a 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1229,7 +1229,7 @@ public class FailFast {
at collection.FailFast.test2(FailFast.java:88)
at collection.FailFast.main(FailFast.java:37)
*/
- for (String item : list) { // 88行:也是先调用迭代器 iterator.hasNext() 判断,再调用iterator.next()取下一个原始
+ for (String item : list) { // 88行:也是先调用迭代器 iterator.hasNext() 判断,再调用iterator.next()取下一个元素
if ("2".equals(item)) {
list.remove(item);
}
From 8dda8c33f1c189846d3e43886c5fbb49d65e854f Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Mon, 13 Jun 2022 13:02:37 +0800
Subject: [PATCH 13/15] Update JAVA.md
---
JAVA.md | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/JAVA.md b/JAVA.md
index 418465a..a3b9f65 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1075,13 +1075,17 @@ Java集合框架
参考:https://www.runoob.com/java/java-collections.html
集合框架是一个用来代表和操纵集合的统一架构。
+
+
**所有的集合框架都包含如下内容:**:
1.接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象
2.实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
- 3.算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。
+ 3.算法Collections:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。点赖个较口
+ (3.1)Comparable
+ (3.2)Comparator
#### **1、ArrayList和LinkedList**
From 88b0c10f5c0a5e068a6b95668ee6dfede1e8300f Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Mon, 13 Jun 2022 13:05:12 +0800
Subject: [PATCH 14/15] Update JAVA.md
---
JAVA.md | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/JAVA.md b/JAVA.md
index a3b9f65..dd72320 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1083,9 +1083,7 @@ Java集合框架
2.实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
- 3.算法Collections:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。点赖个较口
- (3.1)Comparable
- (3.2)Comparator
+ 3.算法Collections:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。依赖两个比较接口 (3.1)Comparable(3.2)Comparator
#### **1、ArrayList和LinkedList**
From 34bee702e081cbfc47ccaa92873945ab4e74e650 Mon Sep 17 00:00:00 2001
From: wxdlut <40487546+wxdlut@users.noreply.github.com>
Date: Mon, 13 Jun 2022 16:21:30 +0800
Subject: [PATCH 15/15] Update JAVA.md
---
JAVA.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/JAVA.md b/JAVA.md
index dd72320..c6c9534 100644
--- a/JAVA.md
+++ b/JAVA.md
@@ -1084,6 +1084,12 @@ Java集合框架
2.实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
3.算法Collections:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。依赖两个比较接口 (3.1)Comparable(3.2)Comparator
+
+
+### **0、Comparable和Comparator**
+ Comparable相当于“内部比较器”(耦合),而Comparator相当于“外部比较器”(解耦)。
+参考:https://zhuanlan.zhihu.com/p/101583223
+
#### **1、ArrayList和LinkedList**