# æ°æå¼å¯¼
éå卿们æ¥å¸¸å¼å使ç¨çæ¬¡æ°æ°ä¸èæ°ï¼`ArrayList`/`LinkedList`/`HashMap`/`HashSet`Â·Â·Â·Â·Â·Â·ä¿¡æææ¥ï¼æ¬æå°±æ¿æ¥ç¨ï¼å¨ IDE ä¸é¾é£å¤èï¼ä½æ¯ä½ä¸ºä¸ååæ ¼çä¼é
çç¨åºç¿ï¼ä»
ä»
äºè§£æä¹ä½¿ç¨`API`æ¯è¿è¿ä¸å¤çï¼å¦æå¨è°ç¨`API`æ¶ï¼ç¥éå®å
é¨åçäºä»ä¹äºæ
ï¼å°±åå¼äº`éè§`夿䏿 ·ï¼æ´ç©¿ä¸åï¼è¿ç§æè§æççç½ï¼èä¸è¿æ ·å°±**䏿¯éåæä¾ä»ä¹åè½ç»æä»¬ä½¿ç¨ï¼èæ¯æä»¬éæ©ä½¿ç¨å®çä»ä¹åè½äº**ã

## éåæ¡æ¶æ»è§
ä¸å¾å ªç§°éåæ¡æ¶ç**ä¸å¸è§è§**ï¼è®²å°éåæ¡æ¶ä¸å¾ä¸ççå°±æ¯è¿å¹
å¾ï¼å½ç¶ï¼ä½ ä¼è§å¾ç¼è±ç¼ä¹±ï¼ä¸ç¥å¦ä½çèµ·ï¼è¿ç¯æç« å¸¦ä½ ä¸æ¥ä¸æ¥å°ç§æä¸é¢çæ¯ä¸ä¸ªæ¥å£ãæ½è±¡ç±»åå
·ä½ç±»ãæä»¬å°ä¼ä»æé¡¶å±çæ¥å£å¼å§è®²èµ·ï¼ä¸æ¥ä¸æ¥å¾ä¸æ·±å
¥ï¼å¸®å©ä½ æå¯¹éåçè®¤ç¥æå»ºèµ·ä¸ä¸ªç¥è¯ç½ç»ã

工欲åå
¶äºå¿
å
å©å
¶å¨ï¼è®©æä»¬å
æ¥è¿ä¸éæ´ä¸ªéåæ¡æ¶çç»æé¨åï¼
1. éåæ¡æ¶æä¾äºä¸¤ä¸ªé忥å£ï¼`Iterator`å`ListIterator`ï¼å
¶ä¸åè
æ¯åè
ç`ä¼åç`ï¼æ¯æå¨ä»»æä¸ä¸ªä½ç½®è¿è¡**ååååéå**ãæ³¨æå¾ä¸ç`Collection`åºå½ç»§æ¿çæ¯`Iterable`è䏿¯`Iterator`ï¼åé¢ä¼è§£é`Iterable`å`Iterator`çåºå«
2. æ´ä¸ªéåæ¡æ¶åä¸ºä¸¤ä¸ªé¨æ´¾ï¼ç±»åï¼ï¼`Collection`å`Map`ï¼åè
æ¯ä¸ä¸ªå®¹å¨ï¼åå¨ä¸ç³»åç**对象**ï¼åè
æ¯é®å¼å¯¹``ï¼åå¨ä¸ç³»åç**é®å¼å¯¹**
3. å¨éåæ¡æ¶ä½ç³»ä¸ï¼è¡çåºåç§å
·ä½çéåç±»åï¼`Map`ã`Set`ã`List`ã`Queue`
4. `Map`åå¨``é®å¼å¯¹ï¼æ¥æ¾å
ç´ æ¶éè¿`key`æ¥æ¾`value`
5. `Set`å
é¨åå¨ä¸ç³»å**ä¸å¯éå¤**ç对象ï¼ä¸æ¯ä¸ä¸ª**æ åº**éåï¼å¯¹è±¡æå顺åºä¸ä¸
6. `List`å
é¨åå¨ä¸ç³»å**å¯éå¤**çå¯¹è±¡ï¼æ¯ä¸ä¸ª**æåº**éåï¼å¯¹è±¡ææå
¥é¡ºåºæå
7. `Queue`æ¯ä¸ä¸ª**éå**容å¨ï¼å
¶ç¹æ§ä¸`List`ç¸åï¼ä½åªè½ä»`é头`å`éå°¾`æä½å
ç´
8. JDK 为éåçåç§æä½æä¾äºä¸¤ä¸ªå·¥å
·ç±»`Collections`å`Arrays`ï¼ä¹åä¼è®²è§£å·¥å
·ç±»çå¸¸ç¨æ¹æ³
9. åç§æ½è±¡éåç±»åå
é¨ä¹ä¼è¡çåºè®¸å¤å
·æä¸åç¹æ§çéåç±»ï¼**ä¸ååºæ¯ä¸æ©ä¼ä½¿ç¨ï¼æ²¡ææä½³çéå**
ä¸é¢äºè§£äºæ´ä¸ªéåæ¡æ¶ä½ç³»çç»æé¨åï¼æ¥ä¸æ¥çç« èä¼ä¸¥æ ¼æç
§ä¸é¢ç½åç顺åºè¿è¡è®²è§£ï¼æ¯ä¸æ¥é½ä¼æ`æ¿ä¸å¯ä¸`çä½ç¨
> å¦ä¹ `Set`åï¼æå¥½æå¥½è¦å
å¦ä¹ `Map`ï¼å 为`Set`çæä½æ¬è´¨ä¸æ¯å¯¹`Map`çæä½ï¼å¾ä¸çåæ²¡é
### Iterator Iterable ListIterator
å¨ç¬¬ä¸æ¬¡çè¿ä¸¤ä¸ªæ¥å£ï¼ç以为æ¯ä¸æ¨¡ä¸æ ·çï¼æ²¡åç°é颿å¥ä¸åï¼**åå¨å³åç**ï¼å®ä»¬ä¸¤ä¸ªè¿æ¯ææ¬è´¨ä¸çåºå«çã
é¦å
æ¥ç`Iterator`æ¥å£ï¼
```java
public interface Iterator {
boolean hasNext();
E next();
void remove();
}
```
æä¾çAPIæ¥å£å«ä¹å¦ä¸ï¼
- `hasNext()`ï¼å¤æéå䏿¯å¦åå¨ä¸ä¸ä¸ªå¯¹è±¡
- `next()`ï¼è¿åéåä¸çä¸ä¸ä¸ªå¯¹è±¡ï¼å¹¶å°è®¿é®æéç§»å¨ä¸ä½
- `remove()`ï¼å é¤éåä¸è°ç¨`next()`æ¹æ³è¿åç对象
卿©æï¼éåéåçæ¹å¼åªæä¸ç§ï¼éè¿`Iterator`è¿ä»£å¨æä½
```java
List list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator iter = list.iterator();
while (iter.hasNext()) {
Integer next = iter.next();
System.out.println(next);
if (next == 2) { iter.remove(); }
}
```
忥ç`Iterable`æ¥å£ï¼
```java
public interface Iterable {
Iterator iterator();
// JDK 1.8
default void forEach(Consumer super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
}
```
å¯ä»¥çå°`Iterable`æ¥å£é颿ä¾äº`Iterator`æ¥å£ï¼æä»¥å®ç°äº`Iterable`æ¥å£çéå便§å¯ä»¥ä½¿ç¨`è¿ä»£å¨`éååæä½éåä¸ç对象ï¼
èå¨ `JDK 1.8`ä¸ï¼`Iterable`æä¾äºä¸ä¸ªæ°çæ¹æ³`forEach()`ï¼å®å
许使ç¨å¢å¼º for 循ç¯éå对象ã
```java
List list = new ArrayList<>();
for (Integer num : list) {
System.out.println(num);
}
```
æä»¬éè¿å½ä»¤ï¼`javap -c`åç¼è¯ä¸é¢çè¿æ®µä»£ç åï¼åç°å®åªæ¯ Java ä¸çä¸ä¸ª`è¯æ³ç³`ï¼æ¬è´¨ä¸è¿æ¯è°ç¨`Iterator`å»éåã

ç¿»è¯æä»£ç ï¼å°±åä¸å¼å§ç`Iterator`è¿ä»£å¨éåæ¹å¼åºæ¬ç¸åäºã
```java
Iterator iter = list.iterator();
while (iter.hasNext()) {
Integer num = iter.next();
System.out.println(num);
}
```
> è¿ææ´æ·±å±æ¬¡çæ¢è®¨ï¼ä¸ºä»ä¹è¦è®¾è®¡ä¸¤ä¸ªæ¥å£`Iterable`å`Iterator`ï¼è䏿¯ä¿çå
¶ä¸ä¸ä¸ªå°±å¯ä»¥äºã
>
> ç®å讲解ï¼`Iterator`çä¿çå¯ä»¥è®©åç±»å»**å®ç°èªå·±çè¿ä»£å¨**ï¼è`Iterable`æ¥å£æ´å å
³æ³¨äº`for-each`çå¢å¼ºè¯æ³ãå
·ä½å¯åèï¼[Javaä¸çIterableä¸Iterator详解](https://www.cnblogs.com/litexy/p/9744241.html)
å
³äº`Iterator`å`Iterable`ç讲解å䏿®µè½ï¼ä¸é¢æ¥æ»ç»ä¸ä¸å®ä»¬çéç¹ï¼
1. `Iterator`æ¯æä¾éåæä½å
é¨å¯¹è±¡çä¸ä¸ªè¿ä»£å¨ï¼å®å¯ä»¥**éåãç§»é¤**对象ï¼ä¸åªè½å¤**ååç§»å¨**
2. `Iterable`æ¯å¯¹`Iterator`çå°è£
ï¼å¨`JDK 1.8`æ¶ï¼å®ç°äº`Iterable`æ¥å£çéåå¯ä»¥ä½¿ç¨**å¢å¼º for 循ç¯**éåéåå¯¹è±¡ï¼æä»¬éè¿**åç¼è¯**ååç°åºå±è¿æ¯ä½¿ç¨`Iterator`è¿ä»£å¨è¿è¡éå
ççï¼è¿ä¸ç« è¿æ²¡å®ï¼è¿æä¸ä¸ª`ListIterator`ãå®ç»§æ¿ Iterator æ¥å£ï¼å¨éå`List`éåæ¶å¯ä»¥ä»**ä»»æç´¢å¼ä¸æ **å¼å§éåï¼è䏿¯æ**ååéå**ã
ListIterator åå¨äº List éåä¹ä¸ï¼éè¿è°ç¨æ¹æ³å¯ä»¥è¿å**èµ·å§ä¸æ **为 `index`çè¿ä»£å¨
```java
List list = new ArrayList<>();
// è¿å䏿 为0çè¿ä»£å¨
ListIterator listIter1 = list.listIterator();
// è¿å䏿 为5çè¿ä»£å¨
ListIterator listIter2 = list.listIterator(5);
```
ListIterator 䏿å 个éè¦æ¹æ³ï¼å¤§å¤æ°æ¹æ³ä¸ Iterator ä¸å®ä¹çå«ä¹ç¸åï¼ä½æ¯æ¯ Iterator 强大çå°æ¹æ¯å¯ä»¥å¨**ä»»æä¸ä¸ªä¸æ ä½ç½®**è¿å该è¿ä»£å¨ï¼ä¸å¯ä»¥å®ç°**ååéå**ã
```java
public interface ListIterator extends Iterator {
boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void remove();
// æ¿æ¢å½å䏿 çå
ç´ ,å³è®¿é®è¿çæåä¸ä¸ªå
ç´
void set(E e);
void add(E e);
}
```
### Map å Collection æ¥å£
Map æ¥å£å Collection æ¥å£æ¯éåæ¡æ¶ä½ç³»ç䏤大鍿´¾ï¼Collection æ¯åå¨å
ç´ æ¬èº«ï¼è Map æ¯åå¨``é®å¼å¯¹ï¼å¨ Collection 鍿´¾ä¸æä¸å°é¨åå¼åå»`å·å¸`ï¼å©ç¨ Map 鍿´¾ä¸çå¼åæ¥ä¿®ç¼èªå·±ã
æ¯ä¸æ¯å¬çä¸å¤´é¾æ°´åååï¼ä¸¾ä¸ªä¾åä½ å°±æäºï¼`HashSet`åºå±å©ç¨äº`HashMap`ï¼`TreeSet`åºå±ç¨äº`TreeMap`ï¼`LinkedHashSet`åºå±ç¨äº`LinkedHashMap`ã
ä¸é¢æä¼è¯¦ç»è®²å°å个å
·ä½éåç±»å¦ï¼æä»¥å¨è¿éï¼æä»¬å
仿´ä½ä¸äºè§£è¿ä¸¤ä¸ª`鍿´¾`çç¹ç¹ååºå«ã

`Map`æ¥å£å®ä¹äºåå¨çæ°æ®ç»ææ¯``å½¢å¼ï¼æ ¹æ® key æ å°å° valueï¼ä¸ä¸ª key 对åºä¸ä¸ª value ï¼æä»¥`key`ä¸å¯éå¤ï¼è`value`å¯éå¤ã
å¨`Map`æ¥å£ä¸ä¼å°åå¨çæ¹å¼ç»å为ä¸åçç§ç±»ï¼
- `SortedMap`æ¥å£ï¼è¯¥ç±»æ å°å¯ä»¥å¯¹``æç
§èªå·±çè§åè¿è¡**æåº**ï¼å
·ä½å®ç°æ TreeMap
- `AbsractMap`ï¼å®ä¸ºåç±»æä¾å¥½ä¸äº**éç¨çAPIå®ç°**ï¼ææçå
·ä½Mapå¦`HashMap`é½ä¼ç»§æ¿å®
è`Collection`æ¥å£æä¾äºææéåç**éç¨æ¹æ³**ï¼æ³¨æè¿éä¸å
æ¬`Map`ï¼ï¼
- æ·»å æ¹æ³ï¼`add(E e)` / `addAll(Collection extends E> var1)`
- å 餿¹æ³ï¼`remove(Object var1)` / `removeAll(Collection> var1)`
- æ¥æ¾æ¹æ³ï¼`contains(Object var1)` / `containsAll(Collection> var1);`
- æ¥è¯¢éåèªèº«ä¿¡æ¯ï¼`size()` / `isEmpty()`
- ···
å¨`Collection`æ¥å£ä¸ï¼åæ ·ä¼å°éåç»å为ä¸åçç§ç±»ï¼
- `Set`æ¥å£ï¼ä¸ä¸ª**ä¸å
许åå¨éå¤å
ç´ **ç**æ åº**éåï¼å
·ä½å®ç°æ`HashSet` / `TreeSet`···
- `List`æ¥å£ï¼ä¸ä¸ª**å¯åå¨éå¤å
ç´ **ç**æåº**éåï¼å
·ä½å®ç°æ`ArrayList` / `LinkedList`···
- `Queue`æ¥å£ï¼ä¸ä¸ª**å¯åå¨éå¤å
ç´ **ç**éå**ï¼å
·ä½å®ç°æ`PriorityQueue` / `ArrayDeque`···
## Map éåä½ç³»è¯¦è§£
`Map`æ¥å£æ¯ç±``ç»æçéåï¼ç±`key`æ å°å°**å¯ä¸**ç`value`ï¼æä»¥`Map`ä¸è½å
å«éå¤ç`key`ï¼æ¯ä¸ªé®**è³å¤**æ å°ä¸ä¸ªå¼ãä¸å¾æ¯æ´ä¸ª Map éåä½ç³»ç主è¦ç»æé¨åï¼æå°ä¼æç
§æ¥å¸¸ä½¿ç¨é¢çä»é«å°ä½ä¸ä¸è®²è§£ã
ä¸å¾ä¸æçæ¯ Map ç设计ç念ï¼**å®ä½å
ç´ **çæ¶é´å¤æåº¦ä¼åå° `O(1)`
Map ä½ç³»ä¸ä¸»è¦å为 AbstractMap å SortedMap两类éå
`AbstractMap`æ¯å¯¹ Map æ¥å£çæ©å±ï¼å®å®ä¹äºæ®éç Map éåå
·æç**éç¨è¡ä¸º**ï¼å¯ä»¥é¿å
åç±»éå¤ç¼å大éç¸åç代ç ï¼åç±»ç»§æ¿ AbstractMap åå¯ä»¥éåå®çæ¹æ³ï¼**å®ç°é¢å¤çé»è¾**ï¼å¯¹å¤æä¾æ´å¤çåè½ã
`SortedMap` å®ä¹äºè¯¥ç±» Map å
·æ `æåº`è¡ä¸ºï¼åæ¶å®å¨å
é¨å®ä¹å¥½æå
³æåºçæ½è±¡æ¹æ³ï¼å½åç±»å®ç°å®æ¶ï¼å¿
é¡»éåæææ¹æ³ï¼å¯¹å¤æä¾æåºåè½ã
### HashMap
HashMap æ¯ä¸ä¸ª**æéç¨ç**å©ç¨åå¸è¡¨åå¨å
ç´ çéåï¼å°å
ç´ æ¾å
¥ HashMap æ¶ï¼å°`key`çåå¸å¼è½¬æ¢ä¸ºæ°ç»ç`ç´¢å¼`䏿 **ç¡®å®åæ¾ä½ç½®**ï¼æ¥æ¾æ¶ï¼æ ¹æ®`key`çåå¸å°åè½¬æ¢ææ°ç»ç`ç´¢å¼`䏿 **ç¡®å®æ¥æ¾ä½ç½®**ã
HashMap åºå±æ¯ç¨æ°ç» + é¾è¡¨ + çº¢é»æ è¿ä¸ç§æ°æ®ç»æå®ç°ï¼å®æ¯**é线ç¨å®å
¨**çéåã

åéåå¸å²çªæ¶ï¼HashMap çè§£å³æ¹æ³æ¯å°ç¸åæ å°å°åçå
ç´ è¿æä¸æ¡`é¾è¡¨`ï¼å¦æé¾è¡¨çé¿åº¦å¤§äº`8`æ¶ï¼ä¸æ°ç»çé¿åº¦å¤§äº`64`åä¼è½¬æ¢æ`çº¢é»æ `æ°æ®ç»æã
å
³äº HashMap çç®è¦æ»ç»ï¼
1. 宿¯éå䏿叏ç¨ç`Map`éåç±»åï¼åºå±ç±`æ°ç» + é¾è¡¨ + çº¢é»æ `ç»æ
2. HashMap䏿¯çº¿ç¨å®å
¨ç
3. æå
¥å
ç´ æ¶ï¼éè¿è®¡ç®å
ç´ ç`åå¸å¼`ï¼éè¿**å叿 å°å½æ°**转æ¢ä¸º`æ°ç»ä¸æ `ï¼æ¥æ¾å
ç´ æ¶ï¼åæ ·éè¿å叿 å°å½æ°å¾å°æ°ç»ä¸æ `å®ä½å
ç´ çä½ç½®`
### LinkedHashMap
LinkedHashMap å¯ä»¥ç使¯ `HashMap` å `LinkedList` çç»åï¼å®å¨ HashMap çåºç¡ä¸æ·»å äºä¸æ¡ååé¾è¡¨ï¼`é»è®¤`åå¨å个å
ç´ çæå
¥é¡ºåºï¼ä½ç±äºè¿æ¡ååé¾è¡¨ï¼ä½¿å¾ LinkedHashMap å¯ä»¥å®ç° `LRU`ç¼åæ·æ±°çç¥ï¼å 为æä»¬å¯ä»¥è®¾ç½®è¿æ¡ååé¾è¡¨æç
§`å
ç´ çè®¿é®æ¬¡åº`è¿è¡æåº

LinkedHashMap æ¯ HashMap çåç±»ï¼æä»¥å®å
·å¤ HashMap çææç¹ç¹ï¼å
¶æ¬¡ï¼å®å¨ HashMap çåºç¡ä¸ç»´æ¤äºä¸æ¡`ååé¾è¡¨`ï¼è¯¥é¾è¡¨åå¨äº**ææå
ç´ **ï¼`é»è®¤`å
ç´ ç顺åºä¸æå
¥é¡ºåº**ä¸è´**ãè¥`accessOrder`屿§ä¸º`true`ï¼åéåé¡ºåºæå
ç´ çè®¿é®æ¬¡åºè¿è¡æåºã
```java
// 头èç¹
transient LinkedHashMap.Entry head;
// å°¾ç»ç¹
transient LinkedHashMap.Entry tail;
```
å©ç¨ LinkedHashMap å¯ä»¥å®ç° `LRU` ç¼åæ·æ±°çç¥ï¼å ä¸ºå®æä¾äºä¸ä¸ªæ¹æ³ï¼
```java
protected boolean removeEldestEntry(java.util.Map.Entry eldest) {
return false;
}
```
è¯¥æ¹æ³å¯ä»¥ç§»é¤`æé è¿é¾è¡¨å¤´é¨`çä¸ä¸ªèç¹ï¼èå¨`get()`æ¹æ³ä¸å¯ä»¥çå°ä¸é¢è¿æ®µä»£ç ï¼å
¶ä½ç¨æ¯æªå¨ç»ç¹çä½ç½®ï¼
```java
if (this.accessOrder) {
this.afterNodeAccess(e);
}
```
åªè¦è°ç¨äº`get()`ä¸`accessOrder = true`ï¼åä¼å°è¯¥èç¹æ´æ°å°é¾è¡¨`å°¾é¨`ï¼å
·ä½çé»è¾å¨`afterNodeAccess()`ä¸ï¼æå
´è¶£çå¯ç¿»çæºç ï¼ç¯å¹
åå è¿éä¸åå±å¼ã
ç°å¨å¦æè¦å®ç°ä¸ä¸ª`LRU`ç¼åçç¥ï¼åéè¦åä¸¤ä»¶äºæ
ï¼
- æå®`accessOrder = true`å¯ä»¥è®¾å®é¾è¡¨æç
§è®¿é®é¡ºåºæåï¼éè¿æä¾çæé å¨å¯ä»¥è®¾å®`accessOrder`
```java
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}
```
- éå`removeEldestEntry()`æ¹æ³ï¼å
é¨å®ä¹é»è¾ï¼é常æ¯å¤æ`容é`æ¯å¦è¾¾å°ä¸éï¼è¥æ¯åæ§è¡æ·æ±°ã
è¿éå°±è¦è´´åºä¸é大åé¢è¯å¿
èé¢ç®ï¼[146. LRUç¼åæºå¶](https://leetcode-cn.com/problems/lru-cache/)ï¼åªè¦è·çæçæ¥éª¤ï¼å°±è½é¡ºå©å®æè¿é大åé¢äºã
å
³äº LinkedHashMap 主è¦ä»ç»ä¸¤ç¹ï¼
1. å®åºå±ç»´æ¤äºä¸æ¡`ååé¾è¡¨`ï¼å 为继æ¿äº HashMapï¼æä»¥å®ä¹ä¸æ¯çº¿ç¨å®å
¨ç
2. LinkedHashMap å¯å®ç°`LRU`ç¼åæ·æ±°çç¥ï¼å
¶åçæ¯éè¿è®¾ç½®`accessOrder`为`true`å¹¶éå`removeEldestEntry`æ¹æ³å®ä¹æ·æ±°å
ç´ æ¶éæ»¡è¶³çæ¡ä»¶
### TreeMap
TreeMap æ¯ `SortedMap` çåç±»ï¼æä»¥å®å
·æ**æåº**åè½ã宿¯åºäº`çº¢é»æ `æ°æ®ç»æå®ç°çï¼æ¯ä¸ä¸ªé®å¼å¯¹``齿¯ä¸ä¸ªç»ç¹ï¼é»è®¤æ
åµä¸æç
§`key`èªç¶æåºï¼å¦ä¸ç§æ¯å¯ä»¥éè¿ä¼ å
¥å®å¶ç`Comparator`è¿è¡èªå®ä¹è§åæåºã
```java
// æç
§ key èªç¶æåºï¼Integer çèªç¶æåºæ¯ååº
TreeMap naturalSort = new TreeMap<>();
// å®å¶æåºï¼æç
§ key éåºæåº
TreeMap customSort = new TreeMap<>((o1, o2) -> Integer.compare(o2, o1));
```
TreeMap åºå±ä½¿ç¨äºæ°ç»+çº¢é»æ å®ç°ï¼æä»¥éé¢çåå¨ç»æå¯ä»¥çè§£æä¸é¢è¿å¹
å¾å¦ã

å¾ä¸çº¢é»æ çæ¯ä¸ä¸ªèç¹é½æ¯ä¸ä¸ª`Entry`ï¼å¨è¿é为äºå¾ççç®æ´æ§ï¼å°±ä¸æ æ key å value äºï¼æ³¨æè¿äºå
ç´ é½æ¯å·²ç»æç
§`key`æå¥½åºäºï¼æ´ä¸ªæ°æ®ç»æé½æ¯ä¿æç`æåº` çç¶æï¼
å
³äº`èªç¶`æåºä¸`å®å¶`æåºï¼
- èªç¶æåºï¼è¦æ±`key`å¿
é¡»å®ç°`Comparable`æ¥å£ã
ç±äº`Integer`ç±»å®ç°äº Comparable æ¥å£ï¼æç
§èªç¶æåºè§åæ¯æç
§`key`ä»å°å°å¤§æåºã
```java
TreeMap treeMap = new TreeMap<>();
treeMap.put(2, "TWO");
treeMap.put(1, "ONE");
System.out.print(treeMap);
// {1=ONE, 2=TWO}
```
- å®å¶æåºï¼å¨åå§å TreeMap æ¶ä¼ å
¥æ°ç`Comparator`ï¼**ä¸**è¦æ±`key`å®ç° Comparable æ¥å£
```java
TreeMap treeMap = new TreeMap<>((o1, o2) -> Integer.compare(o2, o1));
treeMap.put(1, "ONE");
treeMap.put(2, "TWO");
treeMap.put(4, "FOUR");
treeMap.put(3, "THREE");
System.out.println(treeMap);
// {4=FOUR, 3=THREE, 2=TWO, 1=ONE}
```
éè¿ä¼ å
¥æ°ç`Comparator`æ¯è¾å¨ï¼å¯ä»¥è¦çé»è®¤çæåºè§åï¼ä¸é¢çä»£ç æç
§`key`éåºæåºï¼å¨å®é
åºç¨ä¸è¿å¯ä»¥æç
§å
¶å®è§åèªå®ä¹æåºã
`compare()`æ¹æ³çè¿å弿ä¸ç§ï¼å嫿¯ï¼`0`ï¼`-1`ï¼`+1`
ï¼1ï¼å¦æè¿å`0`ï¼ä»£è¡¨ä¸¤ä¸ªå
ç´ ç¸çï¼ä¸éè¦è°æ¢é¡ºåº
ï¼2ï¼å¦æè¿å`+1`ï¼ä»£è¡¨åé¢çå
ç´ éè¦ä¸åé¢çå
ç´ è°æ¢ä½ç½®
ï¼3ï¼å¦æè¿å`-1`ï¼ä»£è¡¨åé¢çå
ç´ ä¸éè¦ä¸åé¢çå
ç´ è°æ¢ä½ç½®
è使¶è¿å`+1`å`-1`ï¼åç±æä»¬èªå·±å»å®ä¹ï¼JDKé»è®¤æ¯æç
§**èªç¶æåº**ï¼èæä»¬å¯ä»¥æ ¹æ®`key`çä¸åå»å®ä¹éåºè¿æ¯ååºæåºã
å
³äº TreeMap 主è¦ä»ç»äºä¸¤ç¹ï¼
1. å®åºå±æ¯ç±`çº¢é»æ `è¿ç§æ°æ®ç»æå®ç°çï¼æä»¥æä½çæ¶é´å¤æåº¦æä¸º`O(logN)`
2. TreeMap å¯ä»¥å¯¹`key`è¿è¡èªç¶æåºæè
èªå®ä¹æåºï¼èªå®ä¹æåºæ¶éè¦ä¼ å
¥`Comparator`ï¼èèªç¶æåºè¦æ±`key`å®ç°äº`Comparable`æ¥å£
3. TreeMap 䏿¯çº¿ç¨å®å
¨çã
### WeakHashMap
WeakHashMap æ¥å¸¸å¼å䏿¯è¾å°è§ï¼å®æ¯åºäºæ®éç`Map`å®ç°çï¼èéé¢`Entry`ä¸çé®å¨æ¯ä¸æ¬¡ç`åå¾åæ¶`é½ä¼è¢«æ¸
é¤æï¼æä»¥é常éåç¨äº**çæè®¿é®ãä»
访é®ä¸æ¬¡**çå
ç´ ï¼ç¼åå¨`WeakHashMap`ä¸ï¼å¹¶å°½æ©å°æå®åæ¶æã
å½`Entry`被`GC`æ¶ï¼WeakHashMap æ¯å¦ä½æç¥å°æä¸ªå
ç´ è¢«åæ¶çå¢ï¼
å¨ WeakHashMap å
é¨ç»´æ¤äºä¸ä¸ªå¼ç¨éå`queue`
```java
private final ReferenceQueue