# ç®å½
[TOC]
# å¿
ç
## å¦ä½å¦ä¹ æ¬é¡¹ç®
æä¾äºé常详ç»çç®å½ï¼å»ºè®®å¯ä»¥ä»å¤´çæ¯çä¸éï¼å¦æåºç¡ä¸éçè¯ä¹å¯ä»¥æèªå·±éè¦çç« èæ¥çãççè¿ç¨ä¸èªå·±è¦å¤æèï¼ç¢°å°ä¸æçå°æ¹ï¼èªå·±è®°å¾è¦å¤æç´¢ï¼éè¦è®°å¿çå°æ¹ä¹ä¸è¦åå¬èªå·±çèåã
## å
³äºæ´æ°
**ãJavaGuideé¢è¯çªå»çã** é¢è®¡ä¸ä¸ªæå·¦å³ä¼æä¸æ¬¡å
å®¹æ´æ°åå®åï¼å¤§å®¶å¨æçå
¬ä¼å· **JavaGuide** åå°åå¤**âé¢è¯çªå»â** å³å¯è·åææ°çï¼å¦å¤ï¼ä¸ºäºä¿è¯èªå·±çè¾å¤å³å¨ä¸è¢«æ¶æççæ»¥ç¨ï¼æä»¥ææ·»å äºæ°´å°å¹¶ä¸å¨ä¸äºå
容注æçæï¼å¸æå¤§å®¶çè§£ã

## å¦ä½è´¡ç®
大家é
读è¿ç¨ä¸å¦æéå°é误çå°æ¹å¯ä»¥éè¿å¾®ä¿¡: *JavaGuide1996* æè
é®ç®±ï¼*[email protected]*ä¸æäº¤æµï¼ps:å è¿æå¾®ä¿¡çå°±ä¸è¦é夿·»å äºï¼è¿æ¯å¦å¤ä¸ä¸ªè´¦å·ï¼åä¸ä¸ªå·²ç»æ»¡äºï¼ã
å¸æå¤§å®¶ç»ææåé¦çæ¶åå¯ä»¥æç
§å¦ä¸æ ¼å¼ï¼
> æè§å¾2.3èJavaåºç¡ç 2.3.1 è¿é¨åçæè¿°æé®é¢ï¼åºè¯¥è¿æ ·æè¿°ï¼ï½å·´æå·´æï½ 伿´å¥½ï¼å
·ä½å¯ä»¥åèOracle 宿¹ææ¡£ï¼å°åï¼~~~~ã
ä¸ºäºæé«åç¡®æ§å·²ç»ä¸å¿
è¦çæ¶é´è±è´¹ï¼å¸æå¤§å®¶å°½éç¡®ä¿èªå·±æ³æ³çåç¡®æ§ã
## å
³äºæ¬å¼æºææ¡£
JavaGuide ç®åå·²ç» 70k+ Star ï¼ç®åå·²ç»æ¯ææ Java ç±»å«é¡¹ç®ä¸ Star æ°é第äºç弿ºé¡¹ç®äºãStarè½ç¶å¾å¤ï¼ä½æ¯ä»·å¼è¿è¿æ¯ä¸ä¸ Dubbo è¿äºå¼æºé¡¹ç®ï¼å¸æä»¥åå¯ä»¥å¤åºç°ä¸äºè¿æ ·çå½äº§å¼æºé¡¹ç®ãå½äº§å¼æºé¡¹ç®ï¼å æ²¹ï¼å¥¥å©ç»ï¼
éçè¶æ¥è¶å¤ç人åä¸å®åè¿ä¸ªé¡¹ç®ï¼è¿ä¸ªä¸æ³¨ âJavaç¥è¯æ»ç»+é¢è¯æå â 项ç®çç¥è¯ä½ç³»åå
容ç䏿å®åãJavaGuide ç®åå
æ¬ä¸é¢è¿ä¸¤é¨åå
容ï¼
1. **Java æ ¸å¿ç¥è¯æ»ç»**ï¼
2. **é¢è¯æ¹å**ï¼é¢è¯é¢ãé¢è¯ç»éªã夿é¢è¯ç³»åæç« 以åé¢è¯çå®ä½éªç³»åæç«
å
容çåºå¤§è®©JavaGuide æ¾çæä¸ç¹èè¿ãæä»¥ï¼æå³å®å°ä¸é¨ä¸º Java é¢è¯æåçæç« 以忥èªè¯»è
æç¨¿çæç« æ´çæ **ãJavaGuideé¢è¯çªå»çã** ç³»åï¼èµ·è¿ä¸ªååä¹ç¹è±«äºå¾ä¹
ï¼å¤§å®¶å¦æææ´å¥½çååçè¯ä¹å¯ä»¥åæå»ºè®®ãææ¶çå®ä½æ¯å°å
¶ä½ä¸º PDF çµå书ï¼å¹¶ä¸ä¼å JavaGuide æä¾å¨çº¿é
è¯»çæ¬ãæä¹åä¹å
è´¹å享è¿PDF çæ¬çãJavaé¢è¯çªå»ãï¼æé´ä¸å
±æ´æ°äº 3 ä¸ªçæ¬ï¼ä½æ¯ç±äºåé¢é¾ä»¥åæ¥åè®¢æ£æä»¥å°±æ²¡æåæ´æ°ã**ãJavaGuideé¢è¯çªå»çã** pdf çç±äºæå·¥ä½æµç¨ç转åå¯ä»¥ææé¿å
è¿ä¸ªé®é¢ã
å¦å¤ï¼è¿æ®µæ¶é´ï¼åææè¿ä¸ªå»ºè®®ç读è
ä¹ä¸æ¯ä¸ä¸ªä¸¤ä¸ªï¼æèªå·±å½ç¶ä¹æè¿ä¸ªæè§ãåªæ¯èªå·±ä¸ç´æ²¡ææ½åºæ¶é´å»åç½¢äºï¼æ¯ç«è¿ç®æ¯ä¸ä¸ªæ¯è¾èè´¹æ¶é´çå·¥ç¨ã
è¿ä»¶äºæ
å
·ä½èè´¹æ¶é´çå°æ¹æ¯å
容çæçä¼åï¼ä¸ºäºæ¹ä¾¿å¯¼åºPDFçæç®å½ï¼ï¼å¯¼åº PDF ææ¯éè¿ Typora æ¥åçã
## å¦ä½èµèµ
妿è§å¾æ¬ææ¡£å¯¹ä½ æå¸®å©çè¯ï¼æ¬¢è¿å å
¥æçç¥è¯æçãå建æççç®çä¸»è¦æ¯ä¸ºäºæé«ç¥è¯æ²æ·ï¼å¾®ä¿¡ç¾¤çå¼ç«¯ç¸æ¯å¤§å®¶é½äºè§£ãæç没æå
è´¹çåå æ¯äºè®¾ç«é¨æ§ï¼æé«è¿å
¥è¯»è
çè´¨éãæä¼å¨æçåç大家çé®é¢ï¼æ´æ°æ´å¤ç大åé¢è¯å¹²è´§ï¼

æçç¥è¯æççä»·æ ¼åºè¯¥æ¯æäºè§£çååé颿ä½çï¼ä¹å°±1é¡¿é¥é±å§ï¼æ¯ç«å
³æ³¨æç大é¨åè¿æ¯å¦çï¼ææå¿åºé叿èªå·±å享çä¸è¥¿è½å¯¹å¤§å®¶æå¸®å©ã
# æ´æ°è®°å½
V1.0â2020-03-07
第ä¸çãJavaGuideé¢è¯çªå»çãæ£å¼å®ç»åå¸ï¼
V1.1â2020-03-13
**ä¿®å¤é®é¢ï¼**
- [x] æ¯ä¸ªç« èé½éå¤ä¸éç®å½ï¼å¤æ»äºå¥½å¤é¡µ
- [x] 强çè¦æ±å ä¸çæ¬å·åå叿¥æï¼è¯»è
å°±ç¥éèªå·±çæ¯ä»ä¹çæ¬äº
- [x] 2.1 Javaåºç¡é¨å p36+p37æç« 龿¥å¤±æ
- [x] 3.3 è ThreadLocal é¨åçä¸ä¸ªç¬è¯¯
- [x] æ°´å°è¿éï¼æä¸ç¹å½±åé
读
- [x] ææ¡£ååå¼å¤´å ä¸çæ¬è¡¨ç¤ºç¤ºä¾ï¼V1.1-JavaGuideé¢è¯çªå»ç
**å¢å /ä¿®æ¹å
容ï¼**
- [x] ä¸å¤æé¢è¯é¨åï¼å®åäº âèªæä»ç»â é¨åçå
容并ä¸å¢å ææ¯é¢å¯è½ä¼é®åªäºæ¹åçé®é¢ãå¦ä½å¦ä¹ çå
容ã
- [x] 第ä¸èå¸¸è§æ¡æ¶é¨åå¢å äº Kafka 常è§é¢è¯é¢
V2.0â2020-04-02
**ä¿®å¤é®é¢ï¼**
- [x] ä¿®å¤äºé¨åéå«å,è¿é¨å对æ´ä½é
读影åä¸å¤§æä»¥ä¸åè¿å¤éè¿°ã
- [x] å¢å äºé¡µç
**å¢å /ä¿®æ¹å
容ï¼**
- [x] Javaåºç¡ç¥è¯é¨åèªå¨æè£
箱添å äºä¸ä¸ªåèæç« ã
- [x] æä¾äºå¨çº¿é
è¯»çæ¬ï¼[https://snailclimb.gitee.io/javaguide-interview/#/](https://snailclimb.gitee.io/javaguide-interview/#/)
- [x] è®¡ç®æºåºç¡è¿ä¸ç« èå¢å äºï¼æä½ç³»ç»å¸¸è§é®é¢æ»ç»ï¼è¿ç¯æç« 乿´æ°å¨äºå
¬ä¼å·ï¼[æåé¢è¯å®ä¹é´å
³äºæä½ç³»ç»çä¸åºå¯¹å¼ï¼åäºå¾ä¹
ï¼å¸æå¯¹ä½ æå¸®å©ï¼](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486468&idx=1&sn=7189b610fbb300ed7f5d5b71e331c8f4&chksm=cea243cff9d5cad92819361ed40cabc8607f225e2f5c8f96b393cb95b5731086856349bdc517&token=1220790017&lang=zh_CN#rd)
V3.0â2020-06-16
- [x] ä¿®å¤å¤åºé¨å读è
æå°äºç¬è¯¯
- [x] 第ä¹ç« - **çå®å¤§åé¢è¯ç°åº** å¢å äº **æåé¿éé¢è¯å®ç䏿¬¡éé
(ä¸)**ï¼ä¸ç¯è±äºGuideå¾å¤æ¶é´çæç« ï¼åå¨å
¬ä¼å·ä¸é
è¯»ä¸æ¯è®å¥½ï¼ç»å¯¹å¹²è´§~~~ï¼
- [x] å¢å ä¸ä¼æå¾
ç **Netty 常è§é¢è¯é¢æ»ç»**
- [x] å¢å Javaé¢è¯ç¸å
³ç弿ºé¡¹ç®
- [x] å¢å ç®æ³ç±»é¢è¯ç¸å
³ç弿ºé¡¹ç®
------
# ä¸ å¤æé¢è¯
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
ä¸è®ºæ¯æ ¡æè¿æ¯ç¤¾æé½é¿å
ä¸äºåç§é¢è¯ãç¬è¯ï¼å¦ä½å»åå¤è¿äºä¸è¥¿å°±æ¾å¾æ ¼å¤éè¦ãä¸è®ºæ¯ç¬è¯è¿æ¯é¢è¯é½æ¯æç« å¯å¾ªçï¼æè¿ä¸ªâæç« å¯å¾ªâè¯´çææåªæ¯è¯´åºå¯¹ææ¯é¢è¯æ¯å¯ä»¥æååå¤ã æå
¶å®ç¹å«ä¸å欢é£ç§ä¸´è¿èè¯å°±æåèåè®°ååç§é¢çè¡ä¸ºï¼é常åå¯¹ï¼æè§å¾è¿ç§æ¹æ³ç¹å«æç«¯ï¼èä¸å¨ç¨æä¸ç¹ç»éªçé¢è¯å®é¢åæ¯æ ¹æ¬æ²¡æç¨çãå»ºè®®å¤§å®¶è¿æ¯ä¸æ¥ä¸ä¸ªèå°è¸è¸å®å®å°èµ°ã
## 1.1 å¦ä½åå¤é¢è¯
### 1.1.1 å¦ä½è·å大åé¢è¯æºä¼ï¼
**å¨è®²å¦ä½è·å大åé¢è¯æºä¼ä¹åï¼å
æ¥ç»å¤§å®¶ç§æ®/对æ¯ä¸ä¸ä¸¤ä¸ªæ ¡æé常常è§çæ¦å¿µââæ¥æåç§æã**
1. **æè人æ°** ï¼ç§æå¤äºæ¥æ ï¼
2. **æèæ¶é´** ï¼ ç§æä¸è¬7æå·¦å³å¼å§ï¼å¤§æ¦ä¸ç´æç»å°10æåºã使¯å¤§åï¼å¦BATï¼é½ä¼æ©å¼å§æ©ç»æï¼æä»¥ä¸å®è¦ææ¡å¥½æ¶é´ãæ¥ææä½³æ¶é´ä¸º3æï¼æ¬¡ä½³æ¶é´ä¸º4æï¼è¿å
¥5æåºæ¬å°±ä¸ä¼åææ¥æäºï¼éä¸é¶åï¼ã
3. **åºèé¾åº¦** ï¼ç§æç¥å¤§äºæ¥æï¼
4. **æèå
¬å¸ï¼** ç§ææ°éå¤ï¼èæ¥ææ°éè¾å°ï¼ä¸è¬ä¸ºç§æçè¡¥å
ã
**综ä¸ï¼ä¸è¬æ¥è¯´ï¼ç§æçå«ééææ¾æ¯é«äºæ¥æçã**
**ä¸é¢æå°±è¯´ä¸ä¸æèªå·±ç¥éçä¸äºæ¹æ³ï¼ä¸è¿åºè¯¥ä¹æ¶µçäºå¤§é¨åè·åé¢è¯æºä¼çæ¹æ³ã**
1. **å
³æ³¨å¤§åå®ç½ï¼éæ¶æéç®åï¼èµ°æµç¨çç½ç³ï¼ï¼**
2. **线ä¸åå 宣讲ä¼ï¼ç´æ¥æéç®åï¼**
3. **æ¾å°å¸å
å¸å§/认è¯ç人ï¼å¸®å¿å
æ¨ï¼è½å¤è®©ä½ é¿å¼ç½ç³ç®åçéï¼ç¬è¯çéï¼è¿æ¯æºä¸éçï¼ä¸è¿ä¹è¿æ¯éè¦ä½ çç®å夿£ï¼ï¼**
4. **å客åæè¢«çä¸/Githubä¼ç§å¼æºé¡¹ç®ä½è
ï¼å¤§åå
é¨äººåéè¯·ä½ é¢è¯ï¼**
5. **æ±èç±»ç½ç«æéç®åï¼ä¸æ¯å¤ªæ¨èï¼éåæµ·æï¼ï¼**
é¤äºè¿äºæ¹æ³ï¼æä¹éå°è¿è¿æ ·çç»åï¼æäºå¤§å
¬å¸çä¸äºé¨é¨å¯è½ææ¶æ²¡æå¤äººï¼ç¶åå¦æä½ ç亲ææè
æåå好å¨è¿ä¸ªå
¬å¸ï¼èä½ æ£å¥½åå¨å¯»æ±offerï¼é£ä¹é¢è¯æºä¼åºæ¬ä¸æ¯æäºï¼èä¸è¿ç§é¢è¯çé¾åº¦å¥½åä¸è¬è¿æ®éæ¯å
¶ä»æ£è§é¢è¯ä½å¾å¤ã
### 1.1.2 åå¤èªå·±çèªæä»ç»
èªæä»ç»ä¸è¬æ¯ä½ åé¢è¯å®çç¬¬ä¸æ¬¡é¢å¯¹é¢æ£å¼äº¤æµï¼æ¢ä½æèä¸ä¸ï¼åå¦ä½ æ¯é¢è¯å®çè¯ï¼ä½ æ³å¬å°è¢«ä½ é¢è¯ç人å¦ä½ä»ç»èªå·±å¢ï¼ä¸å®ä¸æ¯å®¢å¥å°è¯´è¯´èªå·±å欢ç¼ç¨ãå¹³æ¶è±äºå¾å¤æ¶é´æ¥å¦ä¹ ãèªå·±çå
´è¶£ç±å¥½æ¯æçå§ï¼
æè§å¾ä¸ä¸ªå¥½çèªæä»ç»åºè¯¥å
å«è¿å ç¹è¦ç´ ï¼
1. ç¨ç®åçè¯è¯´æ¸
æ¥èªå·±ä¸»è¦çææ¯æ äºæ
é¿çé¢åï¼
2. æéç¹æ¾å¨èªå·±å¨è¡çå°æ¹ä»¥åèªå·±çä¼å¿ä¹å¤ï¼
3. éç¹çªåºèªå·±çè½åæ¯å¦èªå·±çå®ä½çbugçè½åç¹å«å害ï¼
ä»ç¤¾æåæ ¡æä¸¤ä¸ªè§åº¦æ¥ä¸¾ä¾åå§ï¼æä¸é¢ç两个ä¾åä»
ä¾åèï¼èªæä»ç»å¹¶ä¸éè¦æ»è®°ç¡¬èï¼è®°ä½è¦è¯´çè¦ç¹ï¼é¢è¯çæ¶åæ ¹æ®å
¬å¸çæ
åµä¸´åºåæ¥ä¹æ¯æ²¡é®é¢çãå¦å¤ï¼ç½ä¸ä¸è¬å»ºè®®çæ¯åå¤å¥½ä¸¤ä»½èªæä»ç»ï¼ä¸ä»½å¯¹hr说çï¼ä¸»è¦è®²è½çªåºèªå·±çç»åï¼ä¼çç¼ç¨ææ¯ä¸è¯å¸¦è¿ï¼å¦ä¸ä»½å¯¹ææ¯é¢è¯å®è¯´çï¼ä¸»è¦è®²èªå·±ä¼çææ¯ç»èå项ç®ç»éªã
**社æï¼**
> é¢è¯å®ï¼æ¨å¥½ï¼æå«ç¬ç§å¿ãæç®åæ1å¹´åçå·¥ä½ç»éªï¼çç»ä½¿ç¨SpringãMyBatisçæ¡æ¶ãäºè§£ Java åºå±åçæ¯å¦JVMè°ä¼å¹¶ä¸æç丰å¯çåå¸å¼å¼åç»éªã离å¼ä¸ä¸å®¶å
¬å¸æ¯å ä¸ºææ³å¨ææ¯ä¸å¾å°æ´å¤çé»ç¼ãå¨ä¸ä¸ä¸ªå
¬å¸æåä¸äºä¸ä¸ªåå¸å¼çµå交æç³»ç»çå¼åï¼è´è´£æå»ºäºæ´ä¸ªé¡¹ç®çåºç¡æ¶æå¹¶ä¸éè¿ååºå表解å³äºåå§æ°æ®åºä»¥åä¸äºç¸å
³è¡¨è¿äºåºå¤§çé®é¢ï¼ç®åè¿ä¸ªç½ç«æé«æ¯æ 10 ä¸äººåæ¶è®¿é®ãå·¥ä½ä¹ä½ï¼æå©ç¨èªå·±çä¸ä½æ¶é´åäºä¸ä¸ªç®åç RPC æ¡æ¶ï¼è¿ä¸ªæ¡æ¶ç¨å°äºNettyè¿è¡ç½ç»éä¿¡ï¼ ç®åæå·²ç»å°è¿ä¸ªé¡¹ç®å¼æºï¼å¨ Github 䏿¶è·äº 2kç Star! 说å°ä¸ä½ç±å¥½çè¯ï¼ææ¯è¾å欢éè¿å客æ´çå享èªå·±æå¦ç¥è¯ï¼ç°å¨å·²ç»æ¯å¤ä¸ªå客平å°ç认è¯ä½è
ã çæ´»ä¸ææ¯ä¸ä¸ªæ¯è¾ç§¯æä¹è§ç人ï¼ä¸è¬ä¼éè¿è¿å¨æççæ¹å¼æ¥æ¾æ¾ãæä¸ç´é½é常æ³å å
¥è´µå
¬å¸ï¼æè§å¾è´µå
¬å¸çæååææ¯æ°å´æé½é叏忬¢ï¼æå¾
è½ä¸ä½ å
±äºï¼
**æ ¡æï¼**
> é¢è¯å®ï¼æ¨å¥½ï¼æå«ç§å¿ã大妿¶é´æä¸»è¦å©ç¨è¯¾å¤æ¶é´å¦ä¹ äº Java 以å SpringãMyBatisçæ¡æ¶ ã卿 ¡æé´åä¸è¿ä¸ä¸ªèè¯ç³»ç»çå¼åï¼è¿ä¸ªç³»ç»ç主è¦ç¨äº SpringãMyBatis å shiro è¿ä¸ç§æ¡æ¶ãæå¨å
¶ä¸ä¸»è¦æ
ä»»å端å¼åï¼ä¸»è¦è´è´£äºæé管çåè½æ¨¡åçæå»ºãå¦å¤ï¼æå¨å¤§å¦çæ¶ååå è¿ä¸æ¬¡è½¯ä»¶ç¼ç¨å¤§èµï¼æåæçå¢éåçå¨çº¿è®¢é¤ç³»ç»æåè·å¾äºç¬¬äºåçæç»©ãæè¿å©ç¨èªå·±çä¸ä½æ¶é´åäºä¸ä¸ªç®åç RPC æ¡æ¶ï¼è¿ä¸ªæ¡æ¶ç¨å°äºNettyè¿è¡ç½ç»éä¿¡ï¼ ç®åæå·²ç»å°è¿ä¸ªé¡¹ç®å¼æºï¼å¨ Github 䏿¶è·äº 2kç Star! 说å°ä¸ä½ç±å¥½çè¯ï¼ææ¯è¾å欢éè¿å客æ´çå享èªå·±æå¦ç¥è¯ï¼ç°å¨å·²ç»æ¯å¤ä¸ªå客平å°ç认è¯ä½è
ã çæ´»ä¸ææ¯ä¸ä¸ªæ¯è¾ç§¯æä¹è§ç人ï¼ä¸è¬ä¼éè¿è¿å¨æççæ¹å¼æ¥æ¾æ¾ãæä¸ç´é½é常æ³å å
¥è´µå
¬å¸ï¼æè§å¾è´µå
¬å¸çæååææ¯æ°å´æé½é叏忬¢ï¼æå¾
è½ä¸ä½ å
±äºï¼
### 1.1.3 ææ¸
æ¥ææ¯é¢å¯è½ä¼é®åªäºæ¹åçé®é¢
ä½ åå¤é¢è¯çè¯é¦å
è¦ææ¸
ææ¯é¢å¯è½ä¼è¢«é®åªäºæ¹åçé®é¢å§ï¼
**æç´æ¥ç¨æç»´å¯¼å¾çå½¢å¼å±ç¤ºåºæ¥å§ï¼è¿æ ·æ´å ç´è§å½¢è±¡ä¸ç¹ï¼ç»åå°æä¸ªç¥è¯ç¹çè¯è¿å¼ 徿²¡æä»ç»å°ï¼ç个æ¬å¿µï¼ä¸ç¯æç« ä¼è¯¦ç»ä»ç»ã**

**ä¸é¢æç»´å¯¼å¾å¤§æ¦æ¶µçäºææ¯é¢è¯å¯è½ä¼è®¾è®¡çææ¯ï¼ä½æ¯ä½ ä¸éè¦æä¸é¢çæ¯ä¸ä¸ªç¥è¯ç¹é½æå¾å¾çæï¼è¦åæ¸
主次ï¼å¯¹äºèªå·±ä¸çæçææ¯ä¸è¦åå¨ç®åä¸ï¼å¯¹äºèªå·±ç®åäºè§£çææ¯ä¸è¦è¯´èªå·±çç»ææ¡ï¼**
### 1.1.4 ä¼é²çè£
å³å¯
穿西è£
ãæé¢å¸¦ãå°ç®éï¼NOï¼NOï¼NOï¼è¿æ¯äºèç½å
¬å¸é¢è¯å䏿¯å»èµ°çº¢æ¯¯ï¼æä»¥ä½ åªéè¦ç©¿çç®å大æ¹å°±å¥½ï¼ä¸éè¦å¤ªæ£å¼ã
### 1.1.5 é身带ä¸èªå·±çæç»©ååç®å
æ ¡æçè¯ï¼æçå
¬å¸å¨é¢è¯åé½ä¼è®©ä½ 交ä¸ä»½æç»©ååç®åå½åé¢è¯ä¸çåèã
### 1.1.6 妿éè¦ç¬è¯å°±æåå·ä¸äºç¬è¯é¢
å¹³æ¶ç©ºé²æ¶é´å¤çå¯ä»¥å·ä¸ä¸ç¬è¯é¢ç®ï¼ç客ç½ä¸æå¾å¤ï¼ã使¯ä¸è¦åªå·é¢è¯é¢ï¼ä¸å¨æcodeï¼ç¨åºå䏿¯ä¸ºäºèè¯èåå¨çã
### 1.1.7 è±æ¶é´ä¸äºé»è¾é¢
é¢è¯ä¸åç°æäºå
¬å¸é½æé»è¾é¢æµè¯ç¯èï¼å¹¶ä¸é½æé»è¾ç¬è¯æç»©ä½ä¸ºå¾éè¦çä¸ä¸ªåèã
### 1.1.8 åå¤å¥½èªå·±ç项ç®ä»ç»
妿æé¡¹ç®çè¯ï¼ææ¯é¢è¯ç¬¬ä¸æ¥ï¼é¢è¯å®ä¸è¬é½æ¯è®©ä½ èªå·±ä»ç»ä¸ä¸ä½ ç项ç®ãä½ å¯ä»¥ä»ä¸é¢å 个æ¹åæ¥èèï¼
1. å¯¹é¡¹ç®æ´ä½è®¾è®¡çä¸ä¸ªæåï¼é¢è¯å®å¯è½ä¼è®©ä½ ç»ç³»ç»çæ¶æå¾ï¼
2. å¨è¿ä¸ªé¡¹ç®ä¸ä½ è´è´£äºä»ä¹ãåäºä»ä¹ãæ
ä»»äºä»ä¹è§è²
3. ä»è¿ä¸ªé¡¹ç®ä¸ä½ å¦ä¼äºé£äºä¸è¥¿ï¼ä½¿ç¨å°äºé£äºææ¯ï¼å¦ä¼äºé£äºæ°ææ¯ç使ç¨
4. å¦å¤é¡¹ç®æè¿°ä¸ï¼æå¥½å¯ä»¥ä½ç°èªå·±ç综åç´ è´¨ï¼æ¯å¦ä½ æ¯å¦ä½åè°é¡¹ç®ç»æåååå¼åçæè
å¨éå°æä¸ä¸ªæ£æçé®é¢çæ¶åä½ æ¯å¦ä½è§£å³çåæè
è¯´ä½ å¨è¿ä¸ªé¡¹ç®ç¨äºä»ä¹ææ¯å®ç°äºä»ä¹åè½æ¯å¦ï¼ç¨redisåç¼åæé«è®¿é®é度åå¹¶åéãä½¿ç¨æ¶æ¯éååå³°åéæµççã
### 1.1.9 æåå夿æ¯é¢è¯
ææ¸
æ¥èªå·±é¢è¯ä¸å¯è½æ¶ååªäºç¥è¯ç¹ãåªäºç¥è¯ç¹æ¯éç¹ãé¢è¯ä¸åªäºé®é¢ä¼è¢«ç»å¸¸é®å°ãèªå·±è¯¥å¦ä½åçã(强ç䏿¨èèé¢ï¼ç¬¬ä¸ï¼éè¿èè¿ç§æ¹å¼ä½ è½è®°ä½å¤å°ï¼è½è®°ä½å¤ä¹
ï¼ç¬¬äºï¼èé¢çæ¹å¼çå¦ä¹ å¾é¾åæä¸å»ï¼)
### 1.1.10 é¢è¯ä¹åå好å®åå¤ä¹
æè°å®åå¤ä¹ å°±æ¯ä¸é¨éå¯¹ä½ è¦é¢è¯çå
¬å¸æ¥å¤ä¹ ãæ¯å¦ä½ å¨é¢è¯ä¹åå¯ä»¥å¨ç½ä¸æ¾æ¾ææ²¡æä½ è¦é¢è¯çå
¬å¸çé¢ç»ã
举个æ åï¼å¨æé¢è¯ ThoughtWorks çåå 天æå°±å¨ç½ä¸æ¾äºä¸äºå
³äº ThoughtWorks çææ¯é¢çä¸äºæç« ãç¶åç¥éäº ThoughtWorks çææ¯é¢ä¼è®©æä»¬å¨ä¹ååçä½ä¸çåºç¡ä¸å¢å ä¸ä¸ªæä¸¤ä¸ªåè½ï¼æä»¥ææåä¸å¤©å°±ææä¹ååçç¨åºéæ°éæäºä¸ä¸ãç¶å卿æ¯é¢çæ¶åï¼ç®åçæ¹äºå è¡ä»£ç ä¹åå个æµè¯å°±å®äºäºãå¦ææ²¡ææååå¤ï¼æè§å¾ 20 åéæå¾å¤§å çä¼å®ä¸æè¿é¡¹ä»»å¡ã
### 1.1.11 é¢è¯ä¹åè®°å¾å¤ç
å¦æå¤±è´¥ï¼ä¸è¦ç°å¿ï¼å¦æéè¿ï¼åå¿çåãé¢è¯åå·¥ä½å®é
䏿¯ä¸¤åäºï¼å¯è½å¾å¤é¢è¯æªéè¿ç人ï¼å·¥ä½è½åæ¯ä½ 强çå¤ï¼åä¹äº¦ç¶ãæä¸ªäººè§å¾é¢è¯ä¹åæ¯ä¸åºå
¨æ°çå¾ç¨ï¼å¤±è´¥åèå©é½æ¯å¹³å¸¸ä¹äºãæä»¥ï¼ååä½ä¸è¦å 为é¢è¯å¤±è´¥èç°å¿ã丧失æå¿ãä¹ä¸è¦å 为é¢è¯éè¿è沾沾èªåï¼çå¾
ä½ çå°æ¯æ´ç¾å¥½çæªæ¥ï¼ç»§ç»å æ²¹ï¼
## 1.2 ç¨åºåç®åå°±è¯¥è¿æ ·å
æ¬ç¯æç« é¤äºæå¤§å®¶ç¨Markdownå¦ä½åä¸ä»½ç¨åºåä¸å±çç®åï¼åé¢è¿ä¼ç»å¤§å®¶æ¨èä¸äºä¸éçç¨æ¥åMarkdownç®åç软件æè
ç½ç«ï¼ä»¥åå¦ä½ä¼é
çå°Markdownæ ¼å¼è½¬å为PDFæ ¼å¼æè
å
¶ä»æ ¼å¼ã
æ¨è大家使ç¨Markdownè¯æ³åç®åï¼ç¶ååå°Markdownæ ¼å¼è½¬æ¢ä¸ºPDFæ ¼å¼åè¿è¡ç®åæéã
å¦æä½ å¯¹Markdownè¯æ³ä¸å¤ªäºè§£çè¯ï¼å¯ä»¥è±åä¸ªå°æ¶ç®åçä¸ä¸Markdownè¯æ³è¯´æ: http://www.markdown.cn ã
### 1.2.1 为ä»ä¹è¯´ç®åå¾éè¦ï¼
ä¸ä»½å¥½çç®åå¯ä»¥å¨æ´ä¸ªç³è¯·é¢è¯ä»¥åé¢è¯è¿ç¨ä¸èµ·å°é常好çä½ç¨ã å¨ä¸å¤¸å¤§èªå·±è½åçæ
åµä¸ï¼ååºä¸ä»½å¥½çç®å乿¯ä¸é¡¹å¾æ£çè½åã为ä»ä¹è¯´ç®åå¾éè¦å¢?
**å
ä»é¢è¯åæ¥è¯´ï¼**
- åå¦ä½ æ¯ç½ç³ï¼ä½ çç®åå¿
ç¶ä¼ç»è¿HRççéï¼ä¸å¼ ç®åHRå¯è½ä¹å°±è±è´¹10ç§éçä¸ä¸ï¼ç¶åHRå°±ä¼å³å®ä½ è¿ä¸å
³æ¯Failè¿æ¯Passã
- åå¦ä½ æ¯å
æ¨ï¼å¦æä½ çç®å没æä»ä¹ä¼å¿çè¯ï¼å°±ç®æ¯å
æ¨ä½ ç人åç¨å¿ï¼ä¹æ è½ä¸ºåã
å¦å¤ï¼å°±ç®ä½ éè¿äºçéï¼åé¢çé¢è¯ä¸ï¼é¢è¯å®ä¹ä¼æ ¹æ®ä½ çç®åæ¥å¤æä½ ç©¶ç«æ¯å¦å¼å¾ä»è±è´¹å¾å¤æ¶é´å»é¢è¯ã
æä»¥ï¼ç®å就忝æä»¬çä¸ä¸ªé¨é¢ä¸æ ·ï¼å®å¨å¾å¤§ç¨åº¦ä¸å³å®äºä½ è½å¦è¿å
¥å°ä¸ä¸è½®çé¢è¯ä¸ã
**åä»é¢è¯ä¸æ¥è¯´ï¼**
æåç°å¤§å®¶æ¯è¾å欢çé¢ç» ï¼è¿ç¹æ å¯åéï¼ä½æ¯å¤§é¨åé¢ç»é½æ²¡åè¯ä½ å¾å¤é®é¢é½æ¯å¨ç¹å®æ¡ä»¶ä¸æé®çã举个ç®åçä¾åï¼ä¸è¬æ
åµä¸ä½ çç®å䏿³¨æä½ ä¼çä¸è¥¿æä¼è¢«é®å°ï¼Javaãæ°æ®ç»æãç½ç»ãç®æ³è¿äºåºç¡æ¯æ¯ä¸ªäººå¿
é®çï¼ï¼æ¯å¦åäºä½ ä¼ redis,é£é¢è¯å®å°±å¾å¤§æ¦çä¼é®ä½ redis çä¸äºé®é¢ãæ¯å¦ï¼redisçå¸¸è§æ°æ®ç±»åååºç¨åºæ¯ãredisæ¯å线ç¨ä¸ºä»ä¹è¿è¿ä¹å¿«ã redis å memcached çåºå«ãredis å
åæ·æ±°æºå¶ççã
æä»¥ï¼é¦å
ï¼ä½ è¦æç¡®çä¸ç¹æ¯ï¼**ä½ ä¸ä¼çä¸è¥¿å°±ä¸è¦åå¨ç®åä¸**ãå¦å¤ï¼**ä½ è¦èèä½ è¯¥å¦ä½æè½è®©ä½ ç亮ç¹å¨ç®åä¸å¸æ¾åºæ¥**ï¼æ¯å¦ï¼ä½ 卿æé¡¹ç®åäºä»ä¹äºæ
è§£å³äºä»ä¹é®é¢ï¼åªè¦æé¡¹ç®å°±ä¸å®æè¦è§£å³çé®é¢ï¼ãä½ çæä¸ä¸ªé¡¹ç®é使ç¨äºä»ä¹ææ¯åæ´ä½æ§è½åå¹¶åéæåäºå¾å¤ççã
é¢è¯å工使¯ä¸¤åäºï¼èªæçäººä¼æé¢è¯å®å¾èªå·±æ
é¿çé¢åé¢ï¼å
¶ä»äººå被é¢è¯å®çµçé¼»åèµ°ãè½è¯´é¢è¯å工使¯ä¸¤åäºï¼ä½æ¯ä½ è¦æ³è¦è·å¾èªå·±æ»¡æç offer ï¼ä½ èªèº«çå®åå¿
é¡»è¦å¼ºã
### 1.2.2 å
³äºç®åä½ å¿
é¡»ç¥éçç¹
1. 大é¨åå
¬å¸çHRé½è¯´æä»¬ä¸çéå¦åï¼éªä½ çï¼ï¼ï¼ä½æ¯å¦æä½ ç妿 ¡ä¸åºä¼çè¯ï¼å¾é¾å¨ä¸å ç®åä¸è±é¢èåºï¼é¤éä½ çç®å䏿ç¹å«ç亮ç¹ï¼æ¯å¦ï¼ææå¤§åçå®ä¹ ç»åãè·å¾äºææå¤§èµçå¥ççã
2. **大é¨ååºå±çæ¾å·¥ä½çç¡¬ä¼¤æ¯æ²¡æå·¥ä½ç»éªæå®ä¹ ç»åï¼æä»¥å¦æä½ æ¯åºå±çå°±ä¸è¦éè¿ç§æåæ¥æã䏿¦éè¿ï¼ä½ åé¢å°±æå¤§å¯è½ä¼é¢ä¸´ç¤¾æï¼è¿ä¸ªæ¶å没æå·¥ä½ç»éªçä½ å¯è½å°±ä¼é¢ä¸´åç§ç¢°å£ï¼å¯¼è´æ¾ä¸å°ä¸ä¸ªå¥½çå·¥ä½**
3. **åå¨ç®åä¸çä¸è¥¿ä¸å®è¦æ
éï¼è¿æ¯é¢è¯å®å¤§éæé®çå°æ¹ï¼**
4. **å°èªå·±ç项ç®ç»åå®ç¾çå±ç¤ºåºæ¥é常éè¦ã**
### 1.2.3 åç®åå¿
é¡»äºè§£ç两大æ³å
#### STARæ³åï¼Situation Task Action Resultï¼
- **Situationï¼** äºæ
æ¯å¨ä»ä¹æ
åµä¸åçï¼
- **Task:ï¼** ä½ æ¯å¦ä½æç¡®ä½ çä»»å¡çï¼
- **Actionï¼** éå¯¹è¿æ ·çæ
åµåæï¼ä½ éç¨äºä»ä¹è¡å¨æ¹å¼ï¼
- **Resultï¼** ç»æææ ·ï¼å¨è¿æ ·çæ
åµä¸ä½ å¦ä¹ å°äºä»ä¹ã
ç®èè¨ä¹ï¼STARæ³åï¼å°±æ¯ä¸ç§è®²è¿°èªå·±æ
äºçæ¹å¼ï¼æè
è¯´ï¼æ¯ä¸ä¸ªæ¸
æ°ãæ¡ççä½ææ¨¡æ¿ãä¸ç®¡æ¯ä»ä¹ï¼åççç»è¿ç¨æ¤æ³åï¼å¯ä»¥è½»æ¾ç对é¢è¯å®æè¿°äºç©çé»è¾æ¹å¼ï¼è¡¨ç°åºèªå·±åæéè¿°é®é¢çæ¸
æ°æ§ãæ¡çæ§åé»è¾æ§ã
#### FAB æ³åï¼Feature Advantage Benefitï¼
- **Featureï¼** æ¯ä»ä¹ï¼
- **Advantageï¼** æ¯å«äººå¥½å¨åªäºå°æ¹ï¼
- **Benefitï¼** 妿éä½£ä½ ï¼æèæ¹ä¼å¾å°ä»ä¹å¥½å¤ã
ç®åæ¥è¯´ï¼è¿ä¸ªæ³åä¸»è¦æ¯è®©ä½ çé¢è¯å®ç¥éä½ çä¼å¿ãæäºä½ ä¹å对å
¬å¸æä»ä¹å¸®å©ã
### 1.2.4 项ç®ç»åæä¹åï¼
ç®å䏿ä¸ä¸¤ä¸ªé¡¹ç®ç»å徿£å¸¸ï¼ä½æ¯çæ£è½æé¡¹ç®ç»åå¾å¥½çå±ç¤ºç»é¢è¯å®çé常å°ã对äºé¡¹ç®ç»å大家å¯ä»¥èèä»å¦ä¸å ç¹æ¥åï¼
1. å¯¹é¡¹ç®æ´ä½è®¾è®¡çä¸ä¸ªæå
2. å¨è¿ä¸ªé¡¹ç®ä¸ä½ è´è´£äºä»ä¹ãåäºä»ä¹ãæ
ä»»äºä»ä¹è§è²
3. ä»è¿ä¸ªé¡¹ç®ä¸ä½ å¦ä¼äºé£äºä¸è¥¿ï¼ä½¿ç¨å°äºé£äºææ¯ï¼å¦ä¼äºé£äºæ°ææ¯ç使ç¨
4. å¦å¤é¡¹ç®æè¿°ä¸ï¼æå¥½å¯ä»¥ä½ç°èªå·±ç综åç´ è´¨ï¼æ¯å¦ä½ æ¯å¦ä½åè°é¡¹ç®ç»æåååå¼åçæè
å¨éå°æä¸ä¸ªæ£æçé®é¢çæ¶åä½ æ¯å¦ä½è§£å³çåæè
è¯´ä½ å¨è¿ä¸ªé¡¹ç®ç¨äºä»ä¹ææ¯å®ç°äºä»ä¹åè½æ¯å¦:ç¨redisåç¼åæé«è®¿é®é度åå¹¶åéãä½¿ç¨æ¶æ¯éååå³°åéæµççã
### 1.2.5 ä¸ä¸æè½è¯¥æä¹åï¼
å
é®ä¸ä¸ä½ èªå·±ä¼ä»ä¹ï¼ç¶åççä½ æåçå
¬å¸éè¦ä»ä¹ãä¸è¬HRå¯è½å¹¶ä¸å¤ªæææ¯ï¼æä»¥ä»å¨çéç®åçæ¶åå¯è½å°±ç¯çä½ ä¸ä¸æè½çå
³é®è¯æ¥çã对äºå
¬å¸æè¦æ±èä½ ä¸ä¼çæè½ï¼ä½ å¯ä»¥è±å 天æ¶é´å¦ä¹ ä¸ä¸ï¼ç¶åå¨ç®åä¸å¯ä»¥åä¸èªå·±äºè§£è¿ä¸ªæè½ãæ¯å¦ä½ å¯ä»¥è¿æ ·å(ä¸é¢è¿é¨åå
容æèªæçç®åï¼å¤§å®¶å¯ä»¥æ ¹æ®èªå·±çæ
åµåä¸äºä¿®æ¹åå®å)ï¼
- è®¡ç®æºç½ç»ãæ°æ®ç»æãç®æ³ãæä½ç³»ç»ç课å
åºç¡ç¥è¯ï¼ææ¡
- Java åºç¡ç¥è¯ï¼ææ¡
- JVM èææºï¼Javaå
ååºåãèææºåå¾ç®æ³ãèæå徿¶éå¨ãJVMå
å管çï¼ï¼ææ¡
- é«å¹¶åãé«å¯ç¨ã髿§è½ç³»ç»å¼åï¼ææ¡
- Struts2ãSpringãHibernateãAjaxãMybatisãJQuery ï¼ææ¡
- SSH æ´åãSSM æ´åã SOA æ¶æï¼ææ¡
- Dubboï¼ ææ¡
- Zookeeper: ææ¡
- å¸¸è§æ¶æ¯éå: ææ¡
- Linuxï¼ææ¡
- MySQL常è§ä¼åææ®µï¼ææ¡
- Spring Boot +Spring Cloud +Docker:äºè§£
- Hadoop çæç¸å
³ææ¯ä¸ç HDFSãStormãMapReduceãHiveãHbase ï¼äºè§£
- Python åºç¡ãä¸äºå¸¸è§ç¬¬ä¸æ¹åºæ¯å¦OpenCVãwxpyãwordcloudãmatplotlibï¼çæ
### 1.2.6 æç注æäºé¡¹
1. å°½éç®æ´ï¼ä¸è¦å¤ªè±éè¡å¨ï¼
2. ä¸äºææ¯åè¯ä¸è¦å¼éäºå¤§å°åæ¯å¦MySQLä¸è¦åæmysqlï¼Javaä¸è¦åæjavaãè¿ä¸ªå¨æçæ¥è¿æ¯æ¯è¾å¿è®³çï¼æä»¥ä¸å®è¦æ³¨æè¿ä¸ªç»èï¼
3. 䏿忰åè±æä¹é´å ä¸ç©ºæ ¼çè¯çèµ·æ¥ä¼èæä¸ç¹ï¼
### 1.2.7 å
¶ä»çä¸äºå°tips
1. å°½éé¿å
主è§è¡¨è¿°ï¼å°ä¸ç¹è¯ä¹æ¨¡ç³ç形容è¯ï¼å°½éè¦ç®æ´æäºï¼é»è¾ç»ææ¸
æ°ã
2. 妿èªå·±æå客æè
ä¸ªäººææ¯æ ç¹çè¯ï¼åä¸å»ä¼ä¸ºä½ å åå¾å¤ã
3. 妿èªå·±çGithubæ¯è¾æ´»è·çè¯ï¼åä¸å»ä¹ä¼ä¸ºä½ å åå¾å¤ã
4. 注æç®åç宿§ï¼ä¸å®ä¸è¦åèªå·±ä¸ä¼çä¸è¥¿ï¼æè
å¸¦ææ¬ºéªæ§çå
容
5. 项ç®ç»å建议以æ¶é´ååºæåºï¼å¦å¤é¡¹ç®ç»åä¸å¨äºå¤ï¼èå¨äºæäº®ç¹ã
6. 妿å
容è¿å¤çè¯ï¼ä¸éè¦éæå
容å缩å°ä¸é¡µï¼ä¿ææç干忴æ´å°±å¯ä»¥äºã
7. ç®åæåæå¥½è½å ä¸ï¼âæè°¢æ¨è±æ¶é´é
读æçç®åï¼æå¾
è½ææºä¼åæ¨å
±äºãâè¿å¥è¯ï¼æ¾çä½ ä¼å¾æç¤¼è²ã
### 1.2.8 æ¨èçå·¥å
·/ç½ç«
- å·çç®å(MarkDownå¨çº¿ç®åå·¥å
·ï¼å¯å¨çº¿é¢è§ãç¼è¾åçæPDF):
- Typora+[Javaç¨åºåç®å模æ¿](https://github.com/geekcompany/ResumeSample/blob/master/java.md)
## 1.3 大é¨åç¨åºåå¨é¢è¯åå¾å
³å¿çä¸äºé®é¢
身边çæåæè
å
¬ä¼å·çç²ä¸å¾å¤äººé½åæè¯¢é®è¿:âææ¯åé/䏿¬/ä¸ç§å¦æ ¡çï¼æææºä¼è¿å
¥å¤§ååï¼âãâéè®¡ç®æºä¸ä¸çå¦çè½å¦å¥½åï¼âãâå¦ä½å¦ä¹ Javaï¼âãâJavaå¦ä¹ 该å¦é£äºä¸è¥¿ï¼âãâæè¯¥å¦ä½åå¤Javaé¢è¯ï¼â......è¿äºæ¹é¢çé®é¢ãæä¼æ ¹æ®èªå·±çä¸ç¹ç»éªå¯¹å¤§é¨å人å
³å¿çè¿äºé®é¢è¿è¡ççè§£æã
**叿è¿ç¯å¯ä»¥ç»å·²ç»å¨Javaæ¹åèµ°äºå å¹´çæåæè
æ£å¨åå¤å¾Javaå端æ¹ååå±çæå们ä¸ç¹å¸®å©ãéçæäºå¦ææ²¡æå®é
è¡å¨ï¼é£è¿ç¯æç« å¯¹ä½ æè®¸æ²¡æä»»ä½æä¹ã**
**妿è§å¾å
容ä¸éçè¯ï¼å¯ä»¥å享ç»å°æååè®©ä½ çæåçå°ï¼æè°¢ï¼**
### 1.3.1 ææ¯åé/䏿¬/ä¸ç§å¦æ ¡çï¼æææºä¼è¿å
¥å¤§ååï¼
æèªå·±ä¹æ¯é985é211妿 ¡çï¼ç»åèªå·±çç»å以åä¸äºæåçç»åï¼æè§å¾è®©æåçè¿ä¸ªé®é¢å好ä¸è¿ã
é¦å
ï¼æè§å¾å¦æ ¡æ§è§å¾æ£å¸¸ï¼çç太æ£å¸¸äºï¼å¦æè¦æ±æ¨çè¯ï¼ä½ åªè½æ±æ¨èªå·±æ²¡æè¿å
¥åæ ¡ã使¯ï¼åä¸ä¸è¦å¨ä¸å¨è¯´èªå·±å¦æ ¡å·®ï¼å¨ä¸å¨æ¿èªå·±å¦æ ¡å½åèªå·±è¿ä¸äºå¤§åçåå£ï¼å¦ååªæ¯çéç®åçå¾å¤æ åä¸çä¸ä¸ªèå·²ï¼å¦æä½ å¤ä¼ç§ï¼ç®åå¤ä¸°å¯ï¼ä½ ä¹ä¸æ ·å¯ä»¥ååæ ¡åå¦ä¸èµ·åå°ç«äºã
ä¼ä¸HRè¯å®æ¯æ´å欢é«å¦åçäººï¼æ¯ç«985ï¼211ä¼ç§äººææ¯ä¾è¯å®æ¯æ®é妿 ¡é«å¾å¤ï¼HRå¢éè¯å®ä¼ä¼å
å¨è¿äºå¦æ ¡ééãè¿å°±å¥½æ¯ç¸äº²ï¼ä½ æ¯æ¿æå¨å¾å¤ä¼ç§ç人ä¸éä¸ä¸ªä¼ç§çï¼è¿æ¯æ¿æå¨å¾å¤æ®éç人ä¸éä¸ä¸ªä¼ç§çå¢ï¼
ãã
å鿬ç§çè³æ¯äºæ¬ã䏿¬çè³æ¯ä¸ç§çåå¦ä¹æå¾å¤è¿å
¥å¤§åçï¼ä¸è¿æ¯çç¸æ¯äºåæ ¡çä½å¾å¤èå·²ãä»å¤§åæèçç»æä¸çï¼é«å¦å人æçæ°éå æ®å¤§å¤´ï¼é£äºæåè¿å
¥BATãç¾å¢ï¼äº¬ä¸ï¼ç½æç大åçå鿬ç§çè³æ¯äºæ¬ã䏿¬çè³æ¯ä¸ç§çåå¦å¾å¾æ¯å 为å
·å¤ä¸°å¯ç项ç®ç»åæè
å¨æä¸ªå«é鿝è¾é«çç«èµæ¯å¦ACMä¸åå¾äºä¸éçæç»©ã**ä¸é¨åå¦åä¸çªåºä½è½ååºä¼çé¢è¯è
è½å¤è¿å
¥å¤§å并䏿¯è¯´æå¦åä¸éè¦ï¼èæ¯å¦åç软èè½å¤éè¿å
¶ä»çä¼å¿æ¥å¼¥è¡¥ã** æä»¥ï¼å¦æä½ ç妿 ¡ä¸å¤å¥½èä½ èªå·±åæ³å»å¤§åçè¯ï¼å»ºè®®ä½ å¯ä»¥ä»è¿å ç¹æ¥åï¼**â å°½éå¨é¢è¯åæå¥½æä¸ä¸ªå¯ä»¥æ¿çåºæç项ç®ï¼â¡æå®ä¹ æ¡ä»¶çè¯ï¼å°½æ©åºå»å®ä¹ ï¼å®ä¹ ç»åä¹ä¼æ¯ä½ çç®åçä¸ä¸ªäº®ç¹ï¼æè½åå¨å¤§åå®ä¹ æä½³ï¼ï¼ï¼â¢åå ä¸äºå«é鿝è¾é«çæ¯èµï¼æ¿ä¸æ¿å¾å°å次没å
³ç³»ï¼éå¨é»ç¼ã**
### 1.3.2 éè®¡ç®æºä¸ä¸çå¦çè½å¦å¥½Javaåå°åï¼æè½è¿å¤§ååï¼
å½ç¶å¯ä»¥ï¼ç°å¨éç§ççç¨åºåå¾å¤ï¼å¾å¤§ä¸é¨ååå æ¯äºèç½è¡ä¸çå·¥èµæ¯è¾é«ãæä»¬å¦æ ¡å¤é¢çå¹è®çéé¢90%齿¯éç§çï¼æè§å¾ä»ä»¬å¾å¤äººå¦çé½è¿ä¸éãå¦å¤ï¼æçä¸ä¸ªæåæ¬ç§æ¯æºæ¢°ä¸ä¸ï¼å¤§ä¸å¼å§èªå¦å®åï¼ææ¯è´¼æºï¼å¨æçæ¥ä»æ¯å¤§é¨åæ¬ç§æ¯è®¡ç®æºçåå¦å¦çè¿è¦å¥½ãåèQuestion1çåçï¼å³ä½¿ä½ æ¯éç§çç¨åºåï¼å¦æä½ æ³è¿å
¥å¤§åçè¯ï¼ä½ ä¹å¯ä»¥éè¿èªå·±çå
¶ä»ä¼å¿æ¥å¼¥è¡¥ã
æè§å¾æä»¬ä¸åºè¯¥å 为èªå·±çä¸ä¸ç»èªå·±åçéæè
è´´æ ç¾ï¼è¯´å®è¯ï¼å¾å¤ç§ççåå¦å¯è½å¹¶ä¸å¦ä½ ï¼ä½ 以为ç§ççåå¦å°±ä¼è®¤çå¬è®²åï¼è¿ä¸æ¯å ä¹å
¨é èªå·±è¯¾ä¸èªå¦ï¼ä¸è¿å¦æä½ æ¯éç§ççè¯ï¼ä½ æ³è¦å¦å¥½ï¼é£ä¹æ³¨å®å°±è¦èå¼èªå·±æ¬ä¸ä¸çä¸äºå¦ä¹ æ¶é´ï¼è¿æ¯æ å¯åéçã
建议éç§ççåå¦ï¼é¦å
è¦æå¥½è®¡ç®æºåºç¡ç¥è¯åºç¡ï¼â è®¡ç®æºç½ç»ãâ¡æä½ç³»ç»ãâ¢æ°æ®ç»æä¸ç®æ³ï¼æä¸ªäººè§å¾è¿3ä¸ªå¯¹ä½ æéè¦ãè¿äºä¸è¥¿å°±åæ¯å
åï¼å¯¹ä½ 以åçé¿è¿åå±é常æç¨ãå½ç¶ï¼å¦æä½ æ³è¦è¿å¤§åçè¯ï¼è¿äºç¥è¯ä¹æ¯ä¸å®ä¼è¢«é®å°çãå¦å¤ï¼âä¸å®å¦å¥½æ°æ®ç»æä¸ç®æ³ï¼ä¸å®å¦å¥½æ°æ®ç»æä¸ç®æ³ï¼ä¸å®å¦å¥½æ°æ®ç»æä¸ç®æ³ï¼âï¼éè¦çä¸è¥¿è¯´3éã
### 1.3.3 å¦ä½å¦å¥½Javaå端å¢?
**对äºå¦ä¹ 路线çè¯ï¼æè¯´ä¸æ¡ææ¯è¾æ¨èçï¼æç¸ä¿¡ç
§çè¿æ¡å¦ä¹ 路线æ¥ä½ çå¦ä¹ æçä¼é常é«ãä¸é¢æå°ç书ç±ä»¥åç¸å
³å¦ä¹ è§é¢é½çä¸»å·²ç»æ´ç好ï¼å
¬ä¼å·JavaGuideåå°åå¤å
³é®â1âå³å¯é¢åã**
1. **ææ¡ Java åºç¡ç¥è¯**ï¼å¯ä»¥çãJava æ ¸å¿ææ¯å·1ãæè
ãHead First Javaãè¿ä¸¤æ¬ä¹¦å¨æçæ¥é½æ¯å
¥é¨Javaçå¾ä¸éç书ç±ï¼ï¼å½ç¶ä½ ä¹å¯ä»¥è¾¹çè§é¢è¾¹ç书å¦ä¹ ï¼æ¨èé»é©¬æè
å°ç¡
è°·çè§é¢ï¼ã**è®°å¾å¤æ»ç»ï¼æå¥½åºç¡ï¼æèªå·±éè¦çä¸è¥¿é½è®°å½ä¸æ¥ã**
2. **ææ¡å¤çº¿ç¨çç®åå®ç¨**ï¼æ¨èãJavaå¹¶åç¼ç¨ä¹ç¾ãæè
ã宿Javaé«å¹¶åç¨åºè®¾è®¡ãï¼ã
3. **ï¼å¯éï¼**å¦æä½ æ³è¿å
¥å¤§åçè¯ï¼ææ¨èä½ å¨å¦ä¹ å®Javaåºç¡æè
å¤çº¿ç¨ä¹åï¼å°±å¼å§æ¯å¤©æ½åºä¸ç¹æ¶é´æ¥å¦ä¹ **ç®æ³åæ°æ®ç»æ**ãä¸ºäºæé«èªå·±çç¼ç¨è½åï¼ä½ ä¹å¯ä»¥åæå·**Leetcodeã**
4. **å¦ä¹ å端åºç¡(HTMLãCSSãJavaScript),å½ç¶BootStrapãVUEççåç«¯æ¡æ¶ä½ ä¹å¯ä»¥äºè§£ä¸ä¸ã**
5. **å¦ä¹ MySQL çåºæ¬ä½¿ç¨ï¼åºæ¬çå¢å æ¹æ¥ï¼SQLå½ä»¤ï¼ç´¢å¼ãåå¨è¿ç¨è¿äºé½å¦ä¸ä¸å§ï¼**
6. 建议å¦ä¹ J2eeæ¡æ¶ä¹åå¯ä»¥æåè±å天æ¶é´å¦ä¹ ä¸ä¸**Maven**ç使ç¨ãï¼å°å¤æ¾Jarå
ï¼ä¸è½½Jarå
æ¯çç麻ç¦è´¹äºï¼ä½¿ç¨Mavenå¯ä»¥ä¸ºä½ çå¾å¤äºæ
ï¼
7. **å¦ä¹ Struts2(å¯ä¸ç¨å¦)ãSpringãSpringMVCãHibernateãMybatis çæ¡æ¶ç使ç¨ï¼**(å¯é)çæ **Spring åç**ï¼å¤§åé¢è¯å¿
å¤ï¼ï¼ç¶å**徿å¿
è¦å¦ä¹ ä¸ä¸SpringBoot**ãæä¹éå°å¾å¤å
¬å¸å¯¹äºåºå±çç´æ¥ä¸æ**SpringBoot**ï¼ä¸è¿æè¿æ¯æ¨èä½ æ**SpringãSpringMVC**好好å¦ä¸ä¸ã
8. å¦ä¹ **Linux**çåºæ¬ä½¿ç¨(常è§å½ä»¤ãåºæ¬æ¦å¿µ)
9. å¦ä¹ **DubboãZookeeper**ã常è§ç**æ¶æ¯éå**ï¼æ¯å¦**ActiveMqãRabbitMQ**ï¼ç使ç¨.ï¼è¿äºä¸è¥¿å¯ä»¥éè¿é»é©¬æåä¸ä¸ªåå¸å¼é¡¹ç®æ¥å¦ï¼è¾¹çè§é¢ï¼è¾¹èªå·±åï¼æ¥é
ç½ä¸åå®¢ï¼æææ´å¥½ï¼
10. å¯ä»¥å¦ä¹ ä¸ä¸**NIO**å**Netty,**è¿æ ·ç®åä¸ä¹å¯ä»¥å¤ç¹ä¸è¥¿ã
11. (å¯é)ï¼å¦ææ³å»å¤§åï¼**JVM** çä¸äºç¥è¯ä¹æ¯å¿
å¦çï¼**Javaå
ååºåãèææºåå¾ç®æ³ãèæå徿¶éå¨ãJVMå
å管ç**ï¼æ¨èãæ·±å
¥çè§£Javaèææºï¼JVMé«çº§ç¹æ§ä¸æä½³å®è·µï¼ææ°ç¬¬äºçãï¼å¦æå«ç书麻ç¦çè¯ï¼ä½ ä¹å¯ä»¥çææ´ççææ¡£ï¼å¨ä¸é¢æé¾æ¥ã
æä¸é¢ä¸»è¦æ¦æ¬ä¸ä¸æ¯ä¸æ¥è¦å¦ä¹ çå
容ï¼å¯¹å¦ä¹ è§åæä¸ä¸ªå»ºè®®ãç¥éè¦å¦ä»ä¹ä¹åï¼å¦ä½å»å¦å¢ï¼æè§å¾å¦ä¹ æ¯ä¸ªç¥è¯ç¹å¯ä»¥èèè¿æ ·å»å
¥æï¼**å®ç½ï¼å¤§æ¦çæ¯è±æï¼ä¸æ¨èåå¦è
çï¼**ã**书ç±ï¼ç¥è¯æ´å ç³»ç»å®å
¨ï¼æ¨èï¼**ã**è§é¢ï¼æ¯è¾å®¹æçè§£ï¼æ¨èï¼ç¹å«æ¯åå¦çæ¶åï¼**ã**ç½ä¸å客ï¼è§£å³æä¸ç¥è¯ç¹çé®é¢çæ¶åå¯ä»¥ççï¼**ã
è¿éç»åä½ä¸ä¸ªå»ºè®®ï¼çè§é¢çè¿ç¨ä¸æå¥½è·çä¸èµ·ç»ï¼è¦åç¬è®°ï¼ï¼ï¼æå¥½å¯ä»¥è¾¹çè§é¢è¾¹æ¾ä¸æ¬ä¹¦ç±çï¼çè§é¢æ²¡å¼æçç¥è¯ç¹ä¸å®è¦å°½å¿«è§£å³ï¼å¦ä½è§£å³ï¼é¦å
ç¾åº¦/Googleï¼éè¿æç´¢å¼æè§£å³ä¸äºçè¯å°±æ¾èº«è¾¹çæåæè
认è¯çä¸äºäººã
### 1.3.4 ææ²¡æå®ä¹ ç»åçè¯æ¾å·¥ä½æ¯ä¸æ¯ç¹å«è°é¾ï¼
没æå®ä¹ ç»å没å
³ç³»ï¼åªè¦ä½ ææ¿å¾åºæçé¡¹ç®æè
大èµç»åçè¯ï¼ä½ ä¾ç¶æå¯è½æ¿å°å¤§åç offer ãç¬ä¸»å½æ¶æ¾å·¥ä½çæ¶å就没æå®ä¹ ç»å以å大èµè·å¥ç»åï¼å纯就æ¯ååèªå·±ç项ç®ç»éªæèµ·äºæ´ä¸ªé¢è¯ã
å¦æä½ æ¢æ²¡æå®ä¹ ç»åï¼åæ²¡ææ¿å¾åºæçé¡¹ç®æè
大èµç»åçè¯ï¼æè§å¾å¨ç®åå
³é¤éä½ æå
¶ä»ç¹å«ç亮ç¹ï¼ä¸ç¶ï¼ä½ åºè¯¥å°±ä¼è¢«å·ã
### 1.3.5 æè¯¥å¦ä½åå¤é¢è¯å¢ï¼é¢è¯ç注æäºé¡¹æåªäºå¢ï¼
ä¸é¢æ¯ææ»ç»çä¸äºåå¤é¢è¯çTips以åé¢è¯å¿
å¤ç注æäºé¡¹ï¼
1. **åå¤ä¸ä»½èªå·±çèªæä»ç»ï¼é¢è¯çæ¶åæ ¹æ®é¢è¯å¯¹è±¡éå½è¿è¡ä¿®æ¹**ï¼çªåºéç¹ï¼çªåºèªå·±çä¼å¿å¨åªéï¼åå¿æµæ°´è´¦ï¼ï¼
2. **注æé身带ä¸èªå·±çæç»©ååç®åå¤å°ä»¶ï¼** ï¼æçå
¬å¸å¨é¢è¯åé½ä¼è®©ä½ 交ä¸ä»½æç»©ååç®åå½åé¢è¯ä¸çåèãï¼
3. **妿éè¦ç¬è¯å°±æåå·ä¸äºç¬è¯é¢ï¼å¤§é¨åå¨çº¿ç¬è¯çç±»åæ¯éæ©é¢+ç¼ç¨é¢ï¼æçè¿ä¼æç®çé¢ã**ï¼å¹³æ¶ç©ºé²æ¶é´å¤çå¯ä»¥å·ä¸ä¸ç¬è¯é¢ç®ï¼ç客ç½ä¸æå¾å¤ï¼ï¼ä½æ¯ä¸è¦åªå·é¢è¯é¢ï¼ä¸å¨æcodeï¼ç¨åºå䏿¯ä¸ºäºèè¯èåå¨çãï¼å¦å¤ï¼æ³¨ææéç¹ï¼å 为é¢ç®å¤ªå¤äºï¼ä½æ¯æå¾å¤é¢ç®å 乿¬¡æ¬¡éå°ï¼åè¿æ ·çé¢ç®ä¸å®è¦æå®ã
4. **æåå夿æ¯é¢è¯ã** ææ¸
æ¥èªå·±é¢è¯ä¸å¯è½æ¶ååªäºç¥è¯ç¹ãé£äºç¥è¯ç¹æ¯éç¹ãé¢è¯ä¸åªäºé®é¢ä¼è¢«ç»å¸¸é®å°ãèªå·±æ¹å¦ä½åçã(强ç䏿¨èèé¢ï¼ç¬¬ä¸ï¼éè¿èè¿ç§æ¹å¼ä½ è½è®°ä½å¤å°ï¼è½è®°ä½å¤ä¹
ï¼ç¬¬äºï¼èé¢çæ¹å¼çå¦ä¹ å¾é¾åæä¸å»ï¼)
5. **é¢è¯ä¹åå好å®åå¤ä¹ ã** ä¹å°±æ¯ä¸é¨éå¯¹ä½ è¦é¢è¯çå
¬å¸æ¥å¤ä¹ ãæ¯å¦ä½ å¨é¢è¯ä¹åå¯ä»¥å¨ç½ä¸æ¾æ¾ææ²¡æä½ è¦é¢è¯çå
¬å¸çé¢ç»ã
6. **åå¤å¥½èªå·±ç项ç®ä»ç»ã** 妿æé¡¹ç®çè¯ï¼ææ¯é¢è¯ç¬¬ä¸æ¥ï¼é¢è¯å®ä¸è¬é½æ¯è®©ä½ èªå·±ä»ç»ä¸ä¸ä½ ç项ç®ãä½ å¯ä»¥ä»ä¸é¢å 个æ¹åæ¥èèï¼â å¯¹é¡¹ç®æ´ä½è®¾è®¡çä¸ä¸ªæåï¼é¢è¯å®å¯è½ä¼è®©ä½ ç»ç³»ç»çæ¶æå¾ï¼â¡å¨è¿ä¸ªé¡¹ç®ä¸ä½ è´è´£äºä»ä¹ãåäºä»ä¹ãæ
ä»»äºä»ä¹è§è²ï¼â¢ ä»è¿ä¸ªé¡¹ç®ä¸ä½ å¦ä¼äºé£äºä¸è¥¿ï¼ä½¿ç¨å°äºé£äºææ¯ï¼å¦ä¼äºé£äºæ°ææ¯ç使ç¨ï¼â£é¡¹ç®æè¿°ä¸ï¼æå¥½å¯ä»¥ä½ç°èªå·±ç综åç´ è´¨ï¼æ¯å¦ä½ æ¯å¦ä½åè°é¡¹ç®ç»æåååå¼åçæè
å¨éå°æä¸ä¸ªæ£æçé®é¢çæ¶åä½ æ¯å¦ä½è§£å³çåæè
è¯´ä½ å¨è¿ä¸ªé¡¹ç®ç¨äºä»ä¹ææ¯å®ç°äºä»ä¹åè½æ¯å¦:ç¨redisåç¼åæé«è®¿é®é度åå¹¶åéãä½¿ç¨æ¶æ¯éååå³°åéæµççã
7. **æåç¥éæåªäºææ¯é®é¢å¸¸é®:** ç´¢å¼ãé离çå«ãHashMapæºç åæãSpringMVCæ§è¡è¿ç¨ççé®é¢æè§å¾é¢è¯ä¸å®å¨å¤ªå¸¸è§äºï¼å¥½å¥½åå¤ï¼åé¢çæç« 伿ä¼å类详ç»ä»ç»å°é£äºé®é¢æå¸¸é®ã
8. **æåçæä¸äºå¸¸é®çéææ¯é®é¢:** é¢è¯çæ¶åæä¸äºå¸¸è§çéææ¯é®é¢æ¯å¦âé¢è¯å®é®ä½ çä¼ç¹æ¯ä»ä¹ï¼åºè¯¥å¦ä½åç?âãâé¢è¯å®é®ä½ çç¼ºç¹æ¯ä»ä¹ï¼åºè¯¥å¦ä½åç?âãâ妿é¢è¯å®é®"ä½ æä»ä¹é®é¢é®æå?"æ¶,ä½ è¯¥å¦ä½åçâççï¼å¯¹äºè¿äºé®é¢ï¼å¦ä½åçèªå·±å¿éè¦æä¸ªæ°ï¼å«é¢è¯çæ¶ååºäºä¹±åã
9. **é¢è¯ä¹åè®°å¾å¤çã** é¢è¯éé失败æ¯å¾æ£å¸¸çäºæ
ï¼æä»¥åäºæ»ç»èªå·±ç失败åå ææ¯æéè¦çãå¦æå¤±è´¥ï¼ä¸è¦ç°å¿ï¼å¦æéè¿ï¼åå¿çåã
### 1.3.6 æè¯¥èªå¦è¿æ¯æ¥å¹è®çå¢ï¼
ææ¬äººæ´å èµåèªå¦ï¼ä½ è¦ç¥éå»äºå
¬å¸å¯æ²¡äººææææä½ äºï¼èä¸å 乿æçå
¬å¸é½å¯¹å¹è®çåºççæåè§ã为ä»ä¹æåè§ï¼ä½ å¦ä¸ªä¸è¥¿è¿è¦å»å¹è®çï¼è¯´æä»ä¹ï¼åçæ°´å¹³ä¸ï¼ä½ çèªå¦è½å以åèªå¾è½åä¸å®æ¯æ¯ä¸ä¸èªå¦ç人çï¼ã使¯å¦æï¼ä½ è¿æ¯å¤©å¨å¯å®¤åæå¦ä¸8ä¸ªå°æ¶ä»¥ä¸é½åæä¸äºï¼æè
æ»æ¯å®¹æåéèåºçè¯ï¼æè¿æ¯æ¨èä½ å»å¹è®çãè§æèº«è¾¹åå¦å»å¹è®ççï¼å¤§å¤æ¯éè®¡ç®æºä¸ä¸æè
æ¯æ²¡æèªå¾è½å以åèªå¦è½åé常差ç人ã
å¦å¤ï¼å¦æèªå¾è½åä¸è¡ï¼ä½ ä¹å¯ä»¥éè¿ç»ä¼´å¦ä¹ ãåå èå¸ç项ç®çæ¹å¼æ¥ç£ä¿èªå·±å¦ä¹ ã
æ»ç»ï¼**å»ä¸å»å¹è®ç主è¦è¿æ¯çèªå·±ï¼å¦æèªå·±è½åæèªå¦å°±èªå¦ï¼åæä¸ä¸æ¥å°±å»å¹è®çã妿è¦å»å¹è®çè¿è¦æ¦äº®åç¼ï¼å¾å¤å¹è®çç°å¨é½æ¯ä¸ºäºåé±ï¼ä¸éå¾·ï¼ï¼ï¼**
### 1.3.7 没æé¡¹ç®ç»å/å客/Github弿ºé¡¹ç®æä¹åï¼
ä»ç°å¨å¼å§åï¼
#### 没æé¡¹ç®ç»éªæä¹å?
妿å®å¨æ²¡æå®é
项ç®è®©ä½ å»åï¼æè§å¾ä½ å¯ä»¥éè¿ä¸é¢å ç§æ¹å¼ï¼
1. å¨ç½ä¸æ¾ä¸ä¸ªç¬¦åèªå·±è½å䏿¾å·¥ä½éæ±ç宿项ç®è§é¢æè
å客è·çèå¸ä¸èµ·åãåçè¿ç¨ä¸ï¼ä½ è¦æèªå·±çæèï¼ä¸è¦æµ
å°è¾æ¢ï¼å¯¹äºå¾å¤ç¥è¯ç¹ï¼å«äººç讲解å¯è½åªæ¯æ»¡è¶³é¡¹ç®å°±å¤äºï¼ä½ èªå·±æ³å¤ç¹ç¥è¯çè¯ï¼å¯¹äºéè¦çç¥è¯ç¹å°±è¦èªå·±å¦ä¼å»å¾æ·±åºå¦ã
2. Githubæè
ç äºä¸é¢æå¾å¤å®æç±»å«é¡¹ç®ï¼ä½ å¯ä»¥éæ©ä¸ä¸ªæ¥ç ç©¶ï¼ä¸ºäºè®©èªå·±å¯¹è¿ä¸ªé¡¹ç®æ´å çè§£ï¼å¨çè§£åæä»£ç çåºç¡ä¸ï¼ä½ å¯ä»¥å¯¹åæé¡¹ç®è¿è¡æ¹è¿æè
å¢å åè½ã
3. èªå·±å¨æå»åä¸ä¸ªèªå·±æ³å®æçä¸è¥¿ï¼éå°ä¸ä¼çä¸è¥¿å°±ä¸´æ¶å»å¦ï¼ç°å¦ç°åã
**ä¸å
è¦åï¼è¿è¦æ¹è¿ï¼æ¹åãå¦å¤ï¼å¦æä½ çè叿ç¸å
³ Java åå°é¡¹ç®çè¯ï¼ä½ ä¹å¯ä»¥ä¸»å¨ç³è¯·åä¸è¿æ¥ã**
#### 没æå客æä¹å?
妿æèªå·±çå客ï¼ä¹ç®æ¯ç®åä¸çä¸ä¸ªäº®ç¹ã建议å¯ä»¥å¨æéãSegmentfaultãCSDNçææ¯äº¤æµç¤¾åºåå客ï¼å½ç¶ï¼ä½ ä¹å¯ä»¥èªå·±æå»ºä¸ä¸ªå客ï¼éç¨ Hexo+Githu Pages æå»ºé常ç®åï¼ãåä¸äºä»ä¹ï¼å¦ä¹ ç¬è®°ã宿å
容ã读书ç¬è®°ççé½å¯ä»¥ã
#### 没æå¼æºé¡¹ç®æä¹å?
å¤ç¨ Githubï¼ç¨å¥½ Githubï¼ä¸ä¼ èªå·±ä¸éç项ç®ï¼å好 readme ææ¡£ï¼å¨å
¶ä»ææ¯ç¤¾åºåå¥½å®£ä¼ ãç¸ä¿¡ä½ ä¹ä¼æ¶è·ä¸ä¸ªä¸éç弿ºé¡¹ç®ï¼
### 1.3.8仿èè¦æ±ç大åéçä»ä¹æ ·ç人ï¼
**å
ä»å·²ç»æä¸¤å¹´å·¦å³å¼åç»éªçå·¥ç¨å¸è§åº¦æ¥çï¼** æä»¬æ¥çä¸ä¸é¿éå®ç½æ¯ä»å®Javaé«çº§å¼åå·¥ç¨å¸çæèè¦æ±ï¼ä»ä¸é¢çæèä¿¡æ¯å¯ä»¥çåºï¼é¤å»Javaåºç¡/éå/å¤çº¿ç¨è¿äºï¼è¿äºè½åæ ¼å¤éè¦ï¼
1. **åºå±ç¥è¯æ¯å¦jvm** ï¼ä¸åªæ¯æç论æ´ä¼å®æï¼
2. é¢**å对象ç¼ç¨è½å** ï¼æçè§£è¿ä¸ªä¸ä»
å
æ¬âé¢å对象ç¼ç¨âï¼è¿æSOLID软件设计ååï¼ç¸å
³é
读ï¼[ãåäºè¿ä¹å¤å¹´ä»£ç ï¼ä½ ççäºè§£SOLIDåï¼ã](https://insights.thoughtworks.cn/do-you-really-know-solid/)ï¼æå¸å¤§ä½¬çä¸ç¯æç« ï¼
3. **æ¡æ¶è½å** ï¼ä¸åªæ¯ä½¿ç¨é£ä¹ç®åï¼æ´è¦ææåçåæºå¶ï¼ææåçåæºå¶çåºç¡æ¯è¦å¦ä¼çæºç ã
4. **åå¸å¼ç³»ç»å¼åè½å** ï¼ç¼åãæ¶æ¯éåççé½è¦ææ¡ï¼å
³é®æ¯è¿è¦è½ä½¿ç¨è¿äºææ¯è§£å³å®é
é®é¢è䏿¯çº¸ä¸è°å
µã
5. **ä¸éçsense** :忬¢åå°è¯æ°ææ¯ã追æ±ç¼åä¼é
ç代ç ççã

**åä»åºå±ççè§åº¦æ¥çï¼** æä»¬è¿æ¯çé¿éå·´å·´çå®ç½ç¸å
³åºå±ç Java å·¥ç¨å¸æèå²ä½çç¸å
³è¦æ±ã

ç»åé¿éãè
¾è®¯ç大åæèå®ç½å¯¹äº Java å端æ¹å/å端æ¹åçåºå±å®ä¹ ççè¦æ±ä¸é¢å ç¹ä¹æåä½ ç个人ç«äºåï¼
1. åå è¿ç«èµï¼ å«ééè¶
é«çæ¯ ACM ï¼ï¼
2. å¯¹æ°æ®ç»æä¸ç®æ³é常çç»ï¼
3. åä¸è¿å®é
项ç®ï¼æ¯å¦å¦æ ¡ç½ç«ï¼
4. çæ PythonãShellãPerl å
¶ä¸ä¸é¨èæ¬è¯è¨ï¼
5. çæå¦ä½ä¼å Java 代ç ãæååºè´¨éæ´é«ç代ç çæè¯ï¼
6. çæ SOA åå¸å¼ç¸å
³çç¥è¯å°¤å
¶æ¯ç论ç¥è¯ï¼
7. çæèªå·±æç¨æ¡æ¶çåºå±ç¥è¯æ¯å¦ Springï¼
8. æé«å¹¶åå¼åç»éªï¼
9. æå¤§æ°æ®å¼åç»éªççã
仿¥å°å¤§å¦ä¹åï¼æç好å¤é
åé常深çèå¸ç»å¸¸å°±ä¼å诫æä»¬ï¼â ä¸å®è¦æä¸é¨èªå·±çç¹é¿ï¼ä¸ç®¡æ¯ææ¯è¿å¥½è¿æ¯å
¶ä»è½å â ãæè§å¾è¿å¥è¯ççé常æéçï¼
åå乿å°äºè¦æä¸é¨ç¹é¿ï¼æä»¥å¨è¿éå强è°ä¸ç¹ï¼å
¬å¸ä¸éè¦ä½ ä»ä¹é½ä¼ï¼ä½æ¯å¨æä¸æ¹é¢ä½ ä¸å®è¦æè¿äºå¸¸äººçä¼ç¹ãæ¢è¨ä¹å°±æ¯æä»¬ä¸éè¦å»ææ¡æ¯ä¸é¨ææ¯ï¼ä½ 乿²¡ç²¾å廿æ¡è¿ä¹å¤ææ¯ï¼ï¼èæ¯éè¦å»æ·±å
¥ç ç©¶æä¸é¨ææ¯ï¼å¯¹äºå
¶ä»ææ¯æä»¬å¯ä»¥ç®åäºè§£ä¸ä¸ã
## 1.4å¦ä½å¦ä¹ ï¼å¦ä¼åç§æ¡æ¶æå¿
è¦åï¼
### 1.4.1 æè¯¥å¦ä½å¦ä¹ ï¼

æææå
³é®ä¹æ¯å¯¹èªå·±æææéè¦çå°±æ¯å¦ä¹ ï¼ççå«äººå享çé¢ç»ï¼ççæåçè¿ç¯æç« ä¼°è®¡ä½ åªéè¦10åéä¸å°ãä½è¿äºä¸è¥¿ç»ç©¶æ¯ç©ºæ´ççè®ºï¼æä¸»è¦çè¿æ¯èªå·±å¹³æ¶çå¦ä¹ ï¼
å¦ä½å»å¦å¢ï¼æè§å¾å¦ä¹ æ¯ä¸ªç¥è¯ç¹å¯ä»¥èèè¿æ ·å»å
¥æï¼
1. **å®ç½ï¼å¤§æ¦çæ¯è±æï¼ä¸æ¨èåå¦è
çï¼**ã
2. **书ç±ï¼ç¥è¯æ´å ç³»ç»å®å
¨ï¼æ¨èï¼**ã
3. **è§é¢ï¼æ¯è¾å®¹æçè§£ï¼æ¨èï¼ç¹å«æ¯åå¦çæ¶åãæ
课ç½ååå©åå©ä¸é¢ææºå¤å¦ä¹ è§é¢å¯ä»¥çï¼åªç´æ¥å¨ä¸é¢æç´¢å
³é®è¯å°±å¯ä»¥äºï¼**ã
4. **ç½ä¸å客ï¼è§£å³æä¸ç¥è¯ç¹çé®é¢çæ¶åå¯ä»¥ççï¼**ã
è¿éç»åä½ä¸ä¸ªå»ºè®®ï¼**çè§é¢çè¿ç¨ä¸æå¥½è·çä¸èµ·ç»ï¼è¦åç¬è®°ï¼ï¼ï¼**
**æå¥½å¯ä»¥è¾¹çè§é¢è¾¹æ¾ä¸æ¬ä¹¦ç±çï¼çè§é¢æ²¡å¼æçç¥è¯ç¹ä¸å®è¦å°½å¿«è§£å³ï¼å¦ä½è§£å³ï¼**
é¦å
ç¾åº¦/Googleï¼éè¿æç´¢å¼æè§£å³ä¸äºçè¯å°±æ¾èº«è¾¹çæåæè
认è¯çä¸äºäººã
### 1.4.2 å¦ä¼åç§æ¡æ¶æå¿
è¦åï¼
**ä¸å®è¦å¦ä¼åé
èªå·±æ¶é´ï¼è¦å¦çä¸è¥¿å¾å¤ï¼ççå¾å¤ï¼ææ¸
æ¥åªäºä¸è¥¿æ¯éç¹ï¼åªäºä¸è¥¿ä»
ä»
äºè§£å°±å¤äºãä¸å®ä¸è¦æç²¾åé½è±å¨äºå¦åç§æ¡æ¶ä¸ï¼ç®æ³ãæ°æ®ç»æè¿æè®¡ç®æºç½ç»ççå¾éè¦ï¼**
å¦å¤ï¼**å¦ä¹ çè¿ç¨ä¸æä¸ä¸ªå¯ä»¥åèçææ¡£å¾éè¦ï¼é常æå©äºèªå·±çå¦ä¹ **ãæå½åå¼ JavaGuideï¼ https://github.com/Snailclimb/JavaGuide çå¾å¤§ä¸é¨åç®çå°±æ¯å 为è¿ä¸ªã**å®¢è§æ¥è¯´ï¼ç¸æ¯äºå客ï¼JavaGuide éé¢çå
容å 为æ´å¤äººçåä¸å徿´å åç¡®åå®åã**
妿大家è§å¾è¿ç¯æç« ä¸éçè¯ï¼æ¬¢è¿ç»ææ¥ä¸ªä¸è¿ï¼è¯è®º+转å+å¨çï¼ï¼æä¼å¨ä¸ä¸ç¯æç« ä¸ä»ç»å¦ä½ä»ææ¯é¢æ¶çè§åº¦åå¤é¢è¯ï¼
------
# äº Javaåºç¡+éå+å¤çº¿ç¨+JVM
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
## 2.1 Javaåºç¡
### 1. é¢å对象åé¢åè¿ç¨çåºå«
- **é¢åè¿ç¨** ï¼**é¢åè¿ç¨æ§è½æ¯é¢å对象é«ã** å 为类è°ç¨æ¶éè¦å®ä¾åï¼å¼éæ¯è¾å¤§ï¼æ¯è¾æ¶èèµæºï¼æä»¥å½æ§è½æ¯æéè¦çèéå ç´ çæ¶åï¼æ¯å¦åçæºãåµå
¥å¼å¼åãLinux/Unix çä¸è¬éç¨é¢åè¿ç¨å¼åã使¯ï¼**é¢åè¿ç¨æ²¡æé¢å对象æç»´æ¤ãæå¤ç¨ãææ©å±ã**
- **é¢å对象** ï¼**é¢å对象æç»´æ¤ãæå¤ç¨ãææ©å±ã** å 为é¢å对象æå°è£
ãç»§æ¿ã夿æ§çç¹æ§ï¼æä»¥å¯ä»¥è®¾è®¡åºä½è¦åçç³»ç»ï¼ä½¿ç³»ç»æ´å çµæ´»ãæ´å æäºç»´æ¤ã使¯ï¼**é¢å对象æ§è½æ¯é¢åè¿ç¨ä½**ã
åè§ issue : [é¢åè¿ç¨ ï¼é¢åè¿ç¨æ§è½æ¯é¢å对象é«ï¼ï¼](https://github.com/Snailclimb/JavaGuide/issues/431)
> è¿ä¸ªå¹¶ä¸æ¯æ ¹æ¬åå ï¼é¢åè¿ç¨ä¹éè¦åé
å
åï¼è®¡ç®å
ååç§»éï¼Java æ§è½å·®ç主è¦åå 并䏿¯å ä¸ºå®æ¯é¢å对象è¯è¨ï¼èæ¯ Java æ¯åç¼è¯è¯è¨ï¼æç»çæ§è¡ä»£ç 并䏿¯å¯ä»¥ç´æ¥è¢« CPU æ§è¡çäºè¿å¶æºæ¢°ç ã
>
> èé¢åè¿ç¨è¯è¨å¤§å¤é½æ¯ç´æ¥ç¼è¯ææºæ¢°ç å¨çµè䏿§è¡ï¼å¹¶ä¸å
¶å®ä¸äºé¢åè¿ç¨çèæ¬è¯è¨æ§è½ä¹å¹¶ä¸ä¸å®æ¯ Java 好ã
### 2. Java è¯è¨æåªäºç¹ç¹?
1. ç®åæå¦ï¼
2. é¢å对象ï¼å°è£
ï¼ç»§æ¿ï¼å¤æï¼ï¼
3. 平尿 å
³æ§ï¼ Java èææºå®ç°å¹³å°æ å
³æ§ï¼ï¼
4. å¯é æ§ï¼
5. å®å
¨æ§ï¼
6. æ¯æå¤çº¿ç¨ï¼ C++ è¯è¨æ²¡æå
ç½®çå¤çº¿ç¨æºå¶ï¼å æ¤å¿
é¡»è°ç¨æä½ç³»ç»çå¤çº¿ç¨åè½æ¥è¿è¡å¤çº¿ç¨ç¨åºè®¾è®¡ï¼è Java è¯è¨å´æä¾äºå¤çº¿ç¨æ¯æï¼ï¼
7. æ¯æç½ç»ç¼ç¨å¹¶ä¸å¾æ¹ä¾¿ï¼ Java è¯è¨è¯çæ¬èº«å°±æ¯ä¸ºç®åç½ç»ç¼ç¨è®¾è®¡çï¼å æ¤ Java è¯è¨ä¸ä»
æ¯æç½ç»ç¼ç¨èä¸å¾æ¹ä¾¿ï¼ï¼
8. ç¼è¯ä¸è§£éå¹¶åï¼
> ä¿®æ£ï¼åè§ï¼ [issue#544](https://github.com/Snailclimb/JavaGuide/issues/544)ï¼ï¼C++11 å¼å§ï¼2011 å¹´çæ¶åï¼,C++å°±å¼å
¥äºå¤çº¿ç¨åºï¼å¨ windowsãlinuxãmacos é½å¯ä»¥ä½¿ç¨`std::thread`å`std::async`æ¥å建线ç¨ãåè龿¥ï¼http://www.cplusplus.com/reference/thread/thread/?kw=thread
### 3. å
³äº JVM JDK å JRE æè¯¦ç»éä¿çè§£ç
#### JVM
Java èææºï¼JVMï¼æ¯è¿è¡ Java åèç çèææºãJVM æé对ä¸åç³»ç»çç¹å®å®ç°ï¼Windowsï¼Linuxï¼macOSï¼ï¼ç®çæ¯ä½¿ç¨ç¸åçåèç ï¼å®ä»¬é½ä¼ç»åºç¸åçç»æã
**ä»ä¹æ¯åèç ?éç¨åèç ç好夿¯ä»ä¹?**
> å¨ Java ä¸ï¼JVM å¯ä»¥çè§£ç代ç å°±å«å`åèç `ï¼å³æ©å±å为 `.class` çæä»¶ï¼ï¼å®ä¸é¢åä»»ä½ç¹å®çå¤çå¨ï¼åªé¢åèææºãJava è¯è¨éè¿åèç çæ¹å¼ï¼å¨ä¸å®ç¨åº¦ä¸è§£å³äºä¼ ç»è§£éåè¯è¨æ§è¡æçä½çé®é¢ï¼åæ¶åä¿çäºè§£éåè¯è¨å¯ç§»æ¤çç¹ç¹ãæä»¥ Java ç¨åºè¿è¡æ¶æ¯è¾é«æï¼èä¸ï¼ç±äºåèç å¹¶ä¸é对ä¸ç§ç¹å®çæºå¨ï¼å æ¤ï¼Java ç¨åºæ 须鿰ç¼è¯ä¾¿å¯å¨å¤ç§ä¸åæä½ç³»ç»çè®¡ç®æºä¸è¿è¡ã
**Java ç¨åºä»æºä»£ç å°è¿è¡ä¸è¬æä¸é¢ 3 æ¥ï¼**

æä»¬éè¦æ ¼å¤æ³¨æçæ¯ .class->æºå¨ç è¿ä¸æ¥ãå¨è¿ä¸æ¥ JVM ç±»å è½½å¨é¦å
å è½½åèç æä»¶ï¼ç¶åéè¿è§£éå¨éè¡è§£éæ§è¡ï¼è¿ç§æ¹å¼çæ§è¡é度ä¼ç¸å¯¹æ¯è¾æ
¢ãèä¸ï¼æäºæ¹æ³å代ç 忝ç»å¸¸éè¦è¢«è°ç¨ç(ä¹å°±æ¯æè°ççç¹ä»£ç )ï¼æä»¥åé¢å¼è¿äº JIT ç¼è¯å¨ï¼è JIT å±äºè¿è¡æ¶ç¼è¯ãå½ JIT ç¼è¯å¨å®æç¬¬ä¸æ¬¡ç¼è¯åï¼å
¶ä¼å°åèç 对åºçæºå¨ç ä¿å䏿¥ï¼ä¸æ¬¡å¯ä»¥ç´æ¥ä½¿ç¨ãèæä»¬ç¥éï¼æºå¨ç çè¿è¡æçè¯å®æ¯é«äº Java è§£éå¨çãè¿ä¹è§£éäºæä»¬ä¸ºä»ä¹ç»å¸¸ä¼è¯´ Java æ¯ç¼è¯ä¸è§£éå
±åçè¯è¨ã
> HotSpot éç¨äºæ°æ§è¯ä¼°(Lazy Evaluation)çåæ³ï¼æ ¹æ®äºå
«å®å¾ï¼æ¶è大é¨åç³»ç»èµæºçåªæé£ä¸å°é¨åç代ç ï¼çç¹ä»£ç ï¼ï¼èè¿ä¹å°±æ¯ JIT æéè¦ç¼è¯çé¨åãJVM 伿 ¹æ®ä»£ç æ¯æ¬¡è¢«æ§è¡çæ
嵿¶éä¿¡æ¯å¹¶ç¸åºå°ååºä¸äºä¼åï¼å æ¤æ§è¡ç次æ°è¶å¤ï¼å®çé度就è¶å¿«ãJDK 9 å¼å
¥äºä¸ç§æ°çç¼è¯æ¨¡å¼ AOT(Ahead of Time Compilation)ï¼å®æ¯ç´æ¥å°åèç ç¼è¯ææºå¨ç ï¼è¿æ ·å°±é¿å
äº JIT é¢ççåæ¹é¢çå¼éãJDK æ¯æåå±ç¼è¯å AOT åä½ä½¿ç¨ã使¯ ï¼AOT ç¼è¯å¨çç¼è¯è´¨éæ¯è¯å®æ¯ä¸ä¸ JIT ç¼è¯å¨çã
**æ»ç»ï¼**
Java èææºï¼JVMï¼æ¯è¿è¡ Java åèç çèææºãJVM æé对ä¸åç³»ç»çç¹å®å®ç°ï¼Windowsï¼Linuxï¼macOSï¼ï¼ç®çæ¯ä½¿ç¨ç¸åçåèç ï¼å®ä»¬é½ä¼ç»åºç¸åçç»æãåèç åä¸åç³»ç»ç JVM å®ç°æ¯ Java è¯è¨â䏿¬¡ç¼è¯ï¼éå¤å¯ä»¥è¿è¡âçå
³é®æå¨ã
#### JDK å JRE
JDK æ¯ Java Development Kitï¼å®æ¯åè½é½å
¨ç Java SDKã宿¥æ JRE ææ¥æçä¸åï¼è¿æç¼è¯å¨ï¼javacï¼åå·¥å
·ï¼å¦ javadoc å jdbï¼ãå®è½å¤å建åç¼è¯ç¨åºã
JRE æ¯ Java è¿è¡æ¶ç¯å¢ã宿¯è¿è¡å·²ç¼è¯ Java ç¨åºæéçææå
容çéåï¼å
æ¬ Java èææºï¼JVMï¼ï¼Java ç±»åºï¼java å½ä»¤åå
¶ä»çä¸äºåºç¡æä»¶ã使¯ï¼å®ä¸è½ç¨äºå建æ°ç¨åºã
å¦æä½ åªæ¯ä¸ºäºè¿è¡ä¸ä¸ Java ç¨åºçè¯ï¼é£ä¹ä½ åªéè¦å®è£
JRE å°±å¯ä»¥äºãå¦æä½ éè¦è¿è¡ä¸äº Java ç¼ç¨æ¹é¢çå·¥ä½ï¼é£ä¹ä½ å°±éè¦å®è£
JDK äºã使¯ï¼è¿ä¸æ¯ç»å¯¹çãææ¶ï¼å³ä½¿æ¨ä¸æç®å¨è®¡ç®æºä¸è¿è¡ä»»ä½ Java å¼åï¼ä»ç¶éè¦å®è£
JDKãä¾å¦ï¼å¦æè¦ä½¿ç¨ JSP é¨ç½² Web åºç¨ç¨åºï¼é£ä¹ä»ææ¯ä¸è®²ï¼æ¨åªæ¯å¨åºç¨ç¨åºæå¡å¨ä¸è¿è¡ Java ç¨åºãé£ä½ 为ä»ä¹éè¦ JDK å¢ï¼å 为åºç¨ç¨åºæå¡å¨ä¼å° JSP 转æ¢ä¸º Java servletï¼å¹¶ä¸éè¦ä½¿ç¨ JDK æ¥ç¼è¯ servletã
### 4. Oracle JDK å OpenJDK ç对æ¯
å¯è½å¨çè¿ä¸ªé®é¢ä¹åå¾å¤äººåæä¸æ ·å¹¶æ²¡ææ¥è§¦å使ç¨è¿ OpenJDK ãé£ä¹ Oracle å OpenJDK ä¹é´æ¯å¦åå¨é大差å¼ï¼ä¸é¢æéè¿æ¶éå°çä¸äºèµæï¼ä¸ºä½ è§£çè¿ä¸ªè¢«å¾å¤äººå¿½è§çé®é¢ã
å¯¹äº Java 7ï¼æ²¡ä»ä¹å
³é®çå°æ¹ãOpenJDK 项ç®ä¸»è¦åºäº Sun æèµ ç HotSpot æºä»£ç ãæ¤å¤ï¼OpenJDK 被é为 Java 7 çåèå®ç°ï¼ç± Oracle å·¥ç¨å¸ç»´æ¤ãå
³äº JVMï¼JDKï¼JRE å OpenJDK ä¹é´çåºå«ï¼Oracle å客å¸åå¨ 2012 å¹´æä¸ä¸ªæ´è¯¦ç»ççæ¡ï¼
> é®ï¼OpenJDK åå¨åºä¸çæºä»£ç ä¸ç¨äºæå»º Oracle JDK ç代ç ä¹é´æä»ä¹åºå«ï¼
>
> çï¼é常æ¥è¿ - æä»¬ç Oracle JDK çæ¬æå»ºè¿ç¨åºäº OpenJDK 7 æå»ºï¼åªæ·»å äºå 个é¨åï¼ä¾å¦é¨ç½²ä»£ç ï¼å
¶ä¸å
æ¬ Oracle ç Java æä»¶å Java WebStart çå®ç°ï¼ä»¥åä¸äºå°éçæºä»£ç æ´¾å¯¹ç»ä»¶ï¼å¦å¾å½¢å
æ
åå¨ï¼ä¸äºå¼æºçç¬¬ä¸æ¹ç»ä»¶ï¼å¦ Rhinoï¼ä»¥åä¸äºé¶ç¢çä¸è¥¿ï¼å¦éå ææ¡£æç¬¬ä¸æ¹åä½ãå±ææªæ¥ï¼æä»¬çç®çæ¯å¼æº Oracle JDK çææé¨åï¼é¤äºæä»¬èèåä¸åè½çé¨åã
**æ»ç»ï¼**
1. Oracle JDK å¤§æ¦æ¯ 6 个æå䏿¬¡ä¸»è¦çæ¬ï¼è OpenJDK çæ¬å¤§æ¦æ¯ä¸ä¸ªæåå¸ä¸æ¬¡ãä½è¿ä¸æ¯åºå®çï¼æè§å¾äºè§£è¿ä¸ªæ²¡å¥ç¨å¤ã详æ
åè§ï¼https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadenceã
2. OpenJDK æ¯ä¸ä¸ªåèæ¨¡å并䏿¯å®å
¨å¼æºçï¼è Oracle JDK æ¯ OpenJDK çä¸ä¸ªå®ç°ï¼å¹¶ä¸æ¯å®å
¨å¼æºçï¼
3. Oracle JDK æ¯ OpenJDK æ´ç¨³å®ãOpenJDK å Oracle JDK ç代ç å ä¹ç¸åï¼ä½ Oracle JDK ææ´å¤çç±»åä¸äºé误修å¤ãå æ¤ï¼å¦ææ¨æ³å¼åä¼ä¸/åä¸è½¯ä»¶ï¼æå»ºè®®æ¨éæ© Oracle JDKï¼å 为å®ç»è¿äºå½»åºçæµè¯å稳å®ãæäºæ
åµä¸ï¼æäºäººæå°å¨ä½¿ç¨ OpenJDK å¯è½ä¼éå°äºè®¸å¤åºç¨ç¨åºå´©æºçé®é¢ï¼ä½æ¯ï¼åªéåæ¢å° Oracle JDK å°±å¯ä»¥è§£å³é®é¢ï¼
4. å¨ååºæ§å JVM æ§è½æ¹é¢ï¼Oracle JDK ä¸ OpenJDK ç¸æ¯æä¾äºæ´å¥½çæ§è½ï¼
5. Oracle JDK ä¸ä¼ä¸ºå³å°åå¸ççæ¬æä¾é¿ææ¯æï¼ç¨æ·æ¯æ¬¡é½å¿
é¡»éè¿æ´æ°å°ææ°çæ¬è·å¾æ¯ææ¥è·åææ°çæ¬ï¼
6. Oracle JDK æ ¹æ®äºè¿å¶ä»£ç 许å¯åè®®è·å¾è®¸å¯ï¼è OpenJDK æ ¹æ® GPL v2 许å¯è·å¾è®¸å¯ã
### 5. Java å C++çåºå«?
æç¥éå¾å¤äººæ²¡å¦è¿ C++ï¼ä½æ¯é¢è¯å®å°±æ¯æ²¡äºå欢æ¿å±ä»¬ Java å C++ æ¯åï¼æ²¡åæ³ï¼ï¼ï¼å°±ç®æ²¡å¦è¿ C++ï¼ä¹è¦è®°ä¸æ¥ï¼
- 齿¯é¢å对象çè¯è¨ï¼é½æ¯æå°è£
ãç»§æ¿å夿
- Java ä¸æä¾æéæ¥ç´æ¥è®¿é®å
åï¼ç¨åºå
åæ´å å®å
¨
- Java çç±»æ¯åç»§æ¿çï¼C++ æ¯æå¤éç»§æ¿ï¼è½ç¶ Java çç±»ä¸å¯ä»¥å¤ç»§æ¿ï¼ä½æ¯æ¥å£å¯ä»¥å¤ç»§æ¿ã
- Java æèªå¨å
åç®¡çæºå¶ï¼ä¸éè¦ç¨åºåæå¨éæ¾æ ç¨å
å
- **å¨ C è¯è¨ä¸ï¼å符串æå符æ°ç»æåé½ä¼æä¸ä¸ªé¢å¤çå符â\0âæ¥è¡¨ç¤ºç»æã使¯ï¼Java è¯è¨ä¸æ²¡æç»æç¬¦è¿ä¸æ¦å¿µã** è¿æ¯ä¸ä¸ªå¼å¾æ·±åº¦æèçé®é¢ï¼å
·ä½åå æ¨èçè¿ç¯æç« ï¼ [https://blog.csdn.net/sszgg2006/article/details/49148189](https://blog.csdn.net/sszgg2006/article/details/49148189)
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
### 6. ä»ä¹æ¯ Java ç¨åºç主类 åºç¨ç¨åºåå°ç¨åºç主类æä½ä¸å?
ä¸ä¸ªç¨åºä¸å¯ä»¥æå¤ä¸ªç±»ï¼ä½åªè½æä¸ä¸ªç±»æ¯ä¸»ç±»ãå¨ Java åºç¨ç¨åºä¸ï¼è¿ä¸ªä¸»ç±»æ¯æå
å« mainï¼ï¼æ¹æ³çç±»ãèå¨ Java å°ç¨åºä¸ï¼è¿ä¸ªä¸»ç±»æ¯ä¸ä¸ªç»§æ¿èªç³»ç»ç±» JApplet æ Applet çåç±»ãåºç¨ç¨åºç主类ä¸ä¸å®è¦æ±æ¯ public ç±»ï¼ä½å°ç¨åºçä¸»ç±»è¦æ±å¿
é¡»æ¯ public ç±»ãä¸»ç±»æ¯ Java ç¨åºæ§è¡çå
¥å£ç¹ã
### 7. Java åºç¨ç¨åºä¸å°ç¨åºä¹é´æåªäºå·®å«?
ç®å说åºç¨ç¨åºæ¯ä»ä¸»çº¿ç¨å¯å¨(ä¹å°±æ¯ `main()` æ¹æ³)ãapplet å°ç¨åºæ²¡æ `main()` æ¹æ³ï¼ä¸»è¦æ¯åµå¨æµè§å¨é¡µé¢ä¸è¿è¡(è°ç¨`init()`æè
`run()`æ¥å¯å¨)ï¼åµå
¥æµè§å¨è¿ç¹è· flash çå°æ¸¸æç±»ä¼¼ã
### 8. å符å常éåå符串常éçåºå«?
1. å½¢å¼ä¸: åç¬¦å¸¸éæ¯åå¼å·å¼èµ·çä¸ä¸ªå符; åç¬¦ä¸²å¸¸éæ¯åå¼å·å¼èµ·çè¥å¹²ä¸ªå符
2. å«ä¹ä¸: å符常éç¸å½äºä¸ä¸ªæ´åå¼( ASCII å¼),å¯ä»¥åå 表达å¼è¿ç®; å符串常é代表ä¸ä¸ªå°åå¼(该å符串å¨å
åä¸åæ¾ä½ç½®)
3. å å
åå¤§å° å符常éåªå 2 个åè; å符串常éå è¥å¹²ä¸ªåè (**注æï¼ char å¨ Java ä¸å 两个åè**)
> java ç¼ç¨ææ³ç¬¬åçï¼2.2.2 è
> 
### 9. æé å¨ Constructor æ¯å¦å¯è¢« override?
Constructor ä¸è½è¢« overrideï¼éåï¼,使¯å¯ä»¥ overloadï¼éè½½ï¼,æä»¥ä½ å¯ä»¥çå°ä¸ä¸ªç±»ä¸æå¤ä¸ªæé 彿°çæ
åµã
### 10. éè½½åéåçåºå«
>é载就æ¯åæ ·çä¸ä¸ªæ¹æ³è½å¤æ ¹æ®è¾å
¥æ°æ®çä¸åï¼ååºä¸åçå¤ç
>
>éåå°±æ¯å½å类继æ¿èªç¶ç±»çç¸åæ¹æ³ï¼è¾å
¥æ°æ®ä¸æ ·ï¼ä½è¦ååºæå«äºç¶ç±»çååºæ¶ï¼ä½ å°±è¦è¦çç¶ç±»æ¹æ³
#### éè½½
åçå¨åä¸ä¸ªç±»ä¸ï¼æ¹æ³åå¿
é¡»ç¸åï¼åæ°ç±»åä¸åã个æ°ä¸åã顺åºä¸åï¼æ¹æ³è¿åå¼å访é®ä¿®é¥°ç¬¦å¯ä»¥ä¸åã
ä¸é¢æ¯ãJava æ ¸å¿ææ¯ã对éè½½è¿ä¸ªæ¦å¿µçä»ç»ï¼

**综ä¸ï¼é载就æ¯åä¸ä¸ªç±»ä¸å¤ä¸ªååæ¹æ³æ ¹æ®ä¸åçä¼ åæ¥æ§è¡ä¸åçé»è¾å¤çã**
#### éå
éååçå¨è¿è¡æï¼æ¯å类对ç¶ç±»çå
许访é®çæ¹æ³çå®ç°è¿ç¨è¿è¡éæ°ç¼åã
1. è¿åå¼ç±»åãæ¹æ³åãåæ°å表å¿
é¡»ç¸åï¼æåºçå¼å¸¸èå´å°äºçäºç¶ç±»ï¼è®¿é®ä¿®é¥°ç¬¦èå´å¤§äºçäºç¶ç±»ã
2. 妿ç¶ç±»æ¹æ³è®¿é®ä¿®é¥°ç¬¦ä¸º private/final/static åå类就ä¸è½éåè¯¥æ¹æ³ï¼ä½æ¯è¢« static ä¿®é¥°çæ¹æ³è½å¤è¢«å次声æã
3. æé æ¹æ³æ æ³è¢«éå
**综ä¸ï¼éåå°±æ¯å类对ç¶ç±»æ¹æ³çéæ°æ¹é ï¼å¤é¨æ ·åä¸è½æ¹åï¼å
é¨é»è¾å¯ä»¥æ¹å** ã
**æå¿ç Guide 奿ååæ¥ä¸ªå¾æ æ»ç»ä¸ä¸ï¼**
| åºå«ç¹ | éè½½æ¹æ³ | éåæ¹æ³ |
| :--------- | :------- | :--------------------------------------------- |
| åçèå´ | åä¸ä¸ªç±» | åç±» ä¸ |
| åæ°å表 | å¿
é¡»ä¿®æ¹ | ä¸å®ä¸è½ä¿®æ¹ |
| è¿åç±»å | å¯ä¿®æ¹ | ä¸å®ä¸è½ä¿®æ¹ |
| å¼å¸¸ | å¯ä¿®æ¹ | å¯ä»¥åå°æå é¤ï¼ä¸å®ä¸è½æåºæ°çæè
æ´å¹¿çå¼å¸¸ |
| 访é®ä¿®é¥°ç¬¦ | å¯ä¿®æ¹ | ä¸å®ä¸è½åæ´ä¸¥æ ¼çéå¶ï¼å¯ä»¥éä½éå¶ï¼ |
| åçé¶æ®µ | ç¼è¯æ | è¿è¡æ |
### 11. Java é¢å对象ç¼ç¨ä¸å¤§ç¹æ§: å°è£
ç»§æ¿ å¤æ
#### å°è£
å°è£
æä¸ä¸ªå¯¹è±¡ç屿§ç§æåï¼åæ¶æä¾ä¸äºå¯ä»¥è¢«å¤ç访é®ç屿§çæ¹æ³ï¼å¦æå±æ§ä¸æ³è¢«å¤ç访é®ï¼æä»¬å¤§å¯ä¸å¿
æä¾æ¹æ³ç»å¤ç访é®ã使¯å¦æä¸ä¸ªç±»æ²¡ææä¾ç»å¤ç访é®çæ¹æ³ï¼é£ä¹è¿ä¸ªç±»ä¹æ²¡æä»ä¹æä¹äºã
#### ç»§æ¿
ç»§æ¿æ¯ä½¿ç¨å·²åå¨çç±»çå®ä¹ä½ä¸ºåºç¡å»ºç«æ°ç±»çææ¯ï¼æ°ç±»çå®ä¹å¯ä»¥å¢å æ°çæ°æ®ææ°çåè½ï¼ä¹å¯ä»¥ç¨ç¶ç±»çåè½ï¼ä½ä¸è½éæ©æ§å°ç»§æ¿ç¶ç±»ãéè¿ä½¿ç¨ç»§æ¿æä»¬è½å¤é常æ¹ä¾¿å°å¤ç¨ä»¥åç代ç ã
**å
³äºç»§æ¿å¦ä¸ 3 ç¹è¯·è®°ä½ï¼**
1. åç±»æ¥æç¶ç±»å¯¹è±¡ææç屿§åæ¹æ³ï¼å
æ¬ç§æå±æ§åç§ææ¹æ³ï¼ï¼ä½æ¯ç¶ç±»ä¸çç§æå±æ§åæ¹æ³åç±»æ¯æ æ³è®¿é®ï¼**åªæ¯æ¥æ**ã
2. åç±»å¯ä»¥æ¥æèªå·±å±æ§åæ¹æ³ï¼å³åç±»å¯ä»¥å¯¹ç¶ç±»è¿è¡æ©å±ã
3. åç±»å¯ä»¥ç¨èªå·±çæ¹å¼å®ç°ç¶ç±»çæ¹æ³ãï¼ä»¥åä»ç»ï¼ã
#### 夿
æè°å¤æå°±æ¯æç¨åºä¸å®ä¹çå¼ç¨åéææåçå
·ä½ç±»ååéè¿è¯¥å¼ç¨åéååºçæ¹æ³è°ç¨å¨ç¼ç¨æ¶å¹¶ä¸ç¡®å®ï¼èæ¯å¨ç¨åºè¿è¡æé´æç¡®å®ï¼å³ä¸ä¸ªå¼ç¨åéå°åºä¼æååªä¸ªç±»çå®ä¾å¯¹è±¡ï¼è¯¥å¼ç¨åéååºçæ¹æ³è°ç¨å°åºæ¯åªä¸ªç±»ä¸å®ç°çæ¹æ³ï¼å¿
é¡»å¨ç±ç¨åºè¿è¡æé´æè½å³å®ã
å¨ Java 䏿䏤ç§å½¢å¼å¯ä»¥å®ç°å¤æï¼ç»§æ¿ï¼å¤ä¸ªå类对å䏿¹æ³çéåï¼åæ¥å£ï¼å®ç°æ¥å£å¹¶è¦çæ¥å£ä¸å䏿¹æ³ï¼ã
### 12. String StringBuffer å StringBuilder çåºå«æ¯ä»ä¹? String 为ä»ä¹æ¯ä¸å¯åç?
**å¯åæ§**
ç®åçæ¥è¯´ï¼String ç±»ä¸ä½¿ç¨ final å
³é®å修饰å符æ°ç»æ¥ä¿åå符串ï¼`private final char value[]`ï¼æä»¥ String 对象æ¯ä¸å¯åçã
> è¡¥å
ï¼æ¥èª[issue 675](https://github.com/Snailclimb/JavaGuide/issues/675)ï¼ï¼å¨ Java 9 ä¹åï¼String ç±»çå®ç°æ¹ç¨ byte æ°ç»åå¨å符串 `private final byte[] value`
è StringBuilder ä¸ StringBuffer é½ç»§æ¿èª AbstractStringBuilder ç±»ï¼å¨ AbstractStringBuilder ä¸ä¹æ¯ä½¿ç¨å符æ°ç»ä¿åå符串`char[]value` 使¯æ²¡æç¨ final å
³é®åä¿®é¥°ï¼æä»¥è¿ä¸¤ç§å¯¹è±¡é½æ¯å¯åçã
StringBuilder ä¸ StringBuffer çæé æ¹æ³é½æ¯è°ç¨ç¶ç±»æé æ¹æ³ä¹å°±æ¯ AbstractStringBuilder å®ç°çï¼å¤§å®¶å¯ä»¥èªè¡æ¥é
æºç ã
`AbstractStringBuilder.java`
```java
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
/**
* The count is the number of characters used.
*/
int count;
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
```
**线ç¨å®å
¨æ§**
String ä¸ç对象æ¯ä¸å¯åçï¼ä¹å°±å¯ä»¥ç解为常éï¼çº¿ç¨å®å
¨ãAbstractStringBuilder æ¯ StringBuilder ä¸ StringBuffer çå
Œ
±ç¶ç±»ï¼å®ä¹äºä¸äºå符串çåºæ¬æä½ï¼å¦ expandCapacityãappendãinsertãindexOf çå
Œ
±æ¹æ³ãStringBuffer å¯¹æ¹æ³å äºåæ¥éæè
对è°ç¨çæ¹æ³å äºåæ¥éï¼æä»¥æ¯çº¿ç¨å®å
¨çãStringBuilder 并没æå¯¹æ¹æ³è¿è¡å 忥éï¼æä»¥æ¯é线ç¨å®å
¨çã
**æ§è½**
æ¯æ¬¡å¯¹ String ç±»åè¿è¡æ¹åçæ¶åï¼é½ä¼çæä¸ä¸ªæ°ç String 对象ï¼ç¶åå°æéæåæ°ç String 对象ãStringBuffer æ¯æ¬¡é½ä¼å¯¹ StringBuffer 对象æ¬èº«è¿è¡æä½ï¼è䏿¯çææ°ç对象并æ¹å对象å¼ç¨ãç¸åæ
åµä¸ä½¿ç¨ StringBuilder ç¸æ¯ä½¿ç¨ StringBuffer ä»
è½è·å¾ 10%~15% å·¦å³çæ§è½æåï¼ä½å´è¦åå¤çº¿ç¨ä¸å®å
¨çé£é©ã
**对äºä¸è
使ç¨çæ»ç»ï¼**
1. æä½å°éçæ°æ®: éç¨ String
2. åçº¿ç¨æä½å符串ç¼å²åºä¸æä½å¤§éæ°æ®: éç¨ StringBuilder
3. å¤çº¿ç¨æä½å符串ç¼å²åºä¸æä½å¤§éæ°æ®: éç¨ StringBuffer
### 13. èªå¨è£
ç®±ä¸æç®±
- **è£
ç®±**ï¼å°åºæ¬ç±»åç¨å®ä»¬å¯¹åºçå¼ç¨ç±»åå
è£
èµ·æ¥ï¼
- **æç®±**ï¼å°å
è£
ç±»å转æ¢ä¸ºåºæ¬æ°æ®ç±»åï¼
æ´å¤å
容è§ï¼[æ·±å
¥åæJavaä¸çè£
ç®±åæç®±](https://www.cnblogs.com/dolphin0520/p/3780005.html)
### 14. å¨ä¸ä¸ªéææ¹æ³å
è°ç¨ä¸ä¸ªééææå为ä»ä¹æ¯éæ³ç?
ç±äºéææ¹æ³å¯ä»¥ä¸éè¿å¯¹è±¡è¿è¡è°ç¨ï¼å æ¤å¨éææ¹æ³éï¼ä¸è½è°ç¨å
¶ä»ééæåéï¼ä¹ä¸å¯ä»¥è®¿é®ééæåéæåã
### 15. å¨ Java ä¸å®ä¹ä¸ä¸ªä¸åäºä¸æ²¡æåæ°çæé æ¹æ³çä½ç¨
Java ç¨åºå¨æ§è¡åç±»çæé æ¹æ³ä¹åï¼å¦ææ²¡æç¨ `super()`æ¥è°ç¨ç¶ç±»ç¹å®çæé æ¹æ³ï¼åä¼è°ç¨ç¶ç±»ä¸â没æåæ°çæé æ¹æ³âãå æ¤ï¼å¦æç¶ç±»ä¸åªå®ä¹äºæåæ°çæé æ¹æ³ï¼èå¨åç±»çæé æ¹æ³ä¸å没æç¨ `super()`æ¥è°ç¨ç¶ç±»ä¸ç¹å®çæé æ¹æ³ï¼åç¼è¯æ¶å°åçé误ï¼å 为 Java ç¨åºå¨ç¶ç±»ä¸æ¾ä¸å°æ²¡æåæ°çæé æ¹æ³å¯ä¾æ§è¡ãè§£å³åæ³æ¯å¨ç¶ç±»éå ä¸ä¸ä¸ªä¸åäºä¸æ²¡æåæ°çæé æ¹æ³ã
### 16. import java å javax æä»ä¹åºå«ï¼
åå¼å§çæ¶å JavaAPI æå¿
éçå
æ¯ java å¼å¤´çå
ï¼javax 彿¶åªæ¯æ©å± API å
æ¥ä½¿ç¨ãç¶èéçæ¶é´çæ¨ç§»ï¼javax 鿏尿©å±æä¸º Java API çç»æé¨åã使¯ï¼å°æ©å±ä» javax å
ç§»å¨å° java å
ç¡®å®å¤ªéº»ç¦äºï¼æç»ä¼ç ´åä¸å ç°æç代ç ãå æ¤ï¼æç»å³å® javax å
å°æä¸ºæ å API çä¸é¨åã
æä»¥ï¼å®é
ä¸ java å javax 没æåºå«ãè¿é½æ¯ä¸ä¸ªååã
### 17. æ¥å£åæ½è±¡ç±»çåºå«æ¯ä»ä¹ï¼
1. æ¥å£çæ¹æ³é»è®¤æ¯ publicï¼æææ¹æ³å¨æ¥å£ä¸ä¸è½æå®ç°(Java 8 å¼å§æ¥å£æ¹æ³å¯ä»¥æé»è®¤å®ç°ï¼ï¼èæ½è±¡ç±»å¯ä»¥æéæ½è±¡çæ¹æ³ã
2. æ¥å£ä¸é¤äº staticãfinal åéï¼ä¸è½æå
¶ä»åéï¼èæ½è±¡ç±»ä¸åä¸ä¸å®ã
3. ä¸ä¸ªç±»å¯ä»¥å®ç°å¤ä¸ªæ¥å£ï¼ä½åªè½å®ç°ä¸ä¸ªæ½è±¡ç±»ãæ¥å£èªå·±æ¬èº«å¯ä»¥éè¿ extends å
³é®åæ©å±å¤ä¸ªæ¥å£ã
4. æ¥å£æ¹æ³é»è®¤ä¿®é¥°ç¬¦æ¯ publicï¼æ½è±¡æ¹æ³å¯ä»¥æ publicãprotected å default è¿äºä¿®é¥°ç¬¦ï¼æ½è±¡æ¹æ³å°±æ¯ä¸ºäºè¢«éåæä»¥ä¸è½ä½¿ç¨ private å
³é®å修饰ï¼ï¼ã
5. ä»è®¾è®¡å±é¢æ¥è¯´ï¼æ½è±¡æ¯å¯¹ç±»çæ½è±¡ï¼æ¯ä¸ç§æ¨¡æ¿è®¾è®¡ï¼èæ¥å£æ¯å¯¹è¡ä¸ºçæ½è±¡ï¼æ¯ä¸ç§è¡ä¸ºçè§èã
> 夿³¨ï¼
>
> 1. å¨ JDK8 ä¸ï¼æ¥å£ä¹å¯ä»¥å®ä¹éææ¹æ³ï¼å¯ä»¥ç´æ¥ç¨æ¥å£åè°ç¨ãå®ç°ç±»åå®ç°æ¯ä¸å¯ä»¥è°ç¨çã妿忶å®ç°ä¸¤ä¸ªæ¥å£ï¼æ¥å£ä¸å®ä¹äºä¸æ ·çé»è®¤æ¹æ³ï¼åå¿
é¡»éåï¼ä¸ç¶ä¼æ¥éã(è¯¦è§ issue:[https://github.com/Snailclimb/JavaGuide/issues/146](https://github.com/Snailclimb/JavaGuide/issues/146)ã
> 2. jdk9 çæ¥å£è¢«å
许å®ä¹ç§ææ¹æ³ ã
æ»ç»ä¸ä¸ jdk7~jdk9 Java 䏿¥å£æ¦å¿µçååï¼[ç¸å
³é
读](https://www.geeksforgeeks.org/private-methods-java-9-interfaces/)ï¼ï¼
1. å¨ jdk 7 ææ´æ©çæ¬ä¸ï¼æ¥å£éé¢åªè½æå¸¸éåéåæ½è±¡æ¹æ³ãè¿äºæ¥å£æ¹æ³å¿
é¡»ç±éæ©å®ç°æ¥å£çç±»å®ç°ã
2. jdk8 çæ¶åæ¥å£å¯ä»¥æé»è®¤æ¹æ³åéææ¹æ³åè½ã
3. Jdk 9 卿¥å£ä¸å¼å
¥äºç§ææ¹æ³åç§æéææ¹æ³ã
### 18. æååéä¸å±é¨åéçåºå«æåªäºï¼
1. ä»è¯æ³å½¢å¼ä¸ç:æåå鿝å±äºç±»çï¼èå±é¨å鿝卿¹æ³ä¸å®ä¹çåéææ¯æ¹æ³çåæ°ï¼æååéå¯ä»¥è¢« public,private,static ç修饰符æä¿®é¥°ï¼èå±é¨åéä¸è½è¢«è®¿é®æ§å¶ä¿®é¥°ç¬¦å static æä¿®é¥°ï¼ä½æ¯ï¼æååéåå±é¨åéé½è½è¢« final æä¿®é¥°ã
2. ä»åéå¨å
åä¸çå卿¹å¼æ¥ç:妿æååéæ¯ä½¿ç¨`static`修饰çï¼é£ä¹è¿ä¸ªæåå鿝å±äºç±»çï¼å¦ææ²¡æä½¿ç¨`static`修饰ï¼è¿ä¸ªæåå鿝å±äºå®ä¾çã对象åäºå å
åï¼å¦æå±é¨åéç±»åä¸ºåºæ¬æ°æ®ç±»åï¼é£ä¹åå¨å¨æ å
åï¼å¦æä¸ºå¼ç¨æ°æ®ç±»åï¼é£åæ¾çæ¯æåå å
å对象çå¼ç¨æè
æ¯æå叏鿱 ä¸çå°åã
3. ä»åéå¨å
åä¸ççåæ¶é´ä¸ç:æååéæ¯å¯¹è±¡çä¸é¨åï¼å®éç对象çå建èåå¨ï¼èå±é¨åééçæ¹æ³çè°ç¨èèªå¨æ¶å¤±ã
4. æååéå¦ææ²¡æè¢«èµåå¼:åä¼èªå¨ä»¥ç±»åçé»è®¤å¼èèµå¼ï¼ä¸ç§æ
åµä¾å¤:被 final 修饰çæååéä¹å¿
é¡»æ¾å¼å°èµå¼ï¼ï¼èå±é¨åéåä¸ä¼èªå¨èµå¼ã
### 19. å建ä¸ä¸ªå¯¹è±¡ç¨ä»ä¹è¿ç®ç¬¦?对象å®ä½ä¸å¯¹è±¡å¼ç¨æä½ä¸å?
new è¿ç®ç¬¦ï¼new å建对象å®ä¾ï¼å¯¹è±¡å®ä¾å¨å å
åä¸ï¼ï¼å¯¹è±¡å¼ç¨æå对象å®ä¾ï¼å¯¹è±¡å¼ç¨åæ¾å¨æ å
åä¸ï¼ãä¸ä¸ªå¯¹è±¡å¼ç¨å¯ä»¥æå 0 个æ 1 个对象ï¼ä¸æ ¹ç»³åå¯ä»¥ä¸ç³»æ°çï¼ä¹å¯ä»¥ç³»ä¸ä¸ªæ°çï¼;ä¸ä¸ªå¯¹è±¡å¯ä»¥æ n 个å¼ç¨æåå®ï¼å¯ä»¥ç¨ n æ¡ç»³åç³»ä½ä¸ä¸ªæ°çï¼ã
### 20. ä»ä¹æ¯æ¹æ³çè¿åå¼?è¿åå¼å¨ç±»çæ¹æ³éçä½ç¨æ¯ä»ä¹?
æ¹æ³çè¿å弿¯ææä»¬è·åå°çæä¸ªæ¹æ³ä½ä¸çä»£ç æ§è¡å产ççç»æï¼ï¼åææ¯è¯¥æ¹æ³å¯è½äº§çç»æï¼ãè¿åå¼çä½ç¨:æ¥æ¶åºç»æï¼ä½¿å¾å®å¯ä»¥ç¨äºå
¶ä»çæä½ï¼
### 21. ä¸ä¸ªç±»çæé æ¹æ³çä½ç¨æ¯ä»ä¹? è¥ä¸ä¸ªç±»æ²¡æå£°ææé æ¹æ³ï¼è¯¥ç¨åºè½æ£ç¡®æ§è¡å? 为ä»ä¹?
主è¦ä½ç¨æ¯å®æå¯¹ç±»å¯¹è±¡çåå§åå·¥ä½ãå¯ä»¥æ§è¡ãå 为ä¸ä¸ªç±»å³ä½¿æ²¡æå£°ææé æ¹æ³ä¹ä¼æé»è®¤çä¸å¸¦åæ°çæé æ¹æ³ã
### 22. æé æ¹æ³æåªäºç¹æ§ï¼
1. ååä¸ç±»åç¸åã
2. 没æè¿åå¼ï¼ä½ä¸è½ç¨ void 声ææé 彿°ã
3. çæç±»ç对象æ¶èªå¨æ§è¡ï¼æ éè°ç¨ã
### 23. éææ¹æ³åå®ä¾æ¹æ³æä½ä¸å
1. å¨å¤é¨è°ç¨éææ¹æ³æ¶ï¼å¯ä»¥ä½¿ç¨"ç±»å.æ¹æ³å"çæ¹å¼ï¼ä¹å¯ä»¥ä½¿ç¨"对象å.æ¹æ³å"çæ¹å¼ãèå®ä¾æ¹æ³åªæåé¢è¿ç§æ¹å¼ãä¹å°±æ¯è¯´ï¼è°ç¨éææ¹æ³å¯ä»¥æ éå建对象ã
2. éææ¹æ³å¨è®¿é®æ¬ç±»çæåæ¶ï¼åªå
许访é®éææåï¼å³éææååéåéææ¹æ³ï¼ï¼èä¸å
许访é®å®ä¾æååéåå®ä¾æ¹æ³ï¼å®ä¾æ¹æ³åæ æ¤éå¶ã
### 24. 对象çç¸ç䏿åä»ä»¬çå¼ç¨ç¸ç,两è
æä»ä¹ä¸å?
对象çç¸çï¼æ¯çæ¯å
åä¸åæ¾çå
容æ¯å¦ç¸çãèå¼ç¨ç¸çï¼æ¯è¾çæ¯ä»ä»¬æåçå
åå°åæ¯å¦ç¸çã
### 25. å¨è°ç¨åç±»æé æ¹æ³ä¹åä¼å
è°ç¨ç¶ç±»æ²¡æåæ°çæé æ¹æ³,å
¶ç®çæ¯?
帮å©åç±»ååå§åå·¥ä½ã
### 26. == ä¸ equals(éè¦)
**==** : å®çä½ç¨æ¯å¤æä¸¤ä¸ªå¯¹è±¡çå°åæ¯ä¸æ¯ç¸çãå³ï¼å¤æä¸¤ä¸ªå¯¹è±¡æ¯ä¸æ¯åä¸ä¸ªå¯¹è±¡(åºæ¬æ°æ®ç±»å==æ¯è¾çæ¯å¼ï¼å¼ç¨æ°æ®ç±»å==æ¯è¾çæ¯å
åå°å)ã
**equals()** : å®çä½ç¨ä¹æ¯å¤æä¸¤ä¸ªå¯¹è±¡æ¯å¦ç¸çãä½å®ä¸è¬æä¸¤ç§ä½¿ç¨æ
åµï¼
- æ
åµ 1ï¼ç±»æ²¡æè¦ç equals() æ¹æ³ãåéè¿ equals() æ¯è¾è¯¥ç±»ç两个对象æ¶ï¼çä»·äºéè¿â==âæ¯è¾è¿ä¸¤ä¸ªå¯¹è±¡ã
- æ
åµ 2ï¼ç±»è¦çäº equals() æ¹æ³ãä¸è¬ï¼æä»¬é½è¦ç equals() æ¹æ³æ¥æ¯è¾ä¸¤ä¸ªå¯¹è±¡çå
容æ¯å¦ç¸çï¼è¥å®ä»¬çå
容ç¸çï¼åè¿å true (å³ï¼è®¤ä¸ºè¿ä¸¤ä¸ªå¯¹è±¡ç¸ç)ã
**举个ä¾åï¼**
```java
public class test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 为ä¸ä¸ªå¼ç¨
String b = new String("ab"); // b为å¦ä¸ä¸ªå¼ç¨,对象çå
容䏿 ·
String aa = "ab"; // æ¾å¨å¸¸éæ± ä¸
String bb = "ab"; // ä»å¸¸éæ± ä¸æ¥æ¾
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // falseï¼éåä¸å¯¹è±¡
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");
}
}
}
```
**说æï¼**
- String ä¸ç equals æ¹æ³æ¯è¢«éåè¿çï¼å 为 object ç equals æ¹æ³æ¯æ¯è¾ç对象çå
åå°åï¼è String ç equals æ¹æ³æ¯è¾çæ¯å¯¹è±¡çå¼ã
- å½å建 String ç±»åç对象æ¶ï¼èææºä¼å¨å¸¸éæ± ä¸æ¥æ¾ææ²¡æå·²ç»åå¨çå¼åè¦å建çå¼ç¸åç对象ï¼å¦ææå°±æå®èµç»å½åå¼ç¨ãå¦ææ²¡æå°±å¨å¸¸éæ± ä¸éæ°å建ä¸ä¸ª String 对象ã
### 27. hashCode ä¸ equals (éè¦)
é¢è¯å®å¯è½ä¼é®ä½ ï¼âä½ éåè¿ hashcode å equals ä¹ï¼ä¸ºä»ä¹éå equals æ¶å¿
é¡»éå hashCode æ¹æ³ï¼â
#### hashCodeï¼ï¼ä»ç»
hashCode() çä½ç¨æ¯è·ååå¸ç ï¼ä¹ç§°ä¸ºæ£åç ï¼å®å®é
䏿¯è¿åä¸ä¸ª int æ´æ°ãè¿ä¸ªåå¸ç çä½ç¨æ¯ç¡®å®è¯¥å¯¹è±¡å¨åå¸è¡¨ä¸çç´¢å¼ä½ç½®ãhashCode() å®ä¹å¨ JDK ç Object.java ä¸ï¼è¿å°±æå³ç Java ä¸çä»»ä½ç±»é½å
嫿 hashCode() 彿°ã
æ£å表åå¨çæ¯é®å¼å¯¹(key-value)ï¼å®çç¹ç¹æ¯ï¼è½æ ¹æ®âé®âå¿«éçæ£ç´¢åºå¯¹åºçâå¼âãè¿å
¶ä¸å°±å©ç¨å°äºæ£åç ï¼ï¼å¯ä»¥å¿«éæ¾å°æéè¦ç对象ï¼
#### 为ä»ä¹è¦æ hashCode
**æä»¬å
以âHashSet å¦ä½æ£æ¥éå¤â为ä¾åæ¥è¯´æä¸ºä»ä¹è¦æ hashCodeï¼** å½ä½ æå¯¹è±¡å å
¥ HashSet æ¶ï¼HashSet ä¼å
计ç®å¯¹è±¡ç hashcode 弿¥å¤æå¯¹è±¡å å
¥çä½ç½®ï¼åæ¶ä¹ä¼ä¸è¯¥ä½ç½®å
¶ä»å·²ç»å å
¥ç对象ç hashcode å¼ä½æ¯è¾ï¼å¦ææ²¡æç¸ç¬¦ç hashcodeï¼HashSet ä¼å设对象没æéå¤åºç°ã使¯å¦æåç°æç¸å hashcode å¼ç对象ï¼è¿æ¶ä¼è°ç¨ `equals()`æ¹æ³æ¥æ£æ¥ hashcode ç¸çç对象æ¯å¦ççç¸åã妿䏤è
ç¸åï¼HashSet å°±ä¸ä¼è®©å
¶å å
¥æä½æåã妿ä¸åçè¯ï¼å°±ä¼éæ°æ£åå°å
¶ä»ä½ç½®ãï¼æèªæç Java å¯è书ãHead first javaã第äºçï¼ãè¿æ ·æä»¬å°±å¤§å¤§åå°äº equals çæ¬¡æ°ï¼ç¸åºå°±å¤§å¤§æé«äºæ§è¡é度ã
éè¿æä»¬å¯ä»¥çåºï¼`hashCode()` çä½ç¨å°±æ¯**è·ååå¸ç **ï¼ä¹ç§°ä¸ºæ£åç ï¼å®å®é
䏿¯è¿åä¸ä¸ª int æ´æ°ãè¿ä¸ª**åå¸ç çä½ç¨**æ¯ç¡®å®è¯¥å¯¹è±¡å¨åå¸è¡¨ä¸çç´¢å¼ä½ç½®ã**`hashCode()`卿£åè¡¨ä¸ææç¨ï¼å¨å
¶å®æ
åµä¸æ²¡ç¨**ã卿£åè¡¨ä¸ hashCode() çä½ç¨æ¯è·åå¯¹è±¡çæ£åç ï¼è¿èç¡®å®è¯¥å¯¹è±¡å¨æ£å表ä¸çä½ç½®ã
#### hashCodeï¼ï¼ä¸ equalsï¼ï¼çç¸å
³è§å®
1. å¦æä¸¤ä¸ªå¯¹è±¡ç¸çï¼å hashcode ä¸å®ä¹æ¯ç¸åç
2. 两个对象ç¸ç,对两个对象åå«è°ç¨ equals æ¹æ³é½è¿å true
3. 两个对象æç¸åç hashcode å¼ï¼å®ä»¬ä¹ä¸ä¸å®æ¯ç¸çç
4. **å æ¤ï¼equals æ¹æ³è¢«è¦çè¿ï¼å hashCode æ¹æ³ä¹å¿
须被è¦ç**
5. hashCode() çé»è®¤è¡ä¸ºæ¯å¯¹å ä¸ç对象产çç¬ç¹å¼ãå¦ææ²¡æéå hashCode()ï¼å该 class ç两个对象æ 论å¦ä½é½ä¸ä¼ç¸çï¼å³ä½¿è¿ä¸¤ä¸ªå¯¹è±¡æåç¸åçæ°æ®ï¼
æ¨èé
读ï¼[Java hashCode() å equals()çè¥å¹²é®é¢è§£ç](https://www.cnblogs.com/skywang12345/p/3324958.html)
### 28. 为ä»ä¹ Java ä¸åªæå¼ä¼ éï¼
[为ä»ä¹ Java ä¸åªæå¼ä¼ éï¼](https://juejin.im/post/5e18879e6fb9a02fc63602e2)
### 29. ç®è¿°çº¿ç¨ãç¨åºãè¿ç¨çåºæ¬æ¦å¿µã以åä»ä»¬ä¹é´å
³ç³»æ¯ä»ä¹?
**线ç¨**ä¸è¿ç¨ç¸ä¼¼ï¼ä½çº¿ç¨æ¯ä¸ä¸ªæ¯è¿ç¨æ´å°çæ§è¡åä½ãä¸ä¸ªè¿ç¨å¨å
¶æ§è¡çè¿ç¨ä¸å¯ä»¥äº§çå¤ä¸ªçº¿ç¨ãä¸è¿ç¨ä¸åçæ¯åç±»çå¤ä¸ªçº¿ç¨å
±äº«åä¸åå
å空é´åä¸ç»ç³»ç»èµæºï¼æä»¥ç³»ç»å¨äº§çä¸ä¸ªçº¿ç¨ï¼ææ¯å¨å个线ç¨ä¹é´ä½åæ¢å·¥ä½æ¶ï¼è´æ
è¦æ¯è¿ç¨å°å¾å¤ï¼ä¹æ£å ä¸ºå¦æ¤ï¼çº¿ç¨ä¹è¢«ç§°ä¸ºè½»é级è¿ç¨ã
**ç¨åº**æ¯å«ææä»¤åæ°æ®çæä»¶ï¼è¢«åå¨å¨ç£çæå
¶ä»çæ°æ®åå¨è®¾å¤ä¸ï¼ä¹å°±æ¯è¯´ç¨åºæ¯éæç代ç ã
**è¿ç¨**æ¯ç¨åºç䏿¬¡æ§è¡è¿ç¨ï¼æ¯ç³»ç»è¿è¡ç¨åºçåºæ¬åä½ï¼å æ¤è¿ç¨æ¯å¨æçãç³»ç»è¿è¡ä¸ä¸ªç¨åºå³æ¯ä¸ä¸ªè¿ç¨ä»å建ï¼è¿è¡å°æ¶äº¡çè¿ç¨ãç®åæ¥è¯´ï¼ä¸ä¸ªè¿ç¨å°±æ¯ä¸ä¸ªæ§è¡ä¸çç¨åºï¼å®å¨è®¡ç®æºä¸ä¸ä¸ªæä»¤æ¥çä¸ä¸ªæä»¤å°æ§è¡çï¼åæ¶ï¼æ¯ä¸ªè¿ç¨è¿å ææäºç³»ç»èµæºå¦ CPU æ¶é´ï¼å
å空é´ï¼æä»¶ï¼è¾å
¥è¾åºè®¾å¤çä½¿ç¨æççãæ¢å¥è¯è¯´ï¼å½ç¨åºå¨æ§è¡æ¶ï¼å°ä¼è¢«æä½ç³»ç»è½½å
¥å
åä¸ã
çº¿ç¨æ¯è¿ç¨ååæçæ´å°çè¿è¡åä½ã线ç¨åè¿ç¨æå¤§çä¸åå¨äºåºæ¬ä¸åè¿ç¨æ¯ç¬ç«çï¼èå线ç¨åä¸ä¸å®ï¼å 为åä¸è¿ç¨ä¸ççº¿ç¨ææå¯è½ä¼ç¸äºå½±åãä»å¦ä¸è§åº¦æ¥è¯´ï¼è¿ç¨å±äºæä½ç³»ç»çèç´ï¼ä¸»è¦æ¯å䏿®µæ¶é´å
ï¼å¯ä»¥åæ¶æ§è¡ä¸ä¸ªä»¥ä¸çç¨åºï¼è线ç¨åæ¯å¨åä¸ç¨åºå
å ä¹åæ¶æ§è¡ä¸ä¸ªä»¥ä¸çç¨åºæ®µã
### 30. çº¿ç¨æåªäºåºæ¬ç¶æ?
Java 线ç¨å¨è¿è¡ççå½å¨æä¸çæå®æ¶å»åªå¯è½å¤äºä¸é¢ 6 ç§ä¸åç¶æçå
¶ä¸ä¸ä¸ªç¶æï¼å¾æºãJava å¹¶åç¼ç¨èºæ¯ã4.1.4 èï¼ã

线ç¨å¨çå½å¨æä¸å¹¶ä¸æ¯åºå®å¤äºæä¸ä¸ªç¶æèæ¯éç代ç çæ§è¡å¨ä¸åç¶æä¹é´åæ¢ãJava 线ç¨ç¶æåè¿å¦ä¸å¾æç¤ºï¼å¾æºãJava å¹¶åç¼ç¨èºæ¯ã4.1.4 èï¼ï¼

ç±ä¸å¾å¯ä»¥çåºï¼
线ç¨å建ä¹åå®å°å¤äº **NEWï¼æ°å»ºï¼** ç¶æï¼è°ç¨ `start()` æ¹æ³åå¼å§è¿è¡ï¼çº¿ç¨è¿æ¶åå¤äº **READYï¼å¯è¿è¡ï¼** ç¶æãå¯è¿è¡ç¶æç线ç¨è·å¾äº cpu æ¶é´çï¼timesliceï¼åå°±å¤äº **RUNNINGï¼è¿è¡ï¼** ç¶æã
> æä½ç³»ç»éè Java èææºï¼JVMï¼ä¸ç READY å RUNNING ç¶æï¼å®åªè½çå° RUNNABLE ç¶æï¼å¾æºï¼[HowToDoInJava](https://howtodoinjava.com/)ï¼[Java Thread Life Cycle and Thread States](https://howtodoinjava.com/java/multi-threading/java-thread-life-cycle-and-thread-states/)ï¼ï¼æä»¥ Java ç³»ç»ä¸è¬å°è¿ä¸¤ä¸ªç¶æç»ç§°ä¸º **RUNNABLEï¼è¿è¡ä¸ï¼** ç¶æ ã

å½çº¿ç¨æ§è¡ `wait()`æ¹æ³ä¹åï¼çº¿ç¨è¿å
¥ **WAITINGï¼çå¾
ï¼**ç¶æãè¿å
¥çå¾
ç¶æç线ç¨éè¦ä¾é å
¶ä»çº¿ç¨çéç¥æè½å¤è¿åå°è¿è¡ç¶æï¼è **TIME_WAITING(è¶
æ¶çå¾
)** ç¶æç¸å½äºå¨çå¾
ç¶æçåºç¡ä¸å¢å äºè¶
æ¶éå¶ï¼æ¯å¦éè¿ `sleepï¼long millisï¼`æ¹æ³æ `waitï¼long millisï¼`æ¹æ³å¯ä»¥å° Java 线ç¨ç½®äº TIMED WAITING ç¶æãå½è¶
æ¶æ¶é´å°è¾¾å Java 线ç¨å°ä¼è¿åå° RUNNABLE ç¶æãå½çº¿ç¨è°ç¨åæ¥æ¹æ³æ¶ï¼å¨æ²¡æè·åå°éçæ
åµä¸ï¼çº¿ç¨å°ä¼è¿å
¥å° **BLOCKEDï¼é»å¡ï¼** ç¶æã线ç¨å¨æ§è¡ Runnable ç`run()`æ¹æ³ä¹åå°ä¼è¿å
¥å° **TERMINATEDï¼ç»æ¢ï¼** ç¶æã
### 31 å
³äº final å
³é®åçä¸äºæ»ç»
final å
³é®å主è¦ç¨å¨ä¸ä¸ªå°æ¹ï¼åéãæ¹æ³ãç±»ã
1. 对äºä¸ä¸ª final åéï¼å¦ææ¯åºæ¬æ°æ®ç±»åçåéï¼åå
¶æ°å¼ä¸æ¦å¨åå§åä¹å便ä¸è½æ´æ¹ï¼å¦ææ¯å¼ç¨ç±»åçåéï¼åå¨å¯¹å
¶åå§åä¹å便ä¸è½å让å
¶æåå¦ä¸ä¸ªå¯¹è±¡ã
2. å½ç¨ final 修饰ä¸ä¸ªç±»æ¶ï¼è¡¨æè¿ä¸ªç±»ä¸è½è¢«ç»§æ¿ãfinal ç±»ä¸çæææåæ¹æ³é½ä¼è¢«éå¼å°æå®ä¸º final æ¹æ³ã
3. ä½¿ç¨ final æ¹æ³çåå æä¸¤ä¸ªã第ä¸ä¸ªåå æ¯ææ¹æ³éå®ï¼ä»¥é²ä»»ä½ç»§æ¿ç±»ä¿®æ¹å®çå«ä¹ï¼ç¬¬äºä¸ªåå æ¯æçã卿©æç Java å®ç°çæ¬ä¸ï¼ä¼å° final æ¹æ³è½¬ä¸ºå
åµè°ç¨ã使¯å¦ææ¹æ³è¿äºåºå¤§ï¼å¯è½çä¸å°å
åµè°ç¨å¸¦æ¥ç任使§è½æåï¼ç°å¨ç Java çæ¬å·²ç»ä¸éè¦ä½¿ç¨ final æ¹æ³è¿è¡è¿äºä¼åäºï¼ãç±»ä¸ææç private æ¹æ³é½éå¼å°æå®ä¸º finalã
### 32 Java ä¸çå¼å¸¸å¤ç
#### Java å¼å¸¸ç±»å±æ¬¡ç»æå¾

å¨ Java ä¸ï¼ææçå¼å¸¸é½æä¸ä¸ªå
±åçç¥å
java.lang å
ä¸ç **Throwable ç±»**ãThrowableï¼ æä¸¤ä¸ªéè¦çåç±»ï¼**Exceptionï¼å¼å¸¸ï¼** å **Errorï¼é误ï¼** ï¼äºè
齿¯ Java å¼å¸¸å¤ççéè¦åç±»ï¼åèªé½å
å«å¤§éåç±»ã
**Errorï¼é误ï¼:æ¯ç¨åºæ æ³å¤ççé误**ï¼è¡¨ç¤ºè¿è¡åºç¨ç¨åºä¸è¾ä¸¥éé®é¢ã大夿°é误ä¸ä»£ç ç¼åè
æ§è¡çæä½æ å
³ï¼è表示代ç è¿è¡æ¶ JVMï¼Java èææºï¼åºç°çé®é¢ãä¾å¦ï¼Java èææºè¿è¡é误ï¼Virtual MachineErrorï¼ï¼å½ JVM ä¸åæç»§ç»æ§è¡æä½æéçå
åèµæºæ¶ï¼å°åºç° OutOfMemoryErrorãè¿äºå¼å¸¸åçæ¶ï¼Java èææºï¼JVMï¼ä¸è¬ä¼éæ©çº¿ç¨ç»æ¢ã
è¿äºé误表示æ
éåçäºèææºèªèº«ãæè
åçå¨èææºè¯å¾æ§è¡åºç¨æ¶ï¼å¦ Java èææºè¿è¡é误ï¼Virtual MachineErrorï¼ãç±»å®ä¹é误ï¼NoClassDefFoundErrorï¼çãè¿äºé误æ¯ä¸å¯æ¥çï¼å 为å®ä»¬å¨åºç¨ç¨åºçæ§å¶åå¤çè½åä¹ å¤ï¼èä¸ç»å¤§å¤æ°æ¯ç¨åºè¿è¡æ¶ä¸å
许åºç°çç¶åµã对äºè®¾è®¡åççåºç¨ç¨åºæ¥è¯´ï¼å³ä½¿ç¡®å®åçäºéè¯¯ï¼æ¬è´¨ä¸ä¹ä¸åºè¯¥è¯å¾å»å¤ç宿å¼èµ·çå¼å¸¸ç¶åµãå¨ Java ä¸ï¼é误éè¿ Error çåç±»æè¿°ã
**Exceptionï¼å¼å¸¸ï¼:æ¯ç¨åºæ¬èº«å¯ä»¥å¤ççå¼å¸¸**ãException ç±»æä¸ä¸ªéè¦çåç±» **RuntimeException**ãRuntimeException å¼å¸¸ç± Java èææºæåºã**NullPointerException**ï¼è¦è®¿é®çåéæ²¡æå¼ç¨ä»»ä½å¯¹è±¡æ¶ï¼æåºè¯¥å¼å¸¸ï¼ã**ArithmeticException**ï¼ç®æ¯è¿ç®å¼å¸¸ï¼ä¸ä¸ªæ´æ°é¤ä»¥ 0 æ¶ï¼æåºè¯¥å¼å¸¸ï¼å **ArrayIndexOutOfBoundsException** ï¼ä¸æ è¶çå¼å¸¸ï¼ã
**注æï¼å¼å¸¸åé误çåºå«ï¼å¼å¸¸è½è¢«ç¨åºæ¬èº«å¤çï¼éè¯¯æ¯æ æ³å¤çã**
#### Throwable ç±»å¸¸ç¨æ¹æ³
- **public string getMessage()**:è¿åå¼å¸¸åçæ¶çç®è¦æè¿°
- **public string toString()**:è¿åå¼å¸¸åçæ¶ç详ç»ä¿¡æ¯
- **public string getLocalizedMessage()**:è¿åå¼å¸¸å¯¹è±¡çæ¬å°åä¿¡æ¯ãä½¿ç¨ Throwable çåç±»è¦çè¿ä¸ªæ¹æ³ï¼å¯ä»¥çææ¬å°åä¿¡æ¯ã妿å类没æè¦çè¯¥æ¹æ³ï¼åè¯¥æ¹æ³è¿åçä¿¡æ¯ä¸ getMessageï¼ï¼è¿åçç»æç¸å
- **public void printStackTrace()**:卿§å¶å°ä¸æå° Throwable 对象å°è£
çå¼å¸¸ä¿¡æ¯
#### å¼å¸¸å¤çæ»ç»
- **try åï¼** ç¨äºæè·å¼å¸¸ãå
¶å坿¥é¶ä¸ªæå¤ä¸ª catch åï¼å¦ææ²¡æ catch åï¼åå¿
é¡»è·ä¸ä¸ª finally åã
- **catch åï¼** ç¨äºå¤ç try æè·å°çå¼å¸¸ã
- **finally åï¼** æ 论æ¯å¦æè·æå¤çå¼å¸¸ï¼finally åéçè¯å¥é½ä¼è¢«æ§è¡ãå½å¨ try åæ catch åä¸éå° return
è¯å¥æ¶ï¼finally è¯å¥åå°å¨æ¹æ³è¿åä¹å被æ§è¡ã
**å¨ä»¥ä¸ 4 ç§ç¹æ®æ
åµä¸ï¼finally åä¸ä¼è¢«æ§è¡ï¼**
1. å¨ finally è¯å¥å第ä¸è¡åçäºå¼å¸¸ã å 为å¨å
¶ä»è¡ï¼finally åè¿æ¯ä¼å¾å°æ§è¡
2. å¨åé¢ç代ç ä¸ç¨äº System.exit(int)å·²éåºç¨åºã exit æ¯å¸¦å彿° ï¼è¥è¯¥è¯å¥å¨å¼å¸¸è¯å¥ä¹åï¼finally 伿§è¡
3. ç¨åºæå¨ççº¿ç¨æ»äº¡ã
4. å
³é CPUã
ä¸é¢è¿é¨åå
容æ¥èª issue:ã
**注æï¼** å½ try è¯å¥å finally è¯å¥ä¸é½æ return è¯å¥æ¶ï¼å¨æ¹æ³è¿åä¹åï¼finally è¯å¥çå
容å°è¢«æ§è¡ï¼å¹¶ä¸ finally è¯å¥çè¿åå¼å°ä¼è¦çåå§çè¿åå¼ãå¦ä¸ï¼
```java
public static int f(int value) {
try {
return value * value;
} finally {
if (value == 2) {
return 0;
}
}
}
```
妿è°ç¨ `f(2)`ï¼è¿åå¼å°æ¯ 0ï¼å 为 finally è¯å¥çè¿åå¼è¦çäº try è¯å¥åçè¿åå¼ã
### 33 Java åºååä¸å¦ææäºåæ®µä¸æ³è¿è¡åºååï¼æä¹åï¼
对äºä¸æ³è¿è¡åºååçåéï¼ä½¿ç¨ transient å
³é®å修饰ã
transient å
³é®åçä½ç¨æ¯ï¼é»æ¢å®ä¾ä¸é£äºç¨æ¤å
³é®å修饰ççåéåºååï¼å½å¯¹è±¡è¢«ååºååæ¶ï¼è¢« transient 修饰çåéå¼ä¸ä¼è¢«æä¹
å忢å¤ãtransient åªè½ä¿®é¥°åéï¼ä¸è½ä¿®é¥°ç±»åæ¹æ³ã
### 34 è·åç¨é®çè¾å
¥å¸¸ç¨çä¸¤ç§æ¹æ³
æ¹æ³ 1ï¼éè¿ Scanner
```java
Scanner input = new Scanner(System.in);
String s = input.nextLine();
input.close();
```
æ¹æ³ 2ï¼éè¿ BufferedReader
```java
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s = input.readLine();
```
### 35 Java ä¸ IO æµ
#### Java ä¸ IO æµå为å ç§?
- æç
§æµçæµååï¼å¯ä»¥å为è¾å
¥æµåè¾åºæµï¼
- æç
§æä½åå
ååï¼å¯ä»¥åå为åèæµåå符æµï¼
- æç
§æµçè§è²åå为èç¹æµåå¤çæµã
Java Io æµå
±æ¶å 40 å¤ä¸ªç±»ï¼è¿äºç±»çä¸å»å¾æä¹±ï¼ä½å®é
ä¸å¾æè§åï¼èä¸å½¼æ¤ä¹é´åå¨é常紧å¯çèç³»ï¼ Java I0 æµç 40 å¤ä¸ªç±»é½æ¯ä»å¦ä¸ 4 个æ½è±¡ç±»åºç±»ä¸æ´¾çåºæ¥çã
- InputStream/Reader: ææçè¾å
¥æµçåºç±»ï¼åè
æ¯åèè¾å
¥æµï¼åè
æ¯å符è¾å
¥æµã
- OutputStream/Writer: ææè¾åºæµçåºç±»ï¼åè
æ¯åèè¾åºæµï¼åè
æ¯å符è¾åºæµã
ææä½æ¹å¼åç±»ç»æå¾ï¼

ææä½å¯¹è±¡åç±»ç»æå¾ï¼

#### æ¢ç¶æäºåèæµ,为ä»ä¹è¿è¦æå符æµ?
é®é¢æ¬è´¨æ³é®ï¼**ä¸ç®¡æ¯æä»¶è¯»åè¿æ¯ç½ç»å鿥æ¶ï¼ä¿¡æ¯çæå°åå¨åå
齿¯åèï¼é£ä¸ºä»ä¹ I/O æµæä½è¦å为åèæµæä½ååç¬¦æµæä½å¢ï¼**
åçï¼åç¬¦æµæ¯ç± Java èææºå°åè转æ¢å¾å°çï¼é®é¢å°±åºå¨è¿ä¸ªè¿ç¨è¿ç®æ¯éå¸¸èæ¶ï¼å¹¶ä¸ï¼å¦ææä»¬ä¸ç¥éç¼ç ç±»åå°±å¾å®¹æåºç°ä¹±ç é®é¢ãæä»¥ï¼ I/O æµå°±å¹²èæä¾äºä¸ä¸ªç´æ¥æä½åç¬¦çæ¥å£ï¼æ¹ä¾¿æä»¬å¹³æ¶å¯¹å符è¿è¡æµæä½ã妿é³é¢æä»¶ãå¾ççåªä½æä»¶ç¨åèæµæ¯è¾å¥½ï¼å¦ææ¶åå°å符çè¯ä½¿ç¨åç¬¦æµæ¯è¾å¥½ã
#### BIO,NIO,AIO æä»ä¹åºå«?
- **BIO (Blocking I/O):** 忥é»å¡ I/O 模å¼ï¼æ°æ®ç读ååå
¥å¿
é¡»é»å¡å¨ä¸ä¸ªçº¿ç¨å
çå¾
å
¶å®æã卿´»å¨è¿æ¥æ°ä¸æ¯ç¹å«é«ï¼å°äºåæº 1000ï¼çæ
åµä¸ï¼è¿ç§æ¨¡åæ¯æ¯è¾ä¸éçï¼å¯ä»¥è®©æ¯ä¸ä¸ªè¿æ¥ä¸æ³¨äºèªå·±ç I/O å¹¶ä¸ç¼ç¨æ¨¡åç®åï¼ä¹ä¸ç¨è¿å¤èèç³»ç»çè¿è½½ãéæµçé®é¢ãçº¿ç¨æ± æ¬èº«å°±æ¯ä¸ä¸ªå¤©ç¶çæ¼æï¼å¯ä»¥ç¼å²ä¸äºç³»ç»å¤çä¸äºçè¿æ¥æè¯·æ±ã使¯ï¼å½é¢å¯¹åä¸çè³ç¾ä¸çº§è¿æ¥çæ¶åï¼ä¼ ç»ç BIO æ¨¡åæ¯æ è½ä¸ºåçãå æ¤ï¼æä»¬éè¦ä¸ç§æ´é«æç I/O å¤çæ¨¡åæ¥åºå¯¹æ´é«çå¹¶åéã
- **NIO (Non-blocking/New I/O):** NIO æ¯ä¸ç§åæ¥éé»å¡ç I/O 模åï¼å¨ Java 1.4 ä¸å¼å
¥äº NIO æ¡æ¶ï¼å¯¹åº java.nio å
ï¼æä¾äº Channel , Selectorï¼Buffer çæ½è±¡ãNIO ä¸ç N å¯ä»¥ç解为 Non-blockingï¼ä¸åçº¯æ¯ Newã宿¯æé¢åç¼å²çï¼åºäºééç I/O æä½æ¹æ³ã NIO æä¾äºä¸ä¼ ç» BIO 模åä¸ç `Socket` å `ServerSocket` ç¸å¯¹åºç `SocketChannel` å `ServerSocketChannel` 两ç§ä¸åç奿¥åééå®ç°,两ç§éé齿¯æé»å¡åéé»å¡ä¸¤ç§æ¨¡å¼ãé»å¡æ¨¡å¼ä½¿ç¨å°±åä¼ ç»ä¸çæ¯æä¸æ ·ï¼æ¯è¾ç®åï¼ä½æ¯æ§è½åå¯é æ§é½ä¸å¥½ï¼éé»å¡æ¨¡å¼æ£å¥½ä¸ä¹ç¸åã对äºä½è´è½½ãä½å¹¶åçåºç¨ç¨åºï¼å¯ä»¥ä½¿ç¨åæ¥é»å¡ I/O æ¥æåå¼åéç忴好çç»´æ¤æ§ï¼å¯¹äºé«è´è½½ãé«å¹¶åçï¼ç½ç»ï¼åºç¨ï¼åºä½¿ç¨ NIO çéé»å¡æ¨¡å¼æ¥å¼å
- **AIO (Asynchronous I/O):** AIO ä¹å°±æ¯ NIO 2ãå¨ Java 7 ä¸å¼å
¥äº NIO çæ¹è¿ç NIO 2,宿¯å¼æ¥éé»å¡ç IO 模åã弿¥ IO æ¯åºäºäºä»¶ååè°æºå¶å®ç°çï¼ä¹å°±æ¯åºç¨æä½ä¹åä¼ç´æ¥è¿åï¼ä¸ä¼å µå¡å¨é£éï¼å½åå°å¤çå®æï¼æä½ç³»ç»ä¼éç¥ç¸åºç线ç¨è¿è¡åç»çæä½ãAIO æ¯å¼æ¥ IO ç缩åï¼è½ç¶ NIO å¨ç½ç»æä½ä¸ï¼æä¾äºéé»å¡çæ¹æ³ï¼ä½æ¯ NIO ç IO è¡ä¸ºè¿æ¯åæ¥çãå¯¹äº NIO æ¥è¯´ï¼æä»¬çä¸å¡çº¿ç¨æ¯å¨ IO æä½åå¤å¥½æ¶ï¼å¾å°éç¥ï¼æ¥çå°±ç±è¿ä¸ªçº¿ç¨èªè¡è¿è¡ IO æä½ï¼IO æä½æ¬èº«æ¯åæ¥çãæ¥é
ç½ä¸ç¸å
³èµæï¼æåç°å°±ç®åæ¥è¯´ AIO çåºç¨è¿ä¸æ¯å¾å¹¿æ³ï¼Netty ä¹åä¹å°è¯ä½¿ç¨è¿ AIOï¼ä¸è¿åæ¾å¼äºã
### 36. 常è§å
³é®åæ»ç»:static,final,this,super
详è§ç¬ä¸»çè¿ç¯æç« : https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/basic/final,static,this,super.md
### 37. Collections å·¥å
·ç±»å Arrays å·¥å
·ç±»å¸¸è§æ¹æ³æ»ç»
详è§ç¬ä¸»çè¿ç¯æç« : [https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/basic/Arrays,CollectionsCommonMethods.md](https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/basic/Arrays,CollectionsCommonMethods.md)
### 38. æ·±æ·è´ vs æµ
æ·è´
1. **æµ
æ·è´**ï¼å¯¹åºæ¬æ°æ®ç±»åè¿è¡å¼ä¼ éï¼å¯¹å¼ç¨æ°æ®ç±»åè¿è¡å¼ç¨ä¼ éè¬çæ·è´ï¼æ¤ä¸ºæµ
æ·è´ã
2. **æ·±æ·è´**ï¼å¯¹åºæ¬æ°æ®ç±»åè¿è¡å¼ä¼ éï¼å¯¹å¼ç¨æ°æ®ç±»åï¼å建ä¸ä¸ªæ°ç对象ï¼å¹¶å¤å¶å
¶å
å®¹ï¼æ¤ä¸ºæ·±æ·è´ã

### åè
- https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre
- https://www.educba.com/oracle-vs-openjdk/
- https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk?answertab=active#tab-top
### å
¬ä¼å·
妿大家æ³è¦å®æ¶å
³æ³¨ææ´æ°çæç« 以åå享ç干货çè¯ï¼å¯ä»¥å
³æ³¨æçå
¬ä¼å·ã
**ãJavaGuide é¢è¯çªå»çã :** ç±æ¬ææ¡£è¡ççä¸ä¸ºé¢è¯èççãJavaGuide é¢è¯çªå»çã çæ¬[å
¬ä¼å·](#å
¬ä¼å·)åå°åå¤ **"Java é¢è¯çªå»"** å³å¯å
è´¹é¢åï¼
**Java å·¥ç¨å¸å¿
å¤å¦ä¹ èµæº:** ä¸äº Java å·¥ç¨å¸å¸¸ç¨å¦ä¹ èµæºå
¬ä¼å·åå°åå¤å
³é®å **â1â** å³å¯å
è´¹æ å¥è·¯è·åã

## 2.2 Javaéå
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
### 2.2.1 说说List,Set,Mapä¸è
çåºå«ï¼
- **List(对ä»é¡ºåºç好帮æ)ï¼** Listæ¥å£åå¨ä¸ç»ä¸å¯ä¸ï¼å¯ä»¥æå¤ä¸ªå
ç´ å¼ç¨ç¸åç对象ï¼ï¼æåºç对象
- **Set(注éç¬ä¸æ äºçæ§è´¨):** ä¸å
许éå¤çéåãä¸ä¼æå¤ä¸ªå
ç´ å¼ç¨ç¸åç对象ã
- **Map(ç¨Keyæ¥æç´¢çä¸å®¶):** 使ç¨é®å¼å¯¹åå¨ãMapä¼ç»´æ¤ä¸Keyæå
³èçå¼ã两个Keyå¯ä»¥å¼ç¨ç¸åç对象ï¼ä½Keyä¸è½éå¤ï¼å
¸åçKeyæ¯Stringç±»åï¼ä½ä¹å¯ä»¥æ¯ä»»ä½å¯¹è±¡ã
### 2.2.2 Arraylist ä¸ LinkedList åºå«?
- **1. æ¯å¦ä¿è¯çº¿ç¨å®å
¨ï¼** `ArrayList` å `LinkedList` 齿¯ä¸åæ¥çï¼ä¹å°±æ¯ä¸ä¿è¯çº¿ç¨å®å
¨ï¼
- **2. åºå±æ°æ®ç»æï¼** `Arraylist` åºå±ä½¿ç¨çæ¯ **`Object` æ°ç»**ï¼`LinkedList` åºå±ä½¿ç¨çæ¯ **ååé¾è¡¨** æ°æ®ç»æï¼JDK1.6ä¹å为循ç¯é¾è¡¨ï¼JDK1.7åæ¶äºå¾ªç¯ã注æååé¾è¡¨ååå循ç¯é¾è¡¨çåºå«ï¼ä¸é¢æä»ç»å°ï¼ï¼
- **3. æå
¥åå 餿¯å¦åå
ç´ ä½ç½®çå½±åï¼** â **`ArrayList` éç¨æ°ç»åå¨ï¼æä»¥æå
¥åå é¤å
ç´ çæ¶é´å¤æåº¦åå
ç´ ä½ç½®çå½±åã** æ¯å¦ï¼æ§è¡`add(E e) `æ¹æ³çæ¶åï¼ `ArrayList` ä¼é»è®¤å¨å°æå®çå
ç´ è¿½å å°æ¤åè¡¨çæ«å°¾ï¼è¿ç§æ
嵿¶é´å¤æåº¦å°±æ¯O(1)ã使¯å¦æè¦å¨æå®ä½ç½® i æå
¥åå é¤å
ç´ çè¯ï¼`add(int index, E element) `ï¼æ¶é´å¤æåº¦å°±ä¸º O(n-i)ãå 为å¨è¿è¡ä¸è¿°æä½çæ¶åéåä¸ç¬¬ i å第 i 个å
ç´ ä¹åç(n-i)个å
ç´ é½è¦æ§è¡ååä½/ååç§»ä¸ä½çæä½ã â¡ **`LinkedList` éç¨é¾è¡¨åå¨ï¼æä»¥å¯¹äº`add(E e)`æ¹æ³çæå
¥ï¼å é¤å
ç´ æ¶é´å¤æåº¦ä¸åå
ç´ ä½ç½®çå½±åï¼è¿ä¼¼ Oï¼1ï¼ï¼å¦ææ¯è¦å¨æå®ä½ç½®`i`æå
¥åå é¤å
ç´ çè¯ï¼`(add(int index, E element)`ï¼ æ¶é´å¤æåº¦è¿ä¼¼ä¸º`o(n))`å 为éè¦å
ç§»å¨å°æå®ä½ç½®åæå
¥ã**
- **4. æ¯å¦æ¯æå¿«ééæºè®¿é®ï¼** `LinkedList` 䏿¯æé«æçéæºå
ç´ è®¿é®ï¼è `ArrayList` æ¯æãå¿«ééæºè®¿é®å°±æ¯éè¿å
ç´ çåºå·å¿«éè·åå
ç´ å¯¹è±¡(对åºäº`get(int index) `æ¹æ³)ã
- **5. å
å空é´å ç¨ï¼** ArrayListç空 é´æµªè´¹ä¸»è¦ä½ç°å¨å¨listå表çç»å°¾ä¼é¢çä¸å®ç容é空é´ï¼èLinkedListç空é´è±è´¹åä½ç°å¨å®çæ¯ä¸ä¸ªå
ç´ é½éè¦æ¶èæ¯ArrayListæ´å¤ç空é´ï¼å 为è¦åæ¾ç´æ¥åç»§åç´æ¥å驱以忰æ®ï¼ã
#### **è¡¥å
å
容:RandomAccessæ¥å£**
```java
public interface RandomAccess {
}
```
æ¥çæºç æä»¬åç°å®é
ä¸ `RandomAccess` æ¥å£ä¸ä»ä¹é½æ²¡æå®ä¹ãæä»¥ï¼å¨æçæ¥ `RandomAccess` æ¥å£ä¸è¿æ¯ä¸ä¸ªæ è¯ç½¢äºãæ è¯ä»ä¹ï¼ æ è¯å®ç°è¿ä¸ªæ¥å£çç±»å
·æéæºè®¿é®åè½ã
å¨ `binarySearchï¼`ï¼æ¹æ³ä¸ï¼å®è¦å¤æä¼ å
¥çlist æ¯å¦ `RamdomAccess` çå®ä¾ï¼å¦ææ¯ï¼è°ç¨`indexedBinarySearchï¼ï¼`æ¹æ³ï¼å¦æä¸æ¯ï¼é£ä¹è°ç¨`iteratorBinarySearchï¼ï¼`æ¹æ³
```java
public static
int binarySearch(List extends Comparable super T>> list, T key) {
if (list instanceof RandomAccess || list.size() å¦å¤æ¨èä¸ç¯æååé¾è¡¨è®²æ¸
æ¥çæç« ï¼[https://juejin.im/post/5b5d1a9af265da0f47352f14](https://juejin.im/post/5b5d1a9af265da0f47352f14)

**åå循ç¯é¾è¡¨ï¼** æåä¸ä¸ªèç¹ç next æåheadï¼è head çprevæåæåä¸ä¸ªèç¹ï¼ææä¸ä¸ªç¯ã

### 2.2.3 ArrayList ä¸ Vector åºå«å¢?为ä»ä¹è¦ç¨Arraylistå代Vectorå¢ï¼
`Vector`ç±»çæææ¹æ³é½æ¯åæ¥çãå¯ä»¥ç±ä¸¤ä¸ªçº¿ç¨å®å
¨å°è®¿é®ä¸ä¸ªVector对象ã使¯ä¸ä¸ªçº¿ç¨è®¿é®Vectorçè¯ä»£ç è¦å¨åæ¥æä½ä¸è费大éçæ¶é´ã
`Arraylist`䏿¯åæ¥çï¼æä»¥å¨ä¸éè¦ä¿è¯çº¿ç¨å®å
¨æ¶å»ºè®®ä½¿ç¨Arraylistã
### 2.2.4 说ä¸è¯´ ArrayList çæ©å®¹æºå¶å§
详è§ç¬ä¸»çè¿ç¯æç« :[éè¿æºç 䏿¥ä¸æ¥åæArrayList æ©å®¹æºå¶](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/ArrayList-Grow.md)
### 2.2.5 HashMap å Hashtable çåºå«
1. **çº¿ç¨æ¯å¦å®å
¨ï¼** HashMap æ¯é线ç¨å®å
¨çï¼HashTable æ¯çº¿ç¨å®å
¨çï¼HashTable å
é¨çæ¹æ³åºæ¬é½ç»è¿`synchronized` 修饰ãï¼å¦æä½ è¦ä¿è¯çº¿ç¨å®å
¨çè¯å°±ä½¿ç¨ ConcurrentHashMap å§ï¼ï¼ï¼
2. **æçï¼** å 为线ç¨å®å
¨çé®é¢ï¼HashMap è¦æ¯ HashTable æçé«ä¸ç¹ãå¦å¤ï¼HashTable åºæ¬è¢«æ·æ±°ï¼ä¸è¦å¨ä»£ç ä¸ä½¿ç¨å®ï¼
3. **对Null key åNull valueçæ¯æï¼** HashMap ä¸ï¼null å¯ä»¥ä½ä¸ºé®ï¼è¿æ ·çé®åªæä¸ä¸ªï¼å¯ä»¥æä¸ä¸ªæå¤ä¸ªé®æå¯¹åºçå¼ä¸º nullãã使¯å¨ HashTable ä¸ put è¿çé®å¼åªè¦æä¸ä¸ª nullï¼ç´æ¥æåº NullPointerExceptionã
4. **åå§å®¹é大å°åæ¯æ¬¡æ©å
容é大å°çä¸å ï¼** â å建æ¶å¦æä¸æå®å®¹éåå§å¼ï¼Hashtable é»è®¤çåå§å¤§å°ä¸º11ï¼ä¹åæ¯æ¬¡æ©å
ï¼å®¹éåä¸ºåæ¥ç2n+1ãHashMap é»è®¤çåå§å大å°ä¸º16ãä¹åæ¯æ¬¡æ©å
ï¼å®¹éåä¸ºåæ¥ç2åãâ¡å建æ¶å¦æç»å®äºå®¹éåå§å¼ï¼é£ä¹ Hashtable ä¼ç´æ¥ä½¿ç¨ä½ ç»å®ç大å°ï¼è HashMap ä¼å°å
¶æ©å
为2ç广¬¡æ¹å¤§å°ï¼HashMap ä¸ç`tableSizeFor()`æ¹æ³ä¿è¯ï¼ä¸é¢ç»åºäºæºä»£ç ï¼ãä¹å°±æ¯è¯´ HashMap æ»æ¯ä½¿ç¨2çå¹ä½ä¸ºåå¸è¡¨ç大å°,åé¢ä¼ä»ç»å°ä¸ºä»ä¹æ¯2ç广¬¡æ¹ã
5. **åºå±æ°æ®ç»æï¼** JDK1.8 以åç HashMap å¨è§£å³åå¸å²çªæ¶æäºè¾å¤§çååï¼å½é¾è¡¨é¿åº¦å¤§äºéå¼ï¼é»è®¤ä¸º8ï¼æ¶ï¼å°é¾è¡¨è½¬åä¸ºçº¢é»æ ï¼ä»¥åå°æç´¢æ¶é´ãHashtable 没æè¿æ ·çæºå¶ã
**HashMap ä¸å¸¦æåå§å®¹éçæé 彿°ï¼**
```java
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
this.loadFactor = loadFactor;
this.threshold = tableSizeFor(initialCapacity);
}
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
```
ä¸é¢è¿ä¸ªæ¹æ³ä¿è¯äº HashMap æ»æ¯ä½¿ç¨2çå¹ä½ä¸ºåå¸è¡¨ç大å°ã
```java
/**
* Returns a power of two size for the given target capacity.
*/
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
```
### 2.2.6 HashMap å HashSetåºå«
å¦æä½ çè¿ `HashSet` æºç çè¯å°±åºè¯¥ç¥éï¼HashSet åºå±å°±æ¯åºäº HashMap å®ç°çãï¼HashSet çæºç é常é常å°ï¼å 为é¤äº `clone() `ã`writeObject()`ã`readObject()`æ¯ HashSet èªå·±ä¸å¾ä¸å®ç°ä¹å¤ï¼å
¶ä»æ¹æ³é½æ¯ç´æ¥è°ç¨ HashMap ä¸çæ¹æ³ã
| HashMap | HashSet |
| :------------------------------: | :----------------------------------------------------------: |
| å®ç°äºMapæ¥å£ | å®ç°Setæ¥å£ |
| åå¨é®å¼å¯¹ | ä»
åå¨å¯¹è±¡ |
| è°ç¨ `putï¼ï¼`åmap䏿·»å å
ç´ | è°ç¨ `addï¼ï¼`æ¹æ³åSet䏿·»å å
ç´ |
| HashMap使ç¨é®ï¼Keyï¼è®¡ç®Hashcode | HashSetä½¿ç¨æå对象æ¥è®¡ç®hashcodeå¼ï¼å¯¹äºä¸¤ä¸ªå¯¹è±¡æ¥è¯´hashcodeå¯è½ç¸åï¼æä»¥equals()æ¹æ³ç¨æ¥å¤æå¯¹è±¡çç¸çæ§ï¼ |
### 2.2.7 HashSetå¦ä½æ£æ¥éå¤
å½ä½ æå¯¹è±¡å å
¥`HashSet`æ¶ï¼HashSetä¼å
计ç®å¯¹è±¡ç`hashcode`弿¥å¤æå¯¹è±¡å å
¥çä½ç½®ï¼åæ¶ä¹ä¼ä¸å
¶ä»å å
¥ç对象çhashcodeå¼ä½æ¯è¾ï¼å¦ææ²¡æç¸ç¬¦çhashcodeï¼HashSetä¼å设对象没æéå¤åºç°ã使¯å¦æåç°æç¸åhashcodeå¼ç对象ï¼è¿æ¶ä¼è°ç¨`equalsï¼ï¼`æ¹æ³æ¥æ£æ¥hashcodeç¸çç对象æ¯å¦ççç¸åã妿䏤è
ç¸åï¼HashSetå°±ä¸ä¼è®©å å
¥æä½æåãï¼æèªæçJavaå¯è书ãHead fist javaã第äºçï¼
**hashCodeï¼ï¼ä¸equalsï¼ï¼çç¸å
³è§å®ï¼**
1. å¦æä¸¤ä¸ªå¯¹è±¡ç¸çï¼åhashcodeä¸å®ä¹æ¯ç¸åç
2. 两个对象ç¸ç,对两个equalsæ¹æ³è¿åtrue
3. 两个对象æç¸åçhashcodeå¼ï¼å®ä»¬ä¹ä¸ä¸å®æ¯ç¸çç
4. 综ä¸ï¼equalsæ¹æ³è¢«è¦çè¿ï¼åhashCodeæ¹æ³ä¹å¿
须被è¦ç
5. hashCode()çé»è®¤è¡ä¸ºæ¯å¯¹å ä¸ç对象产çç¬ç¹å¼ãå¦ææ²¡æéåhashCode()ï¼å该classç两个对象æ 论å¦ä½é½ä¸ä¼ç¸çï¼å³ä½¿è¿ä¸¤ä¸ªå¯¹è±¡æåç¸åçæ°æ®ï¼ã
**==ä¸equalsçåºå«**
1. ==æ¯å¤æä¸¤ä¸ªåéæå®ä¾æ¯ä¸æ¯æååä¸ä¸ªå
åç©ºé´ equalsæ¯å¤æä¸¤ä¸ªåéæå®ä¾ææåçå
å空é´ç弿¯ä¸æ¯ç¸å
2. ==æ¯æå¯¹å
åå°åè¿è¡æ¯è¾ equals()æ¯å¯¹å符串çå
容è¿è¡æ¯è¾
3. ==æå¼ç¨æ¯å¦ç¸å equals()æçæ¯å¼æ¯å¦ç¸å
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
### 2.2.8 HashMapçåºå±å®ç°
#### JDK1.8ä¹å
JDK1.8 ä¹å `HashMap` åºå±æ¯ **æ°ç»åé¾è¡¨** ç»åå¨ä¸èµ·ä½¿ç¨ä¹å°±æ¯ **é¾è¡¨æ£å**ã**HashMap éè¿ key ç hashCode ç»è¿æ°å¨å½æ°å¤çè¿åå¾å° hash å¼ï¼ç¶åéè¿ (n - 1) & hash 夿å½åå
ç´ åæ¾çä½ç½®ï¼è¿éç n æçæ¯æ°ç»çé¿åº¦ï¼ï¼å¦æå½åä½ç½®åå¨å
ç´ çè¯ï¼å°±å¤æè¯¥å
ç´ ä¸è¦åå
¥çå
ç´ ç hash å¼ä»¥å key æ¯å¦ç¸åï¼å¦æç¸åçè¯ï¼ç´æ¥è¦çï¼ä¸ç¸åå°±éè¿æé¾æ³è§£å³å²çªã**
**æè°æ°å¨å½æ°æçå°±æ¯ HashMap ç hash æ¹æ³ãä½¿ç¨ hash æ¹æ³ä¹å°±æ¯æ°å¨å½æ°æ¯ä¸ºäºé²æ¢ä¸äºå®ç°æ¯è¾å·®ç hashCode() æ¹æ³ æ¢å¥è¯è¯´ä½¿ç¨æ°å¨å½æ°ä¹åå¯ä»¥åå°ç¢°æã**
**JDK 1.8 HashMap ç hash æ¹æ³æºç :**
JDK 1.8 ç hashæ¹æ³ ç¸æ¯äº JDK 1.7 hash æ¹æ³æ´å ç®åï¼ä½æ¯åçä¸åã
```java
static final int hash(Object key) {
int h;
// key.hashCode()ï¼è¿åæ£åå¼ä¹å°±æ¯hashcode
// ^ ï¼æä½å¼æ
// >>>:æ 符å·å³ç§»ï¼å¿½ç¥ç¬¦å·ä½ï¼ç©ºä½é½ä»¥0è¡¥é½
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
```
对æ¯ä¸ä¸ JDK1.7ç HashMap ç hash æ¹æ³æºç .
```java
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
```
ç¸æ¯äº JDK1.8 ç hash æ¹æ³ ï¼JDK 1.7 ç hash æ¹æ³çæ§è½ä¼ç¨å·®ä¸ç¹ç¹ï¼å 为æ¯ç«æ°å¨äº 4 次ã
æè° **âæé¾æ³â** å°±æ¯ï¼å°é¾è¡¨åæ°ç»ç¸ç»åãä¹å°±æ¯è¯´å建ä¸ä¸ªé¾è¡¨æ°ç»ï¼æ°ç»ä¸æ¯ä¸æ ¼å°±æ¯ä¸ä¸ªé¾è¡¨ãè¥éå°åå¸å²çªï¼åå°å²çªçå¼å å°é¾è¡¨ä¸å³å¯ã

#### JDK1.8ä¹å
ç¸æ¯äºä¹åççæ¬ï¼ JDK1.8ä¹åå¨è§£å³åå¸å²çªæ¶æäºè¾å¤§çååï¼å½é¾è¡¨é¿åº¦å¤§äºéå¼ï¼é»è®¤ä¸º8ï¼æ¶ï¼å°é¾è¡¨è½¬åä¸ºçº¢é»æ ï¼ä»¥åå°æç´¢æ¶é´ã

> TreeMapãTreeSet以åJDK1.8ä¹åçHashMapåºå±é½ç¨å°äºçº¢é»æ ãçº¢é»æ å°±æ¯ä¸ºäºè§£å³äºåæ¥æ¾æ ç缺é·ï¼å 为äºåæ¥æ¾æ å¨æäºæ
åµä¸ä¼éåæä¸ä¸ªçº¿æ§ç»æã
**æ¨èé
读ï¼**
- ãJava 8ç³»åä¹éæ°è®¤è¯HashMapã ï¼
### 2.2.9 HashMap çé¿åº¦ä¸ºä»ä¹æ¯2ç广¬¡æ¹
为äºè½è®© HashMap åå髿ï¼å°½éè¾å°ç¢°æï¼ä¹å°±æ¯è¦å°½éææ°æ®åé
ååãæä»¬ä¸é¢ä¹è®²å°äºè¿äºï¼Hash å¼çèå´å¼-2147483648å°2147483647ï¼ååå èµ·æ¥å¤§æ¦40äº¿çæ å°ç©ºé´ï¼åªè¦åå¸å½æ°æ å°å¾æ¯è¾ååæ¾æ£ï¼ä¸è¬åºç¨æ¯å¾é¾åºç°ç¢°æçãä½é®é¢æ¯ä¸ä¸ª40亿é¿åº¦çæ°ç»ï¼å
忝æ¾ä¸ä¸çãæä»¥è¿ä¸ªæ£å弿¯ä¸è½ç´æ¥æ¿æ¥ç¨çãç¨ä¹åè¿è¦å
å对æ°ç»çé¿åº¦å模è¿ç®ï¼å¾å°ç使°æè½ç¨æ¥è¦åæ¾çä½ç½®ä¹å°±æ¯å¯¹åºçæ°ç»ä¸æ ãè¿ä¸ªæ°ç»ä¸æ çè®¡ç®æ¹æ³æ¯â `(n - 1) & hash`âãï¼n代表æ°ç»é¿åº¦ï¼ãè¿ä¹å°±è§£éäº HashMap çé¿åº¦ä¸ºä»ä¹æ¯2ç广¬¡æ¹ã
**è¿ä¸ªç®æ³åºè¯¥å¦ä½è®¾è®¡å¢ï¼**
æä»¬é¦å
å¯è½ä¼æ³å°éç¨%åä½çæä½æ¥å®ç°ã使¯ï¼éç¹æ¥äºï¼**âåä½(%)æä½ä¸å¦æé¤æ°æ¯2ç广¬¡åçä»·äºä¸å
¶é¤æ°åä¸çä¸(&)æä½ï¼ä¹å°±æ¯è¯´ hash%length==hash&(length-1)çåææ¯ length æ¯2ç n 次æ¹ï¼ï¼ãâ** å¹¶ä¸ **éç¨äºè¿å¶ä½æä½ &ï¼ç¸å¯¹äº%è½å¤æé«è¿ç®æçï¼è¿å°±è§£éäº HashMap çé¿åº¦ä¸ºä»ä¹æ¯2ç广¬¡æ¹ã**
### 2.2.10 HashMap å¤çº¿ç¨æä½å¯¼è´æ»å¾ªç¯é®é¢
主è¦åå å¨äº å¹¶åä¸çRehash ä¼é æå
ç´ ä¹é´ä¼å½¢æä¸ä¸ªå¾ªç¯é¾è¡¨ãä¸è¿ï¼jdk 1.8 åè§£å³äºè¿ä¸ªé®é¢ï¼ä½æ¯è¿æ¯ä¸å»ºè®®å¨å¤çº¿ç¨ä¸ä½¿ç¨ HashMap,å 为å¤çº¿ç¨ä¸ä½¿ç¨ HashMap è¿æ¯ä¼åå¨å
¶ä»é®é¢æ¯å¦æ°æ®ä¸¢å¤±ãå¹¶åç¯å¢ä¸æ¨èä½¿ç¨ ConcurrentHashMap ã
详æ
请æ¥çï¼
### 2.2.11 ConcurrentHashMap å Hashtable çåºå«
ConcurrentHashMap å Hashtable çåºå«ä¸»è¦ä½ç°å¨å®ç°çº¿ç¨å®å
¨çæ¹å¼ä¸ä¸åã
- **åºå±æ°æ®ç»æï¼** JDK1.7ç ConcurrentHashMap åºå±éç¨ **åæ®µçæ°ç»+é¾è¡¨** å®ç°ï¼JDK1.8 éç¨çæ°æ®ç»æè·HashMap1.8çç»æä¸æ ·ï¼æ°ç»+é¾è¡¨/红é»äºåæ ãHashtable å JDK1.8 ä¹åç HashMap çåºå±æ°æ®ç»æç±»ä¼¼é½æ¯éç¨ **æ°ç»+é¾è¡¨** çå½¢å¼ï¼æ°ç»æ¯ HashMap ç主ä½ï¼é¾è¡¨åæ¯ä¸»è¦ä¸ºäºè§£å³åå¸å²çªèåå¨çï¼
- **å®ç°çº¿ç¨å®å
¨çæ¹å¼ï¼éè¦ï¼ï¼** â **å¨JDK1.7çæ¶åï¼ConcurrentHashMapï¼å段éï¼** 对æ´ä¸ªæ¡¶æ°ç»è¿è¡äºåå²å段(Segment)ï¼æ¯ä¸æéåªé容å¨å
¶ä¸ä¸é¨åæ°æ®ï¼å¤çº¿ç¨è®¿é®å®¹å¨éä¸åæ°æ®æ®µçæ°æ®ï¼å°±ä¸ä¼åå¨éç«äºï¼æé«å¹¶å访é®çã **å°äº JDK1.8 çæ¶åå·²ç»æå¼äºSegmentçæ¦å¿µï¼èæ¯ç´æ¥ç¨ Node æ°ç»+é¾è¡¨+çº¢é»æ çæ°æ®ç»ææ¥å®ç°ï¼å¹¶åæ§å¶ä½¿ç¨ synchronized å CAS æ¥æä½ãï¼JDK1.6以å 对 synchronizedéåäºå¾å¤ä¼åï¼** æ´ä¸ªçèµ·æ¥å°±åæ¯ä¼åè¿ä¸çº¿ç¨å®å
¨ç HashMapï¼è½ç¶å¨JDK1.8ä¸è¿è½çå° Segment çæ°æ®ç»æï¼ä½æ¯å·²ç»ç®åäºå±æ§ï¼åªæ¯ä¸ºäºå
¼å®¹æ§çæ¬ï¼â¡ **Hashtable(å䏿é)** :ä½¿ç¨ synchronized æ¥ä¿è¯çº¿ç¨å®å
¨ï¼æçé常ä½ä¸ãå½ä¸ä¸ªçº¿ç¨è®¿é®åæ¥æ¹æ³æ¶ï¼å
¶ä»çº¿ç¨ä¹è®¿é®åæ¥æ¹æ³ï¼å¯è½ä¼è¿å
¥é»å¡æè½®è¯¢ç¶æï¼å¦ä½¿ç¨ put æ·»å å
ç´ ï¼å¦ä¸ä¸ªçº¿ç¨ä¸è½ä½¿ç¨ put æ·»å å
ç´ ï¼ä¹ä¸è½ä½¿ç¨ getï¼ç«äºä¼è¶æ¥è¶æ¿çæçè¶ä½ã
**两è
ç对æ¯å¾ï¼**
å¾çæ¥æºï¼
**HashTable:**

**JDK1.7çConcurrentHashMapï¼**

**JDK1.8çConcurrentHashMapï¼TreeBin: 红é»äºåæ èç¹ Node: é¾è¡¨èç¹ï¼ï¼**

### 2.2.12 ConcurrentHashMap线ç¨å®å
¨çå
·ä½å®ç°æ¹å¼/åºå±å
·ä½å®ç°
#### JDK1.7ï¼ä¸é¢æç¤ºæå¾ï¼
é¦å
å°æ°æ®åä¸ºä¸æ®µä¸æ®µçåå¨ï¼ç¶åç»æ¯ä¸æ®µæ°æ®é
䏿éï¼å½ä¸ä¸ªçº¿ç¨å ç¨é访é®å
¶ä¸ä¸ä¸ªæ®µæ°æ®æ¶ï¼å
¶ä»æ®µçæ°æ®ä¹è½è¢«å
¶ä»çº¿ç¨è®¿é®ã
**ConcurrentHashMap æ¯ç± Segment æ°ç»ç»æå HashEntry æ°ç»ç»æç»æ**ã
Segment å®ç°äº ReentrantLock,æä»¥ Segment æ¯ä¸ç§å¯éå
¥éï¼æ®æ¼éçè§è²ãHashEntry ç¨äºåå¨é®å¼å¯¹æ°æ®ã
```java
static class Segment extends ReentrantLock implements Serializable {
}
```
ä¸ä¸ª ConcurrentHashMap éå
å«ä¸ä¸ª Segment æ°ç»ãSegment çç»æåHashMapç±»ä¼¼ï¼æ¯ä¸ç§æ°ç»åé¾è¡¨ç»æï¼ä¸ä¸ª Segment å
å«ä¸ä¸ª HashEntry æ°ç»ï¼æ¯ä¸ª HashEntry æ¯ä¸ä¸ªé¾è¡¨ç»æçå
ç´ ï¼æ¯ä¸ª Segment 宿¤çä¸ä¸ªHashEntryæ°ç»éçå
ç´ ï¼å½å¯¹ HashEntry æ°ç»çæ°æ®è¿è¡ä¿®æ¹æ¶ï¼å¿
é¡»é¦å
è·å¾å¯¹åºç Segmentçéã
#### JDK1.8 ï¼ä¸é¢æç¤ºæå¾ï¼
ConcurrentHashMapåæ¶äºSegmentåæ®µéï¼éç¨CASåsynchronizedæ¥ä¿è¯å¹¶åå®å
¨ãæ°æ®ç»æè·HashMap1.8çç»æç±»ä¼¼ï¼æ°ç»+é¾è¡¨/红é»äºåæ ãJava 8å¨é¾è¡¨é¿åº¦è¶
è¿ä¸å®éå¼ï¼8ï¼æ¶å°é¾è¡¨ï¼å¯»åæ¶é´å¤æåº¦ä¸ºO(N)ï¼è½¬æ¢ä¸ºçº¢é»æ ï¼å¯»åæ¶é´å¤æåº¦ä¸ºO(log(N))ï¼
synchronizedåªéå®å½åé¾è¡¨æçº¢é»äºåæ çé¦èç¹ï¼è¿æ ·åªè¦hashä¸å²çªï¼å°±ä¸ä¼äº§çå¹¶åï¼æçåæåNåã
### 2.2.13 comparable å Comparatorçåºå«
- comparableæ¥å£å®é
䏿¯åºèªjava.langå
宿ä¸ä¸ª `compareTo(Object obj)`æ¹æ³ç¨æ¥æåº
- comparatoræ¥å£å®é
䏿¯åºèª java.util å
宿ä¸ä¸ª`compare(Object obj1, Object obj2)`æ¹æ³ç¨æ¥æåº
ä¸è¬æä»¬éè¦å¯¹ä¸ä¸ªéå使ç¨èªå®ä¹æåºæ¶ï¼æä»¬å°±è¦éå`compareTo()`æ¹æ³æ`compare()`æ¹æ³ï¼å½æä»¬éè¦å¯¹æä¸ä¸ªéåå®ç°ä¸¤ç§æåºæ¹å¼ï¼æ¯å¦ä¸ä¸ªsong对象ä¸çæååææååå«éç¨ä¸ç§æåºæ¹æ³çè¯ï¼æä»¬å¯ä»¥éå`compareTo()`æ¹æ³å使ç¨èªå¶çComparatoræ¹æ³æè
以两个Comparatoræ¥å®ç°æåæåºåææåæåºï¼ç¬¬äºç§ä»£è¡¨æä»¬åªè½ä½¿ç¨ä¸¤ä¸ªåæ°çç `Collections.sort()`.
#### Comparatorå®å¶æåº
```java
ArrayList arrayList = new ArrayList();
arrayList.add(-1);
arrayList.add(3);
arrayList.add(3);
arrayList.add(-5);
arrayList.add(7);
arrayList.add(4);
arrayList.add(-9);
arrayList.add(-7);
System.out.println("åå§æ°ç»:");
System.out.println(arrayList);
// void reverse(List list)ï¼å转
Collections.reverse(arrayList);
System.out.println("Collections.reverse(arrayList):");
System.out.println(arrayList);
// void sort(List list),æèªç¶æåºçååºæåº
Collections.sort(arrayList);
System.out.println("Collections.sort(arrayList):");
System.out.println(arrayList);
// å®å¶æåºçç¨æ³
Collections.sort(arrayList, new Comparator() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1);
}
});
System.out.println("å®å¶æåºåï¼");
System.out.println(arrayList);
```
Output:
```
åå§æ°ç»:
[-1, 3, 3, -5, 7, 4, -9, -7]
Collections.reverse(arrayList):
[-7, -9, 4, 7, -5, 3, 3, -1]
Collections.sort(arrayList):
[-9, -7, -5, -1, 3, 3, 4, 7]
å®å¶æåºåï¼
[7, 4, 3, 3, -1, -5, -7, -9]
```
#### éåcompareToæ¹æ³å®ç°æå¹´é¾æ¥æåº
```java
// person对象没æå®ç°Comparableæ¥å£ï¼æä»¥å¿
é¡»å®ç°ï¼è¿æ ·æä¸ä¼åºéï¼æå¯ä»¥ä½¿treemapä¸çæ°æ®æé¡ºåºæå
// åé¢ä¸ä¸ªä¾åçString类已ç»é»è®¤å®ç°äºComparableæ¥å£ï¼è¯¦ç»å¯ä»¥æ¥çStringç±»çAPIææ¡£ï¼å¦å¤å
¶ä»
// åIntegerç±»çé½å·²ç»å®ç°äºComparableæ¥å£ï¼æä»¥ä¸éè¦å¦å¤å®ç°äº
public class Person implements Comparable {
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
/**
* TODOéåcompareToæ¹æ³å®ç°æå¹´é¾æ¥æåº
*/
@Override
public int compareTo(Person o) {
// TODO Auto-generated method stub
if (this.age > o.getAge()) {
return 1;
} else if (this.age < o.getAge()) {
return -1;
}
return age;
}
}
```
```java
public static void main(String[] args) {
TreeMap pdata = new TreeMap();
pdata.put(new Person("å¼ ä¸", 30), "zhangsan");
pdata.put(new Person("æå", 20), "lisi");
pdata.put(new Person("çäº", 10), "wangwu");
pdata.put(new Person("å°çº¢", 5), "xiaohong");
// å¾å°keyçå¼çåæ¶å¾å°keyæå¯¹åºçå¼
Set keys = pdata.keySet();
for (Person key : keys) {
System.out.println(key.getAge() + "-" + key.getName());
}
}
```
Outputï¼
```
5-å°çº¢
10-çäº
20-æå
30-å¼ ä¸
```
### 2.2.14 éåæ¡æ¶åºå±æ°æ®ç»ææ»ç»
#### Collection
**1. List**
- **Arraylistï¼** Objectæ°ç»
- **Vectorï¼** Objectæ°ç»
- **LinkedListï¼** ååé¾è¡¨(JDK1.6ä¹å为循ç¯é¾è¡¨ï¼JDK1.7åæ¶äºå¾ªç¯)
**2. Set**
- **HashSetï¼æ åºï¼å¯ä¸ï¼:** åºäº HashMap å®ç°çï¼åºå±éç¨ HashMap æ¥ä¿åå
ç´
- **LinkedHashSetï¼** LinkedHashSet ç»§æ¿äº HashSetï¼å¹¶ä¸å
¶å
鍿¯éè¿ LinkedHashMap æ¥å®ç°çãæç¹ç±»ä¼¼äºæä»¬ä¹å说çLinkedHashMap å
¶å
鍿¯åºäº HashMap å®ç°ä¸æ ·ï¼ä¸è¿è¿æ¯æä¸ç¹ç¹åºå«ç
- **TreeSetï¼æåºï¼å¯ä¸ï¼ï¼** çº¢é»æ (èªå¹³è¡¡çæåºäºåæ )
#### Map
- **HashMapï¼** JDK1.8ä¹åHashMapç±æ°ç»+é¾è¡¨ç»æçï¼æ°ç»æ¯HashMapç主ä½ï¼é¾è¡¨åæ¯ä¸»è¦ä¸ºäºè§£å³åå¸å²çªèåå¨çï¼âæé¾æ³âè§£å³å²çªï¼ãJDK1.8以åå¨è§£å³åå¸å²çªæ¶æäºè¾å¤§çååï¼å½é¾è¡¨é¿åº¦å¤§äºéå¼ï¼é»è®¤ä¸º8ï¼æ¶ï¼å°é¾è¡¨è½¬åä¸ºçº¢é»æ ï¼ä»¥åå°æç´¢æ¶é´
- **LinkedHashMapï¼** LinkedHashMap ç»§æ¿èª HashMapï¼æä»¥å®çåºå±ä»ç¶æ¯åºäºæé¾å¼æ£åç»æå³ç±æ°ç»åé¾è¡¨æçº¢é»æ ç»æãå¦å¤ï¼LinkedHashMap å¨ä¸é¢ç»æçåºç¡ä¸ï¼å¢å äºä¸æ¡ååé¾è¡¨ï¼ä½¿å¾ä¸é¢çç»æå¯ä»¥ä¿æé®å¼å¯¹çæå
¥é¡ºåºãåæ¶éè¿å¯¹é¾è¡¨è¿è¡ç¸åºçæä½ï¼å®ç°äºè®¿é®é¡ºåºç¸å
³é»è¾ã详ç»å¯ä»¥æ¥çï¼[ãLinkedHashMap æºç 详ç»åæï¼JDK1.8ï¼ã](https://www.imooc.com/article/22931)
- **Hashtableï¼** æ°ç»+é¾è¡¨ç»æçï¼æ°ç»æ¯ HashMap ç主ä½ï¼é¾è¡¨åæ¯ä¸»è¦ä¸ºäºè§£å³åå¸å²çªèåå¨ç
- **TreeMapï¼** çº¢é»æ ï¼èªå¹³è¡¡çæåºäºåæ ï¼
### 2.2.15 å¦ä½éç¨éå?
ä¸»è¦æ ¹æ®éåçç¹ç¹æ¥éç¨ï¼æ¯å¦æä»¬éè¦æ ¹æ®é®å¼è·åå°å
ç´ å¼æ¶å°±éç¨Mapæ¥å£ä¸çéåï¼éè¦æåºæ¶éæ©TreeMap,ä¸éè¦æåºæ¶å°±éæ©HashMap,éè¦ä¿è¯çº¿ç¨å®å
¨å°±éç¨ConcurrentHashMap.彿们åªéè¦åæ¾å
ç´ å¼æ¶ï¼å°±éæ©å®ç°Collectionæ¥å£çéåï¼éè¦ä¿è¯å
ç´ å¯ä¸æ¶éæ©å®ç°Setæ¥å£çé忝å¦TreeSetæHashSetï¼ä¸éè¦å°±éæ©å®ç°Listæ¥å£çæ¯å¦ArrayListæLinkedListï¼ç¶ååæ ¹æ®å®ç°è¿äºæ¥å£çéåçç¹ç¹æ¥éç¨ã
妿大家æ³è¦å®æ¶å
³æ³¨ææ´æ°çæç« 以åå享ç干货çè¯ï¼å¯ä»¥å
³æ³¨æçå
¬ä¼å·ã
**ãJavaGuide é¢è¯çªå»çã :** ç±æ¬ææ¡£è¡ççä¸ä¸ºé¢è¯èççãJavaGuide é¢è¯çªå»çã çæ¬[å
¬ä¼å·](#å
¬ä¼å·)åå°åå¤ **"Java é¢è¯çªå»"** å³å¯å
è´¹é¢åï¼
**Java å·¥ç¨å¸å¿
å¤å¦ä¹ èµæº:** ä¸äº Java å·¥ç¨å¸å¸¸ç¨å¦ä¹ èµæºå
¬ä¼å·åå°åå¤å
³é®å **â1â** å³å¯å
è´¹æ å¥è·¯è·åã

## 2.3 å¤çº¿ç¨
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
### 2.3.1. ä»ä¹æ¯çº¿ç¨åè¿ç¨?
#### ä½ä¸ºè¿ç¨?
è¿ç¨æ¯ç¨åºç䏿¬¡æ§è¡è¿ç¨ï¼æ¯ç³»ç»è¿è¡ç¨åºçåºæ¬åä½ï¼å æ¤è¿ç¨æ¯å¨æçãç³»ç»è¿è¡ä¸ä¸ªç¨åºå³æ¯ä¸ä¸ªè¿ç¨ä»å建ï¼è¿è¡å°æ¶äº¡çè¿ç¨ã
å¨ Java ä¸ï¼å½æä»¬å¯å¨ main 彿°æ¶å
¶å®å°±æ¯å¯å¨äºä¸ä¸ª JVM çè¿ç¨ï¼è main 彿°æå¨ç线ç¨å°±æ¯è¿ä¸ªè¿ç¨ä¸çä¸ä¸ªçº¿ç¨ï¼ä¹ç§°ä¸»çº¿ç¨ã
å¦ä¸å¾æç¤ºï¼å¨ windows ä¸éè¿æ¥çä»»å¡ç®¡çå¨çæ¹å¼ï¼æä»¬å°±å¯ä»¥æ¸
æ¥çå° window å½åè¿è¡çè¿ç¨ï¼.exe æä»¶çè¿è¡ï¼ã

#### ä½ä¸ºçº¿ç¨?
线ç¨ä¸è¿ç¨ç¸ä¼¼ï¼ä½çº¿ç¨æ¯ä¸ä¸ªæ¯è¿ç¨æ´å°çæ§è¡åä½ãä¸ä¸ªè¿ç¨å¨å
¶æ§è¡çè¿ç¨ä¸å¯ä»¥äº§çå¤ä¸ªçº¿ç¨ãä¸è¿ç¨ä¸åçæ¯åç±»çå¤ä¸ªçº¿ç¨å
±äº«è¿ç¨ç**å **å**æ¹æ³åº**èµæºï¼ä½æ¯ä¸ªçº¿ç¨æèªå·±ç**ç¨åºè®¡æ°å¨**ã**èææºæ **å**æ¬å°æ¹æ³æ **ï¼æä»¥ç³»ç»å¨äº§çä¸ä¸ªçº¿ç¨ï¼ææ¯å¨å个线ç¨ä¹é´ä½åæ¢å·¥ä½æ¶ï¼è´æ
è¦æ¯è¿ç¨å°å¾å¤ï¼ä¹æ£å ä¸ºå¦æ¤ï¼çº¿ç¨ä¹è¢«ç§°ä¸ºè½»é级è¿ç¨ã
Java ç¨åºå¤©çå°±æ¯å¤çº¿ç¨ç¨åºï¼æä»¬å¯ä»¥éè¿ JMX æ¥çä¸ä¸ä¸ä¸ªæ®éç Java ç¨åºæåªäºçº¿ç¨ï¼ä»£ç å¦ä¸ã
```java
public class MultiThread {
public static void main(String[] args) {
// è·å Java 线ç¨ç®¡ç MXBean
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
// ä¸éè¦è·å忥ç monitor å synchronizer ä¿¡æ¯ï¼ä»
è·å线ç¨å线ç¨å æ ä¿¡æ¯
ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
// éå线ç¨ä¿¡æ¯ï¼ä»
æå°çº¿ç¨ ID å线ç¨åç§°ä¿¡æ¯
for (ThreadInfo threadInfo : threadInfos) {
System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());
}
}
}
```
ä¸è¿°ç¨åºè¾åºå¦ä¸ï¼è¾åºå
容å¯è½ä¸åï¼ä¸ç¨å¤ªçº ç»ä¸é¢æ¯ä¸ªçº¿ç¨çä½ç¨ï¼åªç¨ç¥é main çº¿ç¨æ§è¡ main æ¹æ³å³å¯ï¼ï¼
```
[5] Attach Listener //æ·»å äºä»¶
[4] Signal Dispatcher // ååå¤çç» JVM ä¿¡å·ç线ç¨
[3] Finalizer //è°ç¨å¯¹è±¡ finalize æ¹æ³ç线ç¨
[2] Reference Handler //æ¸
é¤ reference 线ç¨
[1] main //main 线ç¨,ç¨åºå
¥å£
```
ä»ä¸é¢çè¾åºå
容å¯ä»¥çåºï¼**ä¸ä¸ª Java ç¨åºçè¿è¡æ¯ main 线ç¨åå¤ä¸ªå
¶ä»çº¿ç¨åæ¶è¿è¡**ã
### 2.3.2. 请ç®è¦æè¿°çº¿ç¨ä¸è¿ç¨çå
³ç³»,åºå«åä¼ç¼ºç¹ï¼
**ä» JVM è§åº¦è¯´è¿ç¨å线ç¨ä¹é´çå
³ç³»**
#### å¾è§£è¿ç¨å线ç¨çå
³ç³»
ä¸å¾æ¯ Java å
ååºåï¼éè¿ä¸å¾æä»¬ä» JVM çè§åº¦æ¥è¯´ä¸ä¸çº¿ç¨åè¿ç¨ä¹é´çå
³ç³»ãå¦æä½ å¯¹ Java å
ååºå (è¿è¡æ¶æ°æ®åº) è¿é¨åç¥è¯ä¸å¤ªäºè§£çè¯å¯ä»¥é
读ä¸ä¸è¿ç¯æç« ï¼[ãå¯è½æ¯æ Java å
ååºåè®²çææ¸
æ¥çä¸ç¯æç« ã](https://github.com/Snailclimb/JavaGuide/blob/3965c02cc0f294b0bd3580df4868d5e396959e2e/Java%E7%9B%B8%E5%85%B3/%E5%8F%AF%E8%83%BD%E6%98%AF%E6%8A%8AJava%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F%E8%AE%B2%E7%9A%84%E6%9C%80%E6%B8%85%E6%A5%9A%E7%9A%84%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0.md "ãå¯è½æ¯æ Java å
ååºåè®²çææ¸
æ¥çä¸ç¯æç« ã")
ä»ä¸å¾å¯ä»¥çåºï¼ä¸ä¸ªè¿ç¨ä¸å¯ä»¥æå¤ä¸ªçº¿ç¨ï¼å¤ä¸ªçº¿ç¨å
±äº«è¿ç¨ç**å **å**æ¹æ³åº (JDK1.8 ä¹åçå
空é´)**èµæºï¼ä½æ¯æ¯ä¸ªçº¿ç¨æèªå·±ç**ç¨åºè®¡æ°å¨**ã**èææºæ ** å **æ¬å°æ¹æ³æ **ã
**æ»ç»ï¼** çº¿ç¨ æ¯ è¿ç¨ ååæçæ´å°çè¿è¡åä½ã线ç¨åè¿ç¨æå¤§çä¸åå¨äºåºæ¬ä¸åè¿ç¨æ¯ç¬ç«çï¼èå线ç¨åä¸ä¸å®ï¼å 为åä¸è¿ç¨ä¸ççº¿ç¨ææå¯è½ä¼ç¸äºå½±åãçº¿ç¨æ§è¡å¼éå°ï¼ä½ä¸å©äºèµæºç管çåä¿æ¤ï¼èè¿ç¨æ£ç¸å
ä¸é¢æ¯è¯¥ç¥è¯ç¹çæ©å±å
容ï¼
ä¸é¢æ¥æèè¿æ ·ä¸ä¸ªé®é¢ï¼ä¸ºä»ä¹**ç¨åºè®¡æ°å¨**ã**èææºæ **å**æ¬å°æ¹æ³æ **æ¯çº¿ç¨ç§æçå¢ï¼ä¸ºä»ä¹å åæ¹æ³åºæ¯çº¿ç¨å
±äº«çå¢ï¼
#### ç¨åºè®¡æ°å¨ä¸ºä»ä¹æ¯ç§æç?
ç¨åºè®¡æ°å¨ä¸»è¦æä¸é¢ä¸¤ä¸ªä½ç¨ï¼
1. åèç è§£éå¨éè¿æ¹åç¨åºè®¡æ°å¨æ¥ä¾æ¬¡è¯»åæä»¤ï¼ä»èå®ç°ä»£ç çæµç¨æ§å¶ï¼å¦ï¼é¡ºåºæ§è¡ãéæ©ã循ç¯ãå¼å¸¸å¤çã
2. å¨å¤çº¿ç¨çæ
åµä¸ï¼ç¨åºè®¡æ°å¨ç¨äºè®°å½å½åçº¿ç¨æ§è¡çä½ç½®ï¼ä»èå½çº¿ç¨è¢«åæ¢åæ¥çæ¶åè½å¤ç¥é该线ç¨ä¸æ¬¡è¿è¡å°åªå¿äºã
éè¦æ³¨æçæ¯ï¼å¦ææ§è¡çæ¯ native æ¹æ³ï¼é£ä¹ç¨åºè®¡æ°å¨è®°å½çæ¯ undefined å°åï¼åªææ§è¡çæ¯ Java ä»£ç æ¶ç¨åºè®¡æ°å¨è®°å½çææ¯ä¸ä¸æ¡æä»¤çå°åã
æä»¥ï¼ç¨åºè®¡æ°å¨ç§æä¸»è¦æ¯ä¸ºäº**线ç¨åæ¢åè½æ¢å¤å°æ£ç¡®çæ§è¡ä½ç½®**ã
#### èææºæ 忬尿¹æ³æ 为ä»ä¹æ¯ç§æç?
- **èææºæ ï¼** æ¯ä¸ª Java æ¹æ³å¨æ§è¡çåæ¶ä¼å建ä¸ä¸ªæ 帧ç¨äºåå¨å±é¨åé表ãæä½æ°æ ã叏鿱 å¼ç¨çä¿¡æ¯ã仿¹æ³è°ç¨ç´è³æ§è¡å®æçè¿ç¨ï¼å°±å¯¹åºçä¸ä¸ªæ å¸§å¨ Java èææºæ ä¸å
¥æ ååºæ çè¿ç¨ã
- **æ¬å°æ¹æ³æ ï¼** åèææºæ æåæ¥çä½ç¨é常ç¸ä¼¼ï¼åºå«æ¯ï¼ **èææºæ ä¸ºèææºæ§è¡ Java æ¹æ³ ï¼ä¹å°±æ¯åèç ï¼æå¡ï¼èæ¬å°æ¹æ³æ åä¸ºèææºä½¿ç¨å°ç Native æ¹æ³æå¡ã** å¨ HotSpot èææºä¸å Java èææºæ åäºä¸ºä¸ã
æä»¥ï¼ä¸ºäº**ä¿è¯çº¿ç¨ä¸çå±é¨åéä¸è¢«å«ç线ç¨è®¿é®å°**ï¼èææºæ 忬尿¹æ³æ æ¯çº¿ç¨ç§æçã
#### ä¸å¥è¯ç®åäºè§£å åæ¹æ³åº
å åæ¹æ³åºæ¯ææçº¿ç¨å
±äº«çèµæºï¼å
¶ä¸å æ¯è¿ç¨ä¸æå¤§çä¸åå
åï¼ä¸»è¦ç¨äºåæ¾æ°å建ç对象 (ææå¯¹è±¡é½å¨è¿éåé
å
å)ï¼æ¹æ³åºä¸»è¦ç¨äºåæ¾å·²è¢«å è½½ç类信æ¯ã常éãéæåéã峿¶ç¼è¯å¨ç¼è¯åç代ç çæ°æ®ã
### 2.3.3. 说说并åä¸å¹¶è¡çåºå«?
- **å¹¶åï¼** å䏿¶é´æ®µï¼å¤ä¸ªä»»å¡é½å¨æ§è¡ (å使¶é´å
ä¸ä¸å®åæ¶æ§è¡)ï¼
- **å¹¶è¡ï¼** å使¶é´å
ï¼å¤ä¸ªä»»å¡åæ¶æ§è¡ã
### 2.3.4. 为ä»ä¹è¦ä½¿ç¨å¤çº¿ç¨å¢?
å
仿»ä½ä¸æ¥è¯´ï¼
- **ä»è®¡ç®æºåºå±æ¥è¯´ï¼** 线ç¨å¯ä»¥æ¯ä½æ¯è½»é级çè¿ç¨ï¼æ¯ç¨åºæ§è¡çæå°åä½,线ç¨é´ç忢åè°åº¦çææ¬è¿è¿å°äºè¿ç¨ãå¦å¤ï¼å¤æ ¸ CPU æ¶ä»£æå³çå¤ä¸ªçº¿ç¨å¯ä»¥åæ¶è¿è¡ï¼è¿åå°äºçº¿ç¨ä¸ä¸æåæ¢çå¼éã
- **ä»å½ä»£äºèç½åå±è¶å¿æ¥è¯´ï¼** ç°å¨çç³»ç»å¨ä¸å¨å°±è¦æ±ç¾ä¸çº§çè³åä¸çº§çå¹¶åéï¼èå¤çº¿ç¨å¹¶åç¼ç¨æ£æ¯å¼åé«å¹¶åç³»ç»çåºç¡ï¼å©ç¨å¥½å¤çº¿ç¨æºå¶å¯ä»¥å¤§å¤§æé«ç³»ç»æ´ä½çå¹¶åè½å以忧è½ã
åæ·±å
¥å°è®¡ç®æºåºå±æ¥æ¢è®¨ï¼
- **åæ ¸æ¶ä»£ï¼** å¨åæ ¸æ¶ä»£å¤çº¿ç¨ä¸»è¦æ¯ä¸ºäºæé« CPU å IO 设å¤ç综åå©ç¨çã举个ä¾åï¼å½åªæä¸ä¸ªçº¿ç¨çæ¶åä¼å¯¼è´ CPU è®¡ç®æ¶ï¼IO 设å¤ç©ºé²ï¼è¿è¡ IO æä½æ¶ï¼CPU 空é²ãæä»¬å¯ä»¥ç®åå°è¯´è¿ä¸¤è
çå©ç¨çç®å齿¯ 50%å·¦å³ã使¯å½æä¸¤ä¸ªçº¿ç¨çæ¶åå°±ä¸ä¸æ ·äºï¼å½ä¸ä¸ªçº¿ç¨æ§è¡ CPU è®¡ç®æ¶ï¼å¦å¤ä¸ä¸ªçº¿ç¨å¯ä»¥è¿è¡ IO æä½ï¼è¿æ ·ä¸¤ä¸ªçå©ç¨çå°±å¯ä»¥å¨çæ³æ
åµä¸è¾¾å° 100%äºã
- **夿 ¸æ¶ä»£:** 夿 ¸æ¶ä»£å¤çº¿ç¨ä¸»è¦æ¯ä¸ºäºæé« CPU å©ç¨çã举个ä¾åï¼å妿们è¦è®¡ç®ä¸ä¸ªå¤æçä»»å¡ï¼æä»¬åªç¨ä¸ä¸ªçº¿ç¨çè¯ï¼CPU åªä¼ä¸ä¸ª CPU æ ¸å¿è¢«å©ç¨å°ï¼èå建å¤ä¸ªçº¿ç¨å°±å¯ä»¥è®©å¤ä¸ª CPU æ ¸å¿è¢«å©ç¨å°ï¼è¿æ ·å°±æé«äº CPU çå©ç¨çã
### 2.3.5. 使ç¨å¤çº¿ç¨å¯è½å¸¦æ¥ä»ä¹é®é¢?
å¹¶åç¼ç¨çç®çå°±æ¯ä¸ºäºè½æé«ç¨åºçæ§è¡æçæé«ç¨åºè¿è¡é度ï¼ä½æ¯å¹¶åç¼ç¨å¹¶ä¸æ»æ¯è½æé«ç¨åºè¿è¡é度çï¼èä¸å¹¶åç¼ç¨å¯è½ä¼éå°å¾å¤é®é¢ï¼æ¯å¦ï¼å
åæ³æ¼ãä¸ä¸æåæ¢ãæ»éè¿æåéäºç¡¬ä»¶å软件çèµæºé²ç½®é®é¢ã
### 2.3.6. 说说线ç¨ççå½å¨æåç¶æ?
Java 线ç¨å¨è¿è¡ççå½å¨æä¸çæå®æ¶å»åªå¯è½å¤äºä¸é¢ 6 ç§ä¸åç¶æçå
¶ä¸ä¸ä¸ªç¶æï¼å¾æºãJava å¹¶åç¼ç¨èºæ¯ã4.1.4 èï¼ã

线ç¨å¨çå½å¨æä¸å¹¶ä¸æ¯åºå®å¤äºæä¸ä¸ªç¶æèæ¯éç代ç çæ§è¡å¨ä¸åç¶æä¹é´åæ¢ãJava 线ç¨ç¶æåè¿å¦ä¸å¾æç¤ºï¼å¾æºãJava å¹¶åç¼ç¨èºæ¯ã4.1.4 èï¼ï¼

ç±ä¸å¾å¯ä»¥çåºï¼çº¿ç¨å建ä¹åå®å°å¤äº **NEWï¼æ°å»ºï¼** ç¶æï¼è°ç¨ `start()` æ¹æ³åå¼å§è¿è¡ï¼çº¿ç¨è¿æ¶åå¤äº **READYï¼å¯è¿è¡ï¼** ç¶æãå¯è¿è¡ç¶æç线ç¨è·å¾äº CPU æ¶é´çï¼timesliceï¼åå°±å¤äº **RUNNINGï¼è¿è¡ï¼** ç¶æã
> æä½ç³»ç»éè Java èææºï¼JVMï¼ä¸ç RUNNABLE å RUNNING ç¶æï¼å®åªè½çå° RUNNABLE ç¶æï¼å¾æºï¼[HowToDoInJava](https://howtodoinjava.com/ "HowToDoInJava")ï¼[Java Thread Life Cycle and Thread States](https://howtodoinjava.com/java/multi-threading/java-thread-life-cycle-and-thread-states/ "Java Thread Life Cycle and Thread States")ï¼ï¼æä»¥ Java ç³»ç»ä¸è¬å°è¿ä¸¤ä¸ªç¶æç»ç§°ä¸º **RUNNABLEï¼è¿è¡ä¸ï¼** ç¶æ ã

å½çº¿ç¨æ§è¡ `wait()`æ¹æ³ä¹åï¼çº¿ç¨è¿å
¥ **WAITINGï¼çå¾
ï¼** ç¶æãè¿å
¥çå¾
ç¶æç线ç¨éè¦ä¾é å
¶ä»çº¿ç¨çéç¥æè½å¤è¿åå°è¿è¡ç¶æï¼è **TIME_WAITING(è¶
æ¶çå¾
)** ç¶æç¸å½äºå¨çå¾
ç¶æçåºç¡ä¸å¢å äºè¶
æ¶éå¶ï¼æ¯å¦éè¿ `sleepï¼long millisï¼`æ¹æ³æ `waitï¼long millisï¼`æ¹æ³å¯ä»¥å° Java 线ç¨ç½®äº TIMED WAITING ç¶æãå½è¶
æ¶æ¶é´å°è¾¾å Java 线ç¨å°ä¼è¿åå° RUNNABLE ç¶æãå½çº¿ç¨è°ç¨åæ¥æ¹æ³æ¶ï¼å¨æ²¡æè·åå°éçæ
åµä¸ï¼çº¿ç¨å°ä¼è¿å
¥å° **BLOCKEDï¼é»å¡ï¼** ç¶æã线ç¨å¨æ§è¡ Runnable ç`run()`æ¹æ³ä¹åå°ä¼è¿å
¥å° **TERMINATEDï¼ç»æ¢ï¼** ç¶æã
### 2.3.7. ä»ä¹æ¯ä¸ä¸æåæ¢?
å¤çº¿ç¨ç¼ç¨ä¸ä¸è¬çº¿ç¨ç个æ°é½å¤§äº CPU æ ¸å¿ç个æ°ï¼èä¸ä¸ª CPU æ ¸å¿å¨ä»»ææ¶å»åªè½è¢«ä¸ä¸ªçº¿ç¨ä½¿ç¨ï¼ä¸ºäºè®©è¿äºçº¿ç¨é½è½å¾å°æææ§è¡ï¼CPU éåççç¥æ¯ä¸ºæ¯ä¸ªçº¿ç¨åé
æ¶é´ç并轮转çå½¢å¼ãå½ä¸ä¸ªçº¿ç¨çæ¶é´çç¨å®çæ¶åå°±ä¼éæ°å¤äºå°±ç»ªç¶æè®©ç»å
¶ä»çº¿ç¨ä½¿ç¨ï¼è¿ä¸ªè¿ç¨å°±å±äºä¸æ¬¡ä¸ä¸æåæ¢ã
æ¦æ¬æ¥è¯´å°±æ¯ï¼å½åä»»å¡å¨æ§è¡å® CPU æ¶é´ç忢å°å¦ä¸ä¸ªä»»å¡ä¹åä¼å
ä¿åèªå·±çç¶æï¼ä»¥ä¾¿ä¸æ¬¡å忢åè¿ä¸ªä»»å¡æ¶ï¼å¯ä»¥åå è½½è¿ä¸ªä»»å¡çç¶æã**ä»»å¡ä»ä¿åå°åå è½½çè¿ç¨å°±æ¯ä¸æ¬¡ä¸ä¸æåæ¢**ã
ä¸ä¸æåæ¢é常æ¯è®¡ç®å¯éåçãä¹å°±æ¯è¯´ï¼å®éè¦ç¸å½å¯è§çå¤ç卿¶é´ï¼å¨æ¯ç§å åä¸ç¾æ¬¡ç忢ä¸ï¼æ¯æ¬¡åæ¢é½éè¦çº³ç§éçº§çæ¶é´ãæä»¥ï¼ä¸ä¸æåæ¢å¯¹ç³»ç»æ¥è¯´æå³çæ¶è大éç CPU æ¶é´ï¼äºå®ä¸ï¼å¯è½æ¯æä½ç³»ç»ä¸æ¶é´æ¶èæå¤§çæä½ã
Linux ç¸æ¯ä¸å
¶ä»æä½ç³»ç»ï¼å
æ¬å
¶ä»ç±» Unix ç³»ç»ï¼æå¾å¤çä¼ç¹ï¼å
¶ä¸æä¸é¡¹å°±æ¯ï¼å
¶ä¸ä¸æåæ¢å模å¼åæ¢çæ¶é´æ¶èé常å°ã
### 2.3.8. ä»ä¹æ¯çº¿ç¨æ»é?å¦ä½é¿å
æ»é?
#### 认è¯çº¿ç¨æ»é
çº¿ç¨æ»éæè¿°çæ¯è¿æ ·ä¸ç§æ
åµï¼å¤ä¸ªçº¿ç¨åæ¶è¢«é»å¡ï¼å®ä»¬ä¸çä¸ä¸ªæè
å
¨é¨é½å¨çå¾
æä¸ªèµæºè¢«éæ¾ãç±äºçº¿ç¨è¢«æ éæå°é»å¡ï¼å æ¤ç¨åºä¸å¯è½æ£å¸¸ç»æ¢ã
å¦ä¸å¾æç¤ºï¼çº¿ç¨ A ææèµæº 2ï¼çº¿ç¨ B ææèµæº 1ï¼ä»ä»¬åæ¶é½æ³ç³è¯·å¯¹æ¹çèµæºï¼æä»¥è¿ä¸¤ä¸ªçº¿ç¨å°±ä¼äºç¸çå¾
èè¿å
¥æ»éç¶æã

ä¸é¢éè¿ä¸ä¸ªä¾åæ¥è¯´æçº¿ç¨æ»é,ä»£ç æ¨¡æäºä¸å¾çæ»éçæ
åµ (ä»£ç æ¥æºäºãå¹¶åç¼ç¨ä¹ç¾ã)ï¼
```java
public class DeadLockDemo {
private static Object resource1 = new Object();//èµæº 1
private static Object resource2 = new Object();//èµæº 2
public static void main(String[] args) {
new Thread(() -> {
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource2");
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
}
}
}, "çº¿ç¨ 1").start();
new Thread(() -> {
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource1");
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
}
}
}, "çº¿ç¨ 2").start();
}
}
```
Output
```
Thread[çº¿ç¨ 1,5,main]get resource1
Thread[çº¿ç¨ 2,5,main]get resource2
Thread[çº¿ç¨ 1,5,main]waiting get resource2
Thread[çº¿ç¨ 2,5,main]waiting get resource1
```
çº¿ç¨ A éè¿ synchronized (resource1) è·å¾ resource1 ççè§å¨éï¼ç¶åéè¿`Thread.sleep(1000);`è®©çº¿ç¨ A ä¼ç 1s ä¸ºçæ¯è®©çº¿ç¨ B å¾å°æ§è¡ç¶åè·åå° resource2 ççè§å¨éãçº¿ç¨ A åçº¿ç¨ B ä¼ç ç»æäºé½å¼å§ä¼å¾è¯·æ±è·å对æ¹çèµæºï¼ç¶åè¿ä¸¤ä¸ªçº¿ç¨å°±ä¼é·å
¥äºç¸çå¾
çç¶æï¼è¿ä¹å°±äº§çäºæ»éãä¸é¢çä¾å符åäº§çæ»éçå个å¿
è¦æ¡ä»¶ã
å¦è¿æä½ç³»ç»çæåé½ç¥éäº§çæ»éå¿
é¡»å
·å¤ä»¥ä¸å个æ¡ä»¶ï¼
1. äºæ¥æ¡ä»¶ï¼è¯¥èµæºä»»æä¸ä¸ªæ¶å»åªç±ä¸ä¸ªçº¿ç¨å ç¨ã
2. 请æ±ä¸ä¿ææ¡ä»¶ï¼ä¸ä¸ªè¿ç¨å 请æ±èµæºèé»å¡æ¶ï¼å¯¹å·²è·å¾çèµæºä¿æä¸æ¾ã
3. ä¸å¥å¤ºæ¡ä»¶:线ç¨å·²è·å¾çèµæºå¨æ«ä½¿ç¨å®ä¹åä¸è½è¢«å
¶ä»çº¿ç¨å¼ºè¡å¥å¤ºï¼åªæèªå·±ä½¿ç¨å®æ¯åæéæ¾èµæºã
4. 循ç¯çå¾
æ¡ä»¶:è¥å¹²è¿ç¨ä¹é´å½¢æä¸ç§å¤´å°¾ç¸æ¥ç循ç¯çå¾
èµæºå
³ç³»ã
#### å¦ä½é¿å
çº¿ç¨æ»é?
æä¸é¢è¯´äºäº§çæ»éçå个å¿
è¦æ¡ä»¶ï¼ä¸ºäºé¿å
æ»éï¼æä»¬åªè¦ç ´åäº§çæ»éçå个æ¡ä»¶ä¸çå
¶ä¸ä¸ä¸ªå°±å¯ä»¥äºãç°å¨æä»¬æ¥æ¨ä¸ªåæä¸ä¸ï¼
1. **ç ´åäºæ¥æ¡ä»¶** ï¼è¿ä¸ªæ¡ä»¶æä»¬æ²¡æåæ³ç ´åï¼å 为æä»¬ç¨éæ¬æ¥å°±æ¯æ³è®©ä»ä»¬äºæ¥çï¼ä¸´çèµæºéè¦äºæ¥è®¿é®ï¼ã
2. **ç ´å请æ±ä¸ä¿ææ¡ä»¶** ï¼ä¸æ¬¡æ§ç³è¯·ææçèµæºã
3. **ç ´åä¸å¥å¤ºæ¡ä»¶** ï¼å ç¨é¨åèµæºç线ç¨è¿ä¸æ¥ç³è¯·å
¶ä»èµæºæ¶ï¼å¦æç³è¯·ä¸å°ï¼å¯ä»¥ä¸»å¨éæ¾å®å æçèµæºã
4. **ç ´å循ç¯çå¾
æ¡ä»¶** ï¼é æåºç³è¯·èµæºæ¥é¢é²ãææä¸é¡ºåºç³è¯·èµæºï¼éæ¾èµæºåååºéæ¾ãç ´å循ç¯çå¾
æ¡ä»¶ã
æä»¬å¯¹çº¿ç¨ 2 ç代ç ä¿®æ¹æä¸é¢è¿æ ·å°±ä¸ä¼äº§çæ»éäºã
```java
new Thread(() -> {
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource2");
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
}
}
}, "çº¿ç¨ 2").start();
```
Output
```
Thread[çº¿ç¨ 1,5,main]get resource1
Thread[çº¿ç¨ 1,5,main]waiting get resource2
Thread[çº¿ç¨ 1,5,main]get resource2
Thread[çº¿ç¨ 2,5,main]get resource1
Thread[çº¿ç¨ 2,5,main]waiting get resource2
Thread[çº¿ç¨ 2,5,main]get resource2
Process finished with exit code 0
```
**æä»¬åæä¸ä¸ä¸é¢ç代ç 为ä»ä¹é¿å
äºæ»éçåç?**
çº¿ç¨ 1 é¦å
è·å¾å° resource1 ççè§å¨é,è¿æ¶åçº¿ç¨ 2 å°±è·åä¸å°äºãç¶åçº¿ç¨ 1 åå»è·å resource2 ççè§å¨éï¼å¯ä»¥è·åå°ãç¶åçº¿ç¨ 1 éæ¾äºå¯¹ resource1ãresource2 ççè§å¨éçå ç¨ï¼çº¿ç¨ 2 è·åå°å°±å¯ä»¥æ§è¡äºãè¿æ ·å°±ç ´åäºç ´å循ç¯çå¾
æ¡ä»¶ï¼å æ¤é¿å
äºæ»éã
### 2.3.9. 说说 sleep() æ¹æ³å wait() æ¹æ³åºå«åå
±åç¹?
- 两è
æä¸»è¦çåºå«å¨äºï¼**sleep æ¹æ³æ²¡æéæ¾éï¼è wait æ¹æ³éæ¾äºé** ã
- 两è
é½å¯ä»¥æå线ç¨çæ§è¡ã
- Wait é常被ç¨äºçº¿ç¨é´äº¤äº/éä¿¡ï¼sleep é常被ç¨äºæåæ§è¡ã
- wait() æ¹æ³è¢«è°ç¨åï¼çº¿ç¨ä¸ä¼èªå¨èéï¼éè¦å«ç线ç¨è°ç¨åä¸ä¸ªå¯¹è±¡ä¸ç notify() æè
notifyAll() æ¹æ³ãsleep() æ¹æ³æ§è¡å®æåï¼çº¿ç¨ä¼èªå¨èéãæè
å¯ä»¥ä½¿ç¨ wait(long timeout)è¶
æ¶å线ç¨ä¼èªå¨èéã
### 2.3.10. 为ä»ä¹æä»¬è°ç¨ start() æ¹æ³æ¶ä¼æ§è¡ run() æ¹æ³ï¼ä¸ºä»ä¹æä»¬ä¸è½ç´æ¥è°ç¨ run() æ¹æ³ï¼
è¿æ¯å¦ä¸ä¸ªé常ç»å
¸ç java å¤çº¿ç¨é¢è¯é®é¢ï¼èä¸å¨é¢è¯ä¸ä¼ç»å¸¸è¢«é®å°ãå¾ç®åï¼ä½æ¯å¾å¤äººé½ä¼çä¸ä¸æ¥ï¼
new ä¸ä¸ª Threadï¼çº¿ç¨è¿å
¥äºæ°å»ºç¶æ;è°ç¨ start() æ¹æ³ï¼ä¼å¯å¨ä¸ä¸ªçº¿ç¨å¹¶ä½¿çº¿ç¨è¿å
¥äºå°±ç»ªç¶æï¼å½åé
å°æ¶é´çåå°±å¯ä»¥å¼å§è¿è¡äºã start() 伿§è¡çº¿ç¨çç¸åºåå¤å·¥ä½ï¼ç¶åèªå¨æ§è¡ run() æ¹æ³çå
容ï¼è¿æ¯çæ£çå¤çº¿ç¨å·¥ä½ã èç´æ¥æ§è¡ run() æ¹æ³ï¼ä¼æ run æ¹æ³å½æä¸ä¸ª main 线ç¨ä¸çæ®éæ¹æ³å»æ§è¡ï¼å¹¶ä¸ä¼å¨æä¸ªçº¿ç¨ä¸æ§è¡å®ï¼æä»¥è¿å¹¶ä¸æ¯å¤çº¿ç¨å·¥ä½ã
**æ»ç»ï¼ è°ç¨ start æ¹æ³æ¹å¯å¯å¨çº¿ç¨å¹¶ä½¿çº¿ç¨è¿å
¥å°±ç»ªç¶æï¼è run æ¹æ³åªæ¯ thread çä¸ä¸ªæ®éæ¹æ³è°ç¨ï¼è¿æ¯å¨ä¸»çº¿ç¨éæ§è¡ã**
### 2.3.11 synchronized å
³é®å
#### 1.说ä¸è¯´èªå·±å¯¹äº synchronized å
³é®åçäºè§£
synchronizedå
³é®åè§£å³çæ¯å¤ä¸ªçº¿ç¨ä¹é´è®¿é®èµæºç忥æ§ï¼synchronizedå
³é®åå¯ä»¥ä¿è¯è¢«å®ä¿®é¥°çæ¹æ³æè
代ç åå¨ä»»ææ¶å»åªè½æä¸ä¸ªçº¿ç¨æ§è¡ã
å¦å¤ï¼å¨ Java æ©æçæ¬ä¸ï¼synchronizedå±äºéé级éï¼æçä½ä¸ï¼å 为çè§å¨éï¼monitorï¼æ¯ä¾èµäºåºå±çæä½ç³»ç»ç Mutex Lock æ¥å®ç°çï¼Java ççº¿ç¨æ¯æ å°å°æä½ç³»ç»çåç线ç¨ä¹ä¸çãå¦æè¦æèµ·æè
å¤éä¸ä¸ªçº¿ç¨ï¼é½éè¦æä½ç³»ç»å¸®å¿å®æï¼èæä½ç³»ç»å®ç°çº¿ç¨ä¹é´ç忢æ¶éè¦ä»ç¨æ·æè½¬æ¢å°å
æ ¸æï¼è¿ä¸ªç¶æä¹é´ç转æ¢éè¦ç¸å¯¹æ¯è¾é¿çæ¶é´ï¼æ¶é´ææ¬ç¸å¯¹è¾é«ï¼è¿ä¹æ¯ä¸ºä»ä¹æ©æç synchronized æçä½çåå ãåºå¹¸çæ¯å¨ Java 6 ä¹å Java 宿¹å¯¹ä» JVM å±é¢å¯¹synchronized è¾å¤§ä¼åï¼æä»¥ç°å¨ç synchronized éæçä¹ä¼åå¾å¾ä¸éäºãJDK1.6对éçå®ç°å¼å
¥äºå¤§éçä¼åï¼å¦èªæéãéåºæ§èªæéãéæ¶é¤ãéç²åãååéãè½»é级éçææ¯æ¥åå°éæä½çå¼éã
#### 2.说说èªå·±æ¯æä¹ä½¿ç¨ synchronized å
³é®åï¼å¨é¡¹ç®ä¸ç¨å°äºå
#### 3.synchronizedå
³é®åæä¸»è¦çä¸ç§ä½¿ç¨æ¹å¼
- **修饰å®ä¾æ¹æ³:** ä½ç¨äºå½å对象å®ä¾å éï¼è¿å
¥åæ¥ä»£ç åè¦è·å¾å½å对象å®ä¾çé
- **ä¿®é¥°éææ¹æ³:** ä¹å°±æ¯ç»å½åç±»å éï¼ä¼ä½ç¨äºç±»çææå¯¹è±¡å®ä¾ï¼å ä¸ºéææåä¸å±äºä»»ä½ä¸ä¸ªå®ä¾å¯¹è±¡ï¼æ¯ç±»æåï¼ static 表æè¿æ¯è¯¥ç±»çä¸ä¸ªéæèµæºï¼ä¸ç®¡newäºå¤å°ä¸ªå¯¹è±¡ï¼åªæä¸ä»½ï¼ãæä»¥å¦æä¸ä¸ªçº¿ç¨Aè°ç¨ä¸ä¸ªå®ä¾å¯¹è±¡çééæ synchronized æ¹æ³ï¼è线ç¨Béè¦è°ç¨è¿ä¸ªå®ä¾å¯¹è±¡æå±ç±»çéæ synchronized æ¹æ³ï¼æ¯å
许çï¼ä¸ä¼åçäºæ¥ç°è±¡ï¼**å 为访é®éæ synchronized æ¹æ³å ç¨ç鿝å½åç±»çéï¼è访é®ééæ synchronized æ¹æ³å ç¨ç鿝å½åå®ä¾å¯¹è±¡é**ã
- **修饰代ç å:** æå®å é对象ï¼å¯¹ç»å®å¯¹è±¡å éï¼è¿å
¥åæ¥ä»£ç åºåè¦è·å¾ç»å®å¯¹è±¡çéã
**æ»ç»ï¼** synchronized å
³é®åå å° static éææ¹æ³å synchronized(class)代ç åä¸é½æ¯æ¯ç» Class ç±»ä¸éãsynchronized å
³é®åå å°å®ä¾æ¹æ³ä¸æ¯ç»å¯¹è±¡å®ä¾ä¸éãå°½éä¸è¦ä½¿ç¨ synchronized(String a) å 为JVMä¸ï¼åç¬¦ä¸²å¸¸éæ± å
·æç¼ååè½ï¼
ä¸é¢æä»¥ä¸ä¸ªå¸¸è§çé¢è¯é¢ä¸ºä¾è®²è§£ä¸ä¸ synchronized å
³é®åçå
·ä½ä½¿ç¨ã
é¢è¯ä¸é¢è¯å®ç»å¸¸ä¼è¯´ï¼âå便¨¡å¼äºè§£åï¼æ¥ç»ææåä¸ä¸ï¼ç»æè§£éä¸ä¸å鿣éªéæ¹å¼å®ç°å便¨¡å¼çåçåï¼â
**åéæ ¡éªéå®ç°å¯¹è±¡åä¾ï¼çº¿ç¨å®å
¨ï¼**
```java
public class Singleton {
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public synchronized static Singleton getUniqueInstance() {
//å
å¤æå¯¹è±¡æ¯å¦å·²ç»å®ä¾è¿ï¼æ²¡æå®ä¾åè¿æè¿å
¥å é代ç
if (uniqueInstance == null) {
//类对象å é
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
```
å¦å¤ï¼éè¦æ³¨æ uniqueInstance éç¨ volatile å
³é®åä¿®é¥°ä¹æ¯å¾æå¿
è¦ã
uniqueInstance éç¨ volatile å
³é®åä¿®é¥°ä¹æ¯å¾æå¿
è¦çï¼ uniqueInstance = new Singleton(); è¿æ®µä»£ç å
¶å®æ¯åä¸ºä¸æ¥æ§è¡ï¼
1. 为 uniqueInstance åé
å
å空é´
2. åå§å uniqueInstance
3. å° uniqueInstance æååé
çå
åå°å
使¯ç±äº JVM å
·ææä»¤éæçç¹æ§ï¼æ§è¡é¡ºåºæå¯è½åæ 1->3->2ãæä»¤éæå¨å线ç¨ç¯å¢ä¸ä¸ä¼åºç°é®é¢ï¼ä½æ¯å¨å¤çº¿ç¨ç¯å¢ä¸ä¼å¯¼è´ä¸ä¸ªçº¿ç¨è·å¾è¿æ²¡æåå§åçå®ä¾ãä¾å¦ï¼çº¿ç¨ T1 æ§è¡äº 1 å 3ï¼æ¤æ¶ T2 è°ç¨ getUniqueInstance() ååç° uniqueInstance ä¸ä¸ºç©ºï¼å æ¤è¿å uniqueInstanceï¼ä½æ¤æ¶ uniqueInstance è¿æªè¢«åå§åã
ä½¿ç¨ volatile å¯ä»¥ç¦æ¢ JVM çæä»¤éæï¼ä¿è¯å¨å¤çº¿ç¨ç¯å¢ä¸ä¹è½æ£å¸¸è¿è¡ã
#### 4.讲ä¸ä¸ synchronized å
³é®åçåºå±åç
**synchronized å
³é®ååºå±åçå±äº JVM å±é¢ã**
**â synchronized 忥è¯å¥åçæ
åµ**
```java
public class SynchronizedDemo {
public void method() {
synchronized (this) {
System.out.println("synchronized 代ç å");
}
}
}
```
éè¿ JDK èªå¸¦ç javap å½ä»¤æ¥ç SynchronizedDemo ç±»çç¸å
³åèç ä¿¡æ¯ï¼é¦å
忢å°ç±»ç对åºç®å½æ§è¡ `javac SynchronizedDemo.java` å½ä»¤çæç¼è¯åç .class æä»¶ï¼ç¶åæ§è¡`javap -c -s -v -l SynchronizedDemo.class`ã

ä»ä¸é¢æä»¬å¯ä»¥çåºï¼
**synchronized 忥è¯å¥åçå®ç°ä½¿ç¨çæ¯ monitorenter å monitorexit æä»¤ï¼å
¶ä¸ monitorenter æä»¤æå忥代ç åçå¼å§ä½ç½®ï¼monitorexit æä»¤åææåæ¥ä»£ç åçç»æä½ç½®ã** 彿§è¡ monitorenter æä»¤æ¶ï¼çº¿ç¨è¯å¾è·åéä¹å°±æ¯è·å monitor(monitor对象åå¨äºæ¯ä¸ªJava对象ç对象头ä¸ï¼synchronized é便æ¯éè¿è¿ç§æ¹å¼è·åéçï¼ä¹æ¯ä¸ºä»ä¹Javaä¸ä»»æå¯¹è±¡å¯ä»¥ä½ä¸ºéçåå ) çæææãå½è®¡æ°å¨ä¸º0åå¯ä»¥æåè·åï¼è·ååå°é计æ°å¨è®¾ä¸º1ä¹å°±æ¯å 1ãç¸åºç卿§è¡ monitorexit æä»¤åï¼å°é计æ°å¨è®¾ä¸º0ï¼è¡¨æéè¢«éæ¾ã妿è·å对象é失败ï¼é£å½å线ç¨å°±è¦é»å¡çå¾
ï¼ç´å°é被å¦å¤ä¸ä¸ªçº¿ç¨éæ¾ä¸ºæ¢ã
**â¡ synchronized ä¿®é¥°æ¹æ³ççæ
åµ**
```java
public class SynchronizedDemo2 {
public synchronized void method() {
System.out.println("synchronized æ¹æ³");
}
}
```

synchronized ä¿®é¥°çæ¹æ³å¹¶æ²¡æ monitorenter æä»¤å monitorexit æä»¤ï¼åå¾ä»£ä¹çç¡®å®æ¯ ACC_SYNCHRONIZED æ è¯ï¼è¯¥æ è¯ææäºè¯¥æ¹æ³æ¯ä¸ä¸ªåæ¥æ¹æ³ï¼JVM éè¿è¯¥ ACC_SYNCHRONIZED è®¿é®æ å¿æ¥è¾¨å«ä¸ä¸ªæ¹æ³æ¯å¦å£°æä¸ºåæ¥æ¹æ³ï¼ä»èæ§è¡ç¸åºç忥è°ç¨ã
#### 5.说说 JDK1.6 ä¹åçsynchronized å
³é®ååºå±åäºåªäºä¼åï¼å¯ä»¥è¯¦ç»ä»ç»ä¸ä¸è¿äºä¼åå
JDK1.6 对éçå®ç°å¼å
¥äºå¤§éçä¼åï¼å¦ååéãè½»é级éãèªæéãéåºæ§èªæéãéæ¶é¤ãéç²åçææ¯æ¥åå°éæä½çå¼éã
é主è¦åå¨åç§ç¶æï¼ä¾æ¬¡æ¯ï¼æ éç¶æãååéç¶æãè½»é级éç¶æãéé级éç¶æï¼ä»ä»¬ä¼éçç«äºçæ¿çè鿏åçº§ãæ³¨æéå¯ä»¥å级ä¸å¯é级ï¼è¿ç§çç¥æ¯ä¸ºäºæé«è·å¾éåéæ¾éçæçã
å
³äºè¿å ç§ä¼åç详ç»ä¿¡æ¯å¯ä»¥æ¥çç¬ä¸»çè¿ç¯æç« ï¼
#### 6.è°è° synchronizedåReentrantLock çåºå«
**â 两è
齿¯å¯éå
¥é**
两è
齿¯å¯éå
¥éãâå¯éå
¥éâæ¦å¿µæ¯ï¼èªå·±å¯ä»¥å次è·åèªå·±çå
é¨éãæ¯å¦ä¸ä¸ªçº¿ç¨è·å¾äºæä¸ªå¯¹è±¡çéï¼æ¤æ¶è¿ä¸ªå¯¹è±¡éè¿æ²¡æéæ¾ï¼å½å
¶å次æ³è¦è·åè¿ä¸ªå¯¹è±¡çéçæ¶åè¿æ¯å¯ä»¥è·åçï¼å¦æä¸å¯ééå
¥çè¯ï¼å°±ä¼é ææ»éãåä¸ä¸ªçº¿ç¨æ¯æ¬¡è·åéï¼éç计æ°å¨é½èªå¢1ï¼æä»¥è¦çå°éç计æ°å¨ä¸é为0æ¶æè½éæ¾éã
**â¡ synchronized ä¾èµäº JVM è ReentrantLock ä¾èµäº API**
synchronized æ¯ä¾èµäº JVM å®ç°çï¼å颿们ä¹è®²å°äº èææºå¢éå¨ JDK1.6 为 synchronized å
³é®åè¿è¡äºå¾å¤ä¼åï¼ä½æ¯è¿äºä¼å齿¯å¨èææºå±é¢å®ç°çï¼å¹¶æ²¡æç´æ¥æ´é²ç»æä»¬ãReentrantLock æ¯ JDK å±é¢å®ç°çï¼ä¹å°±æ¯ API å±é¢ï¼éè¦ lock() å unlock() æ¹æ³é
å try/finally è¯å¥åæ¥å®æï¼ï¼æä»¥æä»¬å¯ä»¥éè¿æ¥çå®çæºä»£ç ï¼æ¥ç宿¯å¦ä½å®ç°çã
**⢠ReentrantLock æ¯ synchronized å¢å äºä¸äºé«çº§åè½**
ç¸æ¯synchronizedï¼ReentrantLockå¢å äºä¸äºé«çº§åè½ãä¸»è¦æ¥è¯´ä¸»è¦æä¸ç¹ï¼**â çå¾
å¯ä¸æï¼â¡å¯å®ç°å
¬å¹³éï¼â¢å¯å®ç°éæ©æ§éç¥ï¼éå¯ä»¥ç»å®å¤ä¸ªæ¡ä»¶ï¼**
- **ReentrantLockæä¾äºä¸ç§è½å¤ä¸æçå¾
éç线ç¨çæºå¶**ï¼éè¿lock.lockInterruptibly()æ¥å®ç°è¿ä¸ªæºå¶ãä¹å°±æ¯è¯´æ£å¨çå¾
ç线ç¨å¯ä»¥éæ©æ¾å¼çå¾
ï¼æ¹ä¸ºå¤çå
¶ä»äºæ
ã
- **ReentrantLockå¯ä»¥æå®æ¯å
¬å¹³éè¿æ¯éå
¬å¹³éãèsynchronizedåªè½æ¯éå
¬å¹³éãæè°çå
¬å¹³éå°±æ¯å
çå¾
ç线ç¨å
è·å¾éã** ReentrantLocké»è®¤æ
嵿¯éå
¬å¹³çï¼å¯ä»¥éè¿ ReentrantLockç±»ç`ReentrantLock(boolean fair)`æé æ¹æ³æ¥å¶å®æ¯å¦æ¯å
¬å¹³çã
- synchronizedå
³é®åä¸wait()ånotify()/notifyAll()æ¹æ³ç¸ç»åå¯ä»¥å®ç°çå¾
/éç¥æºå¶ï¼ReentrantLockç±»å½ç¶ä¹å¯ä»¥å®ç°ï¼ä½æ¯éè¦åå©äºConditionæ¥å£ä¸newCondition() æ¹æ³ãConditionæ¯JDK1.5ä¹åææçï¼å®å
·æå¾å¥½ççµæ´»æ§ï¼æ¯å¦å¯ä»¥å®ç°å¤è·¯éç¥åè½ä¹å°±æ¯å¨ä¸ä¸ªLock对象ä¸å¯ä»¥å建å¤ä¸ªConditionå®ä¾ï¼å³å¯¹è±¡çè§å¨ï¼ï¼**线ç¨å¯¹è±¡å¯ä»¥æ³¨å卿å®çConditionä¸ï¼ä»èå¯ä»¥æéæ©æ§çè¿è¡çº¿ç¨éç¥ï¼å¨è°åº¦çº¿ç¨ä¸æ´å çµæ´»ã å¨ä½¿ç¨notify()/notifyAll()æ¹æ³è¿è¡éç¥æ¶ï¼è¢«éç¥ççº¿ç¨æ¯ç± JVM éæ©çï¼ç¨ReentrantLockç±»ç»åConditionå®ä¾å¯ä»¥å®ç°âéæ©æ§éç¥â** ï¼è¿ä¸ªåè½é常éè¦ï¼è䏿¯Conditionæ¥å£é»è®¤æä¾çãèsynchronizedå
³é®åå°±ç¸å½äºæ´ä¸ªLock对象ä¸åªæä¸ä¸ªConditionå®ä¾ï¼ææç线ç¨é½æ³¨åå¨å®ä¸ä¸ªèº«ä¸ã妿æ§è¡notifyAll()æ¹æ³çè¯å°±ä¼éç¥ææå¤äºçå¾
ç¶æç线ç¨è¿æ ·ä¼é æå¾å¤§çæçé®é¢ï¼èConditionå®ä¾çsignalAll()æ¹æ³ åªä¼å¤é注åå¨è¯¥Conditionå®ä¾ä¸çææçå¾
线ç¨ã
å¦æä½ æ³ä½¿ç¨ä¸è¿°åè½ï¼é£ä¹éæ©ReentrantLockæ¯ä¸ä¸ªä¸éçéæ©ã
**⣠æ§è½å·²ä¸æ¯éæ©æ å**
### 2.3.12 volatileå
³é®å
#### 1. 讲ä¸ä¸Javaå
忍¡å
å¨ JDK1.2 ä¹åï¼Javaçå
忍¡åå®ç°æ»æ¯ä»**主å**ï¼å³å
±äº«å
åï¼è¯»ååéï¼æ¯ä¸éè¦è¿è¡ç¹å«ç注æçãèå¨å½åç Java å
忍¡åä¸ï¼çº¿ç¨å¯ä»¥æåéä¿å**æ¬å°å
å**ï¼æ¯å¦æºå¨çå¯åå¨ï¼ä¸ï¼è䏿¯ç´æ¥å¨ä¸»åä¸è¿è¡è¯»åãè¿å°±å¯è½é æä¸ä¸ªçº¿ç¨å¨ä¸»åä¸ä¿®æ¹äºä¸ä¸ªåéçå¼ï¼èå¦å¤ä¸ä¸ªçº¿ç¨è¿ç»§ç»ä½¿ç¨å®å¨å¯åå¨ä¸çåéå¼çæ·è´ï¼é æ**æ°æ®çä¸ä¸è´**ã

è¦è§£å³è¿ä¸ªé®é¢ï¼å°±éè¦æåé声æä¸º**volatile**ï¼è¿å°±æç¤º JVMï¼è¿ä¸ªå鿝ä¸ç¨³å®çï¼æ¯æ¬¡ä½¿ç¨å®é½å°ä¸»åä¸è¿è¡è¯»åã
说ç½äºï¼ **volatile** å
³é®åç主è¦ä½ç¨å°±æ¯ä¿è¯åéçå¯è§æ§ç¶åè¿æä¸ä¸ªä½ç¨æ¯é²æ¢æä»¤éæåºã

#### 2 å¹¶åç¼ç¨çä¸ä¸ªéè¦ç¹æ§
1. **ååæ§** : ä¸ä¸ªçæä½æè
夿¬¡æä½ï¼è¦ä¹ææçæä½å
¨é¨é½å¾å°æ§è¡å¹¶ä¸ä¸ä¼æ¶å°ä»»ä½å ç´ çå¹²æ°è䏿ï¼è¦ä¹ææçæä½é½æ§è¡ï¼è¦ä¹é½ä¸æ§è¡ã`synchronized ` å¯ä»¥ä¿è¯ä»£ç çæ®µçååæ§ã
2. **å¯è§æ§** ï¼å½ä¸ä¸ªåé对å
±äº«åéè¿è¡äºä¿®æ¹ï¼é£ä¹å¦å¤ç线ç¨é½æ¯ç«å³å¯ä»¥çå°ä¿®æ¹åçææ°å¼ã`volatile` å
³é®åå¯ä»¥ä¿è¯å
±äº«åéçå¯è§æ§ã
3. **æåºæ§** ï¼ä»£ç 卿§è¡çè¿ç¨ä¸çå
å顺åºï¼Java å¨ç¼è¯å¨ä»¥åè¿è¡æé´çä¼åï¼ä»£ç çæ§è¡é¡ºåºæªå¿
å°±æ¯ç¼åä»£ç æ¶åç顺åºã`volatile` å
³é®åå¯ä»¥ç¦æ¢æä»¤è¿è¡éæåºä¼åã
#### 3. 说说 synchronized å
³é®åå volatile å
³é®åçåºå«
synchronizedå
³é®ååvolatileå
³é®åæ¯è¾
- **volatileå
³é®å**æ¯çº¿ç¨åæ¥ç**è½»é级å®ç°**ï¼æä»¥**volatileæ§è½è¯å®æ¯synchronizedå
³é®åè¦å¥½**ã使¯**volatileå
³é®ååªè½ç¨äºåéèsynchronizedå
³é®åå¯ä»¥ä¿®é¥°æ¹æ³ä»¥å代ç å**ãsynchronizedå
³é®åå¨JavaSE1.6ä¹åè¿è¡äºä¸»è¦å
æ¬ä¸ºäºåå°è·å¾éåéæ¾é带æ¥çæ§è½æ¶èèå¼å
¥çååéåè½»é级é以åå
¶å®åç§ä¼åä¹åæ§è¡æçæäºæ¾èæåï¼**å®é
å¼åä¸ä½¿ç¨ synchronized å
³é®åçåºæ¯è¿æ¯æ´å¤ä¸äº**ã
- **å¤çº¿ç¨è®¿é®volatileå
³é®åä¸ä¼åçé»å¡ï¼èsynchronizedå
³é®åå¯è½ä¼åçé»å¡**
- **volatileå
³é®åè½ä¿è¯æ°æ®çå¯è§æ§ï¼ä½ä¸è½ä¿è¯æ°æ®çååæ§ãsynchronizedå
³é®å两è
é½è½ä¿è¯ã**
- **volatileå
³é®å主è¦ç¨äºè§£å³åéå¨å¤ä¸ªçº¿ç¨ä¹é´çå¯è§æ§ï¼è synchronizedå
³é®åè§£å³çæ¯å¤ä¸ªçº¿ç¨ä¹é´è®¿é®èµæºç忥æ§ã**
### 2.3.13 ThreadLocal
#### 1. ThreadLocalç®ä»
é常æ
åµä¸ï¼æä»¬å建çå鿝å¯ä»¥è¢«ä»»ä½ä¸ä¸ªçº¿ç¨è®¿é®å¹¶ä¿®æ¹çã**妿æ³å®ç°æ¯ä¸ä¸ªçº¿ç¨é½æèªå·±çä¸å±æ¬å°åé该å¦ä½è§£å³å¢ï¼** JDK䏿ä¾ç`ThreadLocal`ç±»æ£æ¯ä¸ºäºè§£å³è¿æ ·çé®é¢ã **`ThreadLocal`类主è¦è§£å³çå°±æ¯è®©æ¯ä¸ªçº¿ç¨ç»å®èªå·±çå¼ï¼å¯ä»¥å°`ThreadLocal`ç±»å½¢è±¡çæ¯å»æåæ¾æ°æ®ççåï¼çåä¸å¯ä»¥å卿¯ä¸ªçº¿ç¨çç§ææ°æ®ã**
**å¦æä½ å建äºä¸ä¸ª`ThreadLocal`åéï¼é£ä¹è®¿é®è¿ä¸ªåéçæ¯ä¸ªçº¿ç¨é½ä¼æè¿ä¸ªåéçæ¬å°å¯æ¬ï¼è¿ä¹æ¯`ThreadLocal`åéåçç±æ¥ãä»ä»¬å¯ä»¥ä½¿ç¨ `getï¼ï¼` å `setï¼ï¼` æ¹æ³æ¥è·åé»è®¤å¼æå°å
¶å¼æ´æ¹ä¸ºå½åçº¿ç¨æåç坿¬çå¼ï¼ä»èé¿å
äºçº¿ç¨å®å
¨é®é¢ã**
å举个ç®åçä¾åï¼
æ¯å¦æä¸¤ä¸ªäººå»å®å±æ¶éå®ç©ï¼è¿ä¸¤ä¸ªå
±ç¨ä¸ä¸ªè¢åçè¯è¯å®ä¼äº§çäºæ§ï¼ä½æ¯ç»ä»ä»¬ä¸¤ä¸ªäººæ¯ä¸ªäººåé
ä¸ä¸ªè¢åçè¯å°±ä¸ä¼åºç°è¿æ ·çé®é¢ã妿æè¿ä¸¤ä¸ªäººæ¯ä½çº¿ç¨çè¯ï¼é£ä¹ThreadLocalå°±æ¯ç¨æ¥é¿å
è¿ä¸¤ä¸ªçº¿ç¨ç«äºçã
#### 2. ThreadLocal示ä¾
ç¸ä¿¡çäºä¸é¢çè§£éï¼å¤§å®¶å·²ç»ææ ThreadLocal ç±»æ¯ä¸ªä»ä¹ä¸è¥¿äºã
```java
import java.text.SimpleDateFormat;
import java.util.Random;
public class ThreadLocalExample implements Runnable{
// SimpleDateFormat 䏿¯çº¿ç¨å®å
¨çï¼æä»¥æ¯ä¸ªçº¿ç¨é½è¦æèªå·±ç¬ç«ç坿¬
private static final ThreadLocal formatter = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMdd HHmm"));
public static void main(String[] args) throws InterruptedException {
ThreadLocalExample obj = new ThreadLocalExample();
for(int i=0 ; i<10; i++){
Thread t = new Thread(obj, ""+i);
Thread.sleep(new Random().nextInt(1000));
t.start();
}
}
@Override
public void run() {
System.out.println("Thread Name= "+Thread.currentThread().getName()+" default Formatter = "+formatter.get().toPattern());
try {
Thread.sleep(new Random().nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
//formatter pattern is changed here by thread, but it won't reflect to other threads
formatter.set(new SimpleDateFormat());
System.out.println("Thread Name= "+Thread.currentThread().getName()+" formatter = "+formatter.get().toPattern());
}
}
```
Output:
```
Thread Name= 0 default Formatter = yyyyMMdd HHmm
Thread Name= 0 formatter = yy-M-d ah:mm
Thread Name= 1 default Formatter = yyyyMMdd HHmm
Thread Name= 2 default Formatter = yyyyMMdd HHmm
Thread Name= 1 formatter = yy-M-d ah:mm
Thread Name= 3 default Formatter = yyyyMMdd HHmm
Thread Name= 2 formatter = yy-M-d ah:mm
Thread Name= 4 default Formatter = yyyyMMdd HHmm
Thread Name= 3 formatter = yy-M-d ah:mm
Thread Name= 4 formatter = yy-M-d ah:mm
Thread Name= 5 default Formatter = yyyyMMdd HHmm
Thread Name= 5 formatter = yy-M-d ah:mm
Thread Name= 6 default Formatter = yyyyMMdd HHmm
Thread Name= 6 formatter = yy-M-d ah:mm
Thread Name= 7 default Formatter = yyyyMMdd HHmm
Thread Name= 7 formatter = yy-M-d ah:mm
Thread Name= 8 default Formatter = yyyyMMdd HHmm
Thread Name= 9 default Formatter = yyyyMMdd HHmm
Thread Name= 8 formatter = yy-M-d ah:mm
Thread Name= 9 formatter = yy-M-d ah:mm
```
ä»è¾åºä¸å¯ä»¥çåºï¼Thread-0å·²ç»æ¹åäºformatterçå¼ï¼ä½ä»ç¶æ¯thread-2é»è®¤æ ¼å¼åç¨åºä¸åå§åå¼ç¸åï¼å
¶ä»çº¿ç¨ä¹ä¸æ ·ã
ä¸é¢æä¸æ®µä»£ç ç¨å°äºå建 `ThreadLocal` åéç飿®µä»£ç ç¨å°äº Java8 çç¥è¯ï¼å®çäºä¸é¢è¿æ®µä»£ç ï¼å¦æä½ åäºä¸é¢è¿æ®µä»£ç çè¯ï¼IDEAä¼æç¤ºä½ è½¬æ¢ä¸ºJava8çæ ¼å¼(IDEAççä¸éï¼)ãå 为ThreadLocalç±»å¨Java 8䏿©å±ï¼ä½¿ç¨ä¸ä¸ªæ°çæ¹æ³`withInitial()`ï¼å°Supplieråè½æ¥å£ä½ä¸ºåæ°ã
```java
private static final ThreadLocal formatter = new ThreadLocal(){
@Override
protected SimpleDateFormat initialValue()
{
return new SimpleDateFormat("yyyyMMdd HHmm");
}
};
```
#### 3. ThreadLocalåç
ä» `Thread`ç±»æºä»£ç å
¥æã
```java
public class Thread implements Runnable {
......
//䏿¤çº¿ç¨æå
³çThreadLocalå¼ãç±ThreadLocal类维æ¤
ThreadLocal.ThreadLocalMap threadLocals = null;
//䏿¤çº¿ç¨æå
³çInheritableThreadLocalå¼ãç±InheritableThreadLocal类维æ¤
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
......
}
```
ä»ä¸é¢`Thread`ç±» æºä»£ç å¯ä»¥çåº`Thread` ç±»ä¸æä¸ä¸ª `threadLocals` å ä¸ä¸ª `inheritableThreadLocals` åéï¼å®ä»¬é½æ¯ `ThreadLocalMap` ç±»åçåé,æä»¬å¯ä»¥æ `ThreadLocalMap` ç解为`ThreadLocal` ç±»å®ç°çå®å¶åç `HashMap`ãé»è®¤æ
åµä¸è¿ä¸¤ä¸ªåé齿¯nullï¼åªæå½å线ç¨è°ç¨ `ThreadLocal` ç±»ç `set`æ`get`æ¹æ³æ¶æå建å®ä»¬ï¼å®é
ä¸è°ç¨è¿ä¸¤ä¸ªæ¹æ³çæ¶åï¼æä»¬è°ç¨çæ¯`ThreadLocalMap`类对åºç `get()`ã`set() `æ¹æ³ã
`ThreadLocal`ç±»ç`set()`æ¹æ³
```java
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
```
éè¿ä¸é¢è¿äºå
å®¹ï¼æä»¬è¶³ä»¥éè¿çæµå¾åºç»è®ºï¼**æç»çå鿝æ¾å¨äºå½å线ç¨ç `ThreadLocalMap` ä¸ï¼å¹¶ä¸æ¯åå¨ `ThreadLocal` ä¸ï¼`ThreadLocal` å¯ä»¥çè§£ä¸ºåªæ¯`ThreadLocalMap`çå°è£
ï¼ä¼ éäºåéå¼ã** `ThrealLocal` ç±»ä¸å¯ä»¥éè¿`Thread.currentThread()`è·åå°å½å线ç¨å¯¹è±¡åï¼ç´æ¥éè¿`getMap(Thread t)`å¯ä»¥è®¿é®å°è¯¥çº¿ç¨ç`ThreadLocalMap`对象ã
**`ThreadLocal` å
é¨ç»´æ¤çæ¯ä¸ä¸ªç±»ä¼¼ `Map` ç`ThreadLocalMap` æ°æ®ç»æï¼`key` 为å½å对象ç `Thread` 对象ï¼å¼ä¸º Object 对象ã**
```java
ThreadLocalMap(ThreadLocal> firstKey, Object firstValue) {
......
}
```
æ¯å¦æä»¬å¨åä¸ä¸ªçº¿ç¨ä¸å£°æäºä¸¤ä¸ª `ThreadLocal` 对象çè¯ï¼ä¼ä½¿ç¨ `Thread`å
é¨é½æ¯ä½¿ç¨ä»
æé£ä¸ª`ThreadLocalMap` åæ¾æ°æ®çï¼`ThreadLocalMap`ç key å°±æ¯ `ThreadLocal`对象ï¼value å°±æ¯ `ThreadLocal` 对象è°ç¨`set`æ¹æ³è®¾ç½®çå¼ã

`ThreadLocalMap`æ¯`ThreadLocal`çéæå
é¨ç±»ã

#### 4. ThreadLocal å
åæ³é²é®é¢
`ThreadLocalMap` ä¸ä½¿ç¨ç key 为 `ThreadLocal` çå¼±å¼ç¨,è value æ¯å¼ºå¼ç¨ãæä»¥ï¼å¦æ `ThreadLocal` 没æè¢«å¤é¨å¼ºå¼ç¨çæ
åµä¸ï¼å¨åå¾åæ¶çæ¶åï¼key ä¼è¢«æ¸
çæï¼è value ä¸ä¼è¢«æ¸
çæãè¿æ ·ä¸æ¥ï¼`ThreadLocalMap` ä¸å°±ä¼åºç°key为nullçEntryãå妿们ä¸å任使ªæ½çè¯ï¼value æ°¸è¿æ æ³è¢«GC åæ¶ï¼è¿ä¸ªæ¶åå°±å¯è½ä¼äº§çå
åæ³é²ãThreadLocalMapå®ç°ä¸å·²ç»èèäºè¿ç§æ
åµï¼å¨è°ç¨ `set()`ã`get()`ã`remove()` æ¹æ³çæ¶åï¼ä¼æ¸
çæ key 为 null çè®°å½ã使ç¨å® `ThreadLocal`æ¹æ³å æå¥½æå¨è°ç¨`remove()`æ¹æ³
```java
static class Entry extends WeakReference> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal> k, Object v) {
super(k);
value = v;
}
}
```
**å¼±å¼ç¨ä»ç»ï¼**
> 妿ä¸ä¸ªå¯¹è±¡åªå
·æå¼±å¼ç¨ï¼é£å°±ç±»ä¼¼äº**坿坿 ççæ´»ç¨å**ãå¼±å¼ç¨ä¸è½¯å¼ç¨çåºå«å¨äºï¼åªå
·æå¼±å¼ç¨çå¯¹è±¡æ¥ææ´çæççå½å¨æãå¨åå¾åæ¶å¨çº¿ç¨æ«æå® æç®¡è¾çå
ååºåçè¿ç¨ä¸ï¼ä¸æ¦åç°äºåªå
·æå¼±å¼ç¨ç对象ï¼ä¸ç®¡å½åå
å空é´è¶³å¤ä¸å¦ï¼é½ä¼åæ¶å®çå
åãä¸è¿ï¼ç±äºåå¾åæ¶å¨æ¯ä¸ä¸ªä¼å
级å¾ä½ç线ç¨ï¼ å æ¤ä¸ä¸å®ä¼å¾å¿«åç°é£äºåªå
·æå¼±å¼ç¨ç对象ã
>
> å¼±å¼ç¨å¯ä»¥åä¸ä¸ªå¼ç¨éåï¼ReferenceQueueï¼èå使ç¨ï¼å¦æå¼±å¼ç¨æå¼ç¨ç对象被åå¾åæ¶ï¼Javaèææºå°±ä¼æè¿ä¸ªå¼±å¼ç¨å å
¥å°ä¸ä¹å
³èçå¼ç¨éåä¸ã
### 2.3.14 çº¿ç¨æ±
#### 1. 为ä»ä¹è¦ç¨çº¿ç¨æ± ï¼
> **æ± åææ¯ç¸æ¯å¤§å®¶å·²ç»å±¡è§ä¸é²äºï¼çº¿ç¨æ± ãæ°æ®åºè¿æ¥æ± ãHttp è¿æ¥æ± çç齿¯å¯¹è¿ä¸ªææ³çåºç¨ãæ± åææ¯çææ³ä¸»è¦æ¯ä¸ºäºåå°æ¯æ¬¡è·åèµæºçæ¶èï¼æé«å¯¹èµæºçå©ç¨çã**
**çº¿ç¨æ± **æä¾äºä¸ç§éå¶å管çèµæºï¼å
æ¬æ§è¡ä¸ä¸ªä»»å¡ï¼ã æ¯ä¸ª**çº¿ç¨æ± **è¿ç»´æ¤ä¸äºåºæ¬ç»è®¡ä¿¡æ¯ï¼ä¾å¦å·²å®æä»»å¡çæ°éã
è¿éåç¨ãJava å¹¶åç¼ç¨çèºæ¯ãæå°çæ¥è¯´ä¸ä¸**使ç¨çº¿ç¨æ± ç好å¤**ï¼
- **éä½èµæºæ¶è**ãéè¿éå¤å©ç¨å·²å建ç线ç¨éä½çº¿ç¨å建åéæ¯é æçæ¶èã
- **æé«ååºé度**ãå½ä»»å¡å°è¾¾æ¶ï¼ä»»å¡å¯ä»¥ä¸éè¦ççå°çº¿ç¨å建就è½ç«å³æ§è¡ã
- **æé«çº¿ç¨çå¯ç®¡çæ§**ãçº¿ç¨æ¯ç¨ç¼ºèµæºï¼å¦ææ éå¶çå建ï¼ä¸ä»
伿¶èç³»ç»èµæºï¼è¿ä¼éä½ç³»ç»çç¨³å®æ§ï¼ä½¿ç¨çº¿ç¨æ± å¯ä»¥è¿è¡ç»ä¸çåé
ï¼è°ä¼åçæ§ã
#### 2. å®ç°Runnableæ¥å£åCallableæ¥å£çåºå«
`Runnable`èªJava 1.0以æ¥ä¸ç´åå¨ï¼ä½`Callable`ä»
å¨Java 1.5ä¸å¼å
¥,ç®çå°±æ¯ä¸ºäºæ¥å¤ç`Runnable`䏿¯æçç¨ä¾ã**`Runnable` æ¥å£**ä¸ä¼è¿åç»æææåºæ£æ¥å¼å¸¸ï¼ä½æ¯**`Callable` æ¥å£**å¯ä»¥ãæä»¥ï¼å¦æä»»å¡ä¸éè¦è¿åç»æææåºå¼å¸¸æ¨èä½¿ç¨ **`Runnable` æ¥å£**ï¼è¿æ ·ä»£ç çèµ·æ¥ä¼æ´å ç®æ´ã
å·¥å
·ç±» `Executors` å¯ä»¥å®ç° `Runnable` 对象å `Callable` 对象ä¹é´çç¸äºè½¬æ¢ãï¼`Executors.callableï¼Runnable task`ï¼æ `Executors.callableï¼Runnable taskï¼Object resuleï¼`ï¼ã
`Runnable.java`
```java
@FunctionalInterface
public interface Runnable {
/**
* è¢«çº¿ç¨æ§è¡ï¼æ²¡æè¿åå¼ä¹æ æ³æåºå¼å¸¸
*/
public abstract void run();
}
```
`Callable.java`
```java
@FunctionalInterface
public interface Callable {
/**
* 计ç®ç»æï¼æå¨æ æ³è¿æ ·åæ¶æåºå¼å¸¸ã
* @return 计ç®å¾åºçç»æ
* @throws å¦ææ æ³è®¡ç®ç»æï¼åæåºå¼å¸¸
*/
V call() throws Exception;
}
```
#### 3. æ§è¡execute()æ¹æ³åsubmit()æ¹æ³çåºå«æ¯ä»ä¹å¢ï¼
1. **`execute()`æ¹æ³ç¨äºæäº¤ä¸éè¦è¿åå¼çä»»å¡ï¼æä»¥æ æ³å¤æä»»å¡æ¯å¦è¢«çº¿ç¨æ± æ§è¡æåä¸å¦ï¼**
2. **`submit()`æ¹æ³ç¨äºæäº¤éè¦è¿åå¼çä»»å¡ãçº¿ç¨æ± ä¼è¿åä¸ä¸ª `Future` ç±»åç对象ï¼éè¿è¿ä¸ª `Future` 对象å¯ä»¥å¤æä»»å¡æ¯å¦æ§è¡æå**ï¼å¹¶ä¸å¯ä»¥éè¿ `Future` ç `get()`æ¹æ³æ¥è·åè¿åå¼ï¼`get()`æ¹æ³ä¼é»å¡å½å线ç¨ç´å°ä»»å¡å®æï¼èä½¿ç¨ `getï¼long timeoutï¼TimeUnit unitï¼`æ¹æ³åä¼é»å¡å½å线ç¨ä¸æ®µæ¶é´åç«å³è¿åï¼è¿æ¶åæå¯è½ä»»å¡æ²¡ææ§è¡å®ã
æä»¬ä»¥**`AbstractExecutorService`**æ¥å£ä¸çä¸ä¸ª `submit` æ¹æ³ä¸ºä¾åæ¥ççæºä»£ç ï¼
```java
public Future> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
```
ä¸é¢æ¹æ³è°ç¨ç `newTaskFor` æ¹æ³è¿åäºä¸ä¸ª `FutureTask` 对象ã
```java
protected RunnableFuture newTaskFor(Runnable runnable, T value) {
return new FutureTask(runnable, value);
}
```
æä»¬åæ¥çç`execute()`æ¹æ³ï¼
```java
public void execute(Runnable command) {
...
}
```
#### 4. å¦ä½åå»ºçº¿ç¨æ±
ãé¿éå·´å·´Javaå¼åæåãä¸å¼ºå¶çº¿ç¨æ± ä¸å
è®¸ä½¿ç¨ Executors å»å建ï¼èæ¯éè¿ ThreadPoolExecutor çæ¹å¼ï¼è¿æ ·çå¤çæ¹å¼è®©åçå妿´å æç¡®çº¿ç¨æ± çè¿è¡è§åï¼è§é¿èµæºèå°½çé£é©
> Executors è¿åçº¿ç¨æ± 对象çå¼ç«¯å¦ä¸ï¼
>
> - **FixedThreadPool å SingleThreadExecutor** ï¼ å
许请æ±çéåé¿åº¦ä¸º Integer.MAX_VALUE ï¼å¯è½å 积大éç请æ±ï¼ä»è导è´OOMã
> - **CachedThreadPool å ScheduledThreadPool** ï¼ å
许å建ççº¿ç¨æ°é为 Integer.MAX_VALUE ï¼å¯è½ä¼å建大é线ç¨ï¼ä»è导è´OOMã
**æ¹å¼ä¸ï¼éè¿æé æ¹æ³å®ç°**

**æ¹å¼äºï¼éè¿Executor æ¡æ¶çå·¥å
·ç±»Executorsæ¥å®ç°**
æä»¬å¯ä»¥å建ä¸ç§ç±»åçThreadPoolExecutorï¼
- **FixedThreadPool** ï¼ è¯¥æ¹æ³è¿åä¸ä¸ªåºå®çº¿ç¨æ°éççº¿ç¨æ± ãè¯¥çº¿ç¨æ± ä¸ççº¿ç¨æ°éå§ç»ä¸åã彿ä¸ä¸ªæ°çä»»å¡æäº¤æ¶ï¼çº¿ç¨æ± ä¸è¥æç©ºé²çº¿ç¨ï¼åç«å³æ§è¡ãè¥æ²¡æï¼åæ°çä»»å¡ä¼è¢«æåå¨ä¸ä¸ªä»»å¡éåä¸ï¼å¾
æçº¿ç¨ç©ºé²æ¶ï¼ä¾¿å¤çå¨ä»»å¡éåä¸çä»»å¡ã
- **SingleThreadExecutorï¼** æ¹æ³è¿åä¸ä¸ªåªæä¸ä¸ªçº¿ç¨ççº¿ç¨æ± ãè¥å¤ä½ä¸ä¸ªä»»å¡è¢«æäº¤å°è¯¥çº¿ç¨æ± ï¼ä»»å¡ä¼è¢«ä¿åå¨ä¸ä¸ªä»»å¡éåä¸ï¼å¾
线ç¨ç©ºé²ï¼æå
å
¥å
åºçé¡ºåºæ§è¡éåä¸çä»»å¡ã
- **CachedThreadPoolï¼** è¯¥æ¹æ³è¿åä¸ä¸ªå¯æ ¹æ®å®é
æ
åµè°æ´çº¿ç¨æ°éççº¿ç¨æ± ãçº¿ç¨æ± ççº¿ç¨æ°éä¸ç¡®å®ï¼ä½è¥æç©ºé²çº¿ç¨å¯ä»¥å¤ç¨ï¼åä¼ä¼å
使ç¨å¯å¤ç¨ç线ç¨ãè¥ææçº¿ç¨åå¨å·¥ä½ï¼åææ°çä»»å¡æäº¤ï¼åä¼å建æ°ç线ç¨å¤çä»»å¡ãææçº¿ç¨å¨å½å任塿§è¡å®æ¯åï¼å°è¿åçº¿ç¨æ± è¿è¡å¤ç¨ã
对åºExecutorså·¥å
·ç±»ä¸çæ¹æ³å¦å¾æç¤ºï¼

#### 5. ThreadPoolExecutor ç±»åæ
`ThreadPoolExecutor` ç±»ä¸æä¾çå个æé æ¹æ³ãæä»¬æ¥çæé¿çé£ä¸ªï¼å
¶ä½ä¸ä¸ªé½æ¯å¨è¿ä¸ªæé æ¹æ³çåºç¡ä¸äº§çï¼å
¶ä»å 个æé æ¹æ³è¯´ç½ç¹é½æ¯ç»å®æäºé»è®¤åæ°çæé æ¹æ³æ¯å¦é»è®¤å¶å®æç»çç¥æ¯ä»ä¹ï¼ï¼è¿éå°±ä¸è´´ä»£ç 讲äºï¼æ¯è¾ç®åã
```java
/**
* ç¨ç»å®çåå§åæ°å建ä¸ä¸ªæ°çThreadPoolExecutorã
*/
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
```
**ä¸é¢è¿äºå¯¹å建 é常éè¦ï¼å¨åé¢ä½¿ç¨çº¿ç¨æ± çè¿ç¨ä¸ä½ ä¸å®ä¼ç¨å°ï¼æä»¥ï¼å¡å¿
æ¿çå°æ¬æ¬è®°æ¸
æ¥ã**
##### `ThreadPoolExecutor`æé 彿°éè¦åæ°åæ
**`ThreadPoolExecutor` 3 个æéè¦çåæ°ï¼**
- **`corePoolSize` :** æ ¸å¿çº¿ç¨æ°çº¿ç¨æ°å®ä¹äºæå°å¯ä»¥åæ¶è¿è¡ççº¿ç¨æ°éã
- **`maximumPoolSize` :** å½éåä¸åæ¾çä»»å¡è¾¾å°éå容éçæ¶åï¼å½åå¯ä»¥åæ¶è¿è¡ççº¿ç¨æ°éå为æå¤§çº¿ç¨æ°ã
- **`workQueue`:** 彿°ä»»å¡æ¥çæ¶åä¼å
夿å½åè¿è¡ççº¿ç¨æ°éæ¯å¦è¾¾å°æ ¸å¿çº¿ç¨æ°ï¼å¦æè¾¾å°çè¯ï¼æ°ä»»å¡å°±ä¼è¢«åæ¾å¨éåä¸ã
`ThreadPoolExecutor`å
¶ä»å¸¸è§åæ°:
1. **`keepAliveTime`**:å½çº¿ç¨æ± ä¸ççº¿ç¨æ°éå¤§äº `corePoolSize` çæ¶åï¼å¦æè¿æ¶æ²¡ææ°çä»»å¡æäº¤ï¼æ ¸å¿çº¿ç¨å¤ç线ç¨ä¸ä¼ç«å³éæ¯ï¼èæ¯ä¼çå¾
ï¼ç´å°çå¾
çæ¶é´è¶
è¿äº `keepAliveTime`æä¼è¢«åæ¶éæ¯ï¼
2. **`unit`** : `keepAliveTime` åæ°çæ¶é´åä½ã
3. **`threadFactory`** :executor å建æ°çº¿ç¨çæ¶åä¼ç¨å°ã
4. **`handler`** :饱åçç¥ãå
³äºé¥±åçç¥ä¸é¢åç¬ä»ç»ä¸ä¸ã
##### `ThreadPoolExecutor` 饱åçç¥
**`ThreadPoolExecutor` 饱åçç¥å®ä¹:**
妿å½ååæ¶è¿è¡ççº¿ç¨æ°éè¾¾å°æå¤§çº¿ç¨æ°éå¹¶ä¸éåä¹å·²ç»è¢«æ¾æ»¡äºä»»æ¶ï¼`ThreadPoolTaskExecutor` å®ä¹ä¸äºçç¥:
- **`ThreadPoolExecutor.AbortPolicy`**ï¼æåº `RejectedExecutionException`æ¥æç»æ°ä»»å¡çå¤çã
- **`ThreadPoolExecutor.CallerRunsPolicy`**ï¼è°ç¨æ§è¡èªå·±ç线ç¨è¿è¡ä»»å¡ãæ¨ä¸ä¼ä»»å¡è¯·æ±ã使¯è¿ç§çç¥ä¼éä½å¯¹äºæ°ä»»å¡æäº¤é度ï¼å½±åç¨åºçæ´ä½æ§è½ãå¦å¤ï¼è¿ä¸ªçç¥å欢å¢å éå容éã妿æ¨çåºç¨ç¨åºå¯ä»¥æ¿åæ¤å»¶è¿å¹¶ä¸ä½ ä¸è½ä»»å¡ä¸¢å¼ä»»ä½ä¸ä¸ªä»»å¡è¯·æ±çè¯ï¼ä½ å¯ä»¥éæ©è¿ä¸ªçç¥ã
- **`ThreadPoolExecutor.DiscardPolicy`ï¼** ä¸å¤çæ°ä»»å¡ï¼ç´æ¥ä¸¢å¼æã
- **`ThreadPoolExecutor.DiscardOldestPolicy`ï¼** æ¤çç¥å°ä¸¢å¼ææ©çæªå¤ççä»»å¡è¯·æ±ã
举个ä¾åï¼ Spring éè¿ `ThreadPoolTaskExecutor` æè
æä»¬ç´æ¥éè¿ `ThreadPoolExecutor` çæé 彿°åå»ºçº¿ç¨æ± çæ¶åï¼å½æä»¬ä¸æå® `RejectedExecutionHandler` 饱åçç¥çè¯æ¥é
ç½®çº¿ç¨æ± çæ¶åé»è®¤ä½¿ç¨çæ¯ `ThreadPoolExecutor.AbortPolicy`ãå¨é»è®¤æ
åµä¸ï¼`ThreadPoolExecutor` å°æåº `RejectedExecutionException` æ¥æç»æ°æ¥çä»»å¡ ï¼è¿ä»£è¡¨ä½ å°ä¸¢å¤±å¯¹è¿ä¸ªä»»å¡çå¤çã 对äºå¯ä¼¸ç¼©çåºç¨ç¨åºï¼å»ºè®®ä½¿ç¨ `ThreadPoolExecutor.CallerRunsPolicy`ãå½æå¤§æ± è¢«å¡«æ»¡æ¶ï¼æ¤çç¥ä¸ºæä»¬æä¾å¯ä¼¸ç¼©éåãï¼è¿ä¸ªç´æ¥æ¥ç `ThreadPoolExecutor` çæé 彿°æºç å°±å¯ä»¥çåºï¼æ¯è¾ç®åçåå ï¼è¿éå°±ä¸è´´ä»£ç äºï¼
#### 6. ä¸ä¸ªç®åççº¿ç¨æ± Demo:`Runnable`+`ThreadPoolExecutor`
为äºè®©å¤§å®¶æ´æ¸
æ¥ä¸é¢çé¢è¯é¢ä¸çä¸äºæ¦å¿µï¼æåäºä¸ä¸ªç®åççº¿ç¨æ± Demoã
é¦å
å建ä¸ä¸ª `Runnable` æ¥å£çå®ç°ç±»ï¼å½ç¶ä¹å¯ä»¥æ¯ `Callable` æ¥å£ï¼æä»¬ä¸é¢ä¹è¯´äºä¸¤è
çåºå«ãï¼
`MyRunnable.java`
```java
import java.util.Date;
/**
* è¿æ¯ä¸ä¸ªç®åçRunnableç±»ï¼éè¦å¤§çº¦5ç§éæ¥æ§è¡å
¶ä»»å¡ã
* @author shuang.kou
*/
public class MyRunnable implements Runnable {
private String command;
public MyRunnable(String s) {
this.command = s;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " Start. Time = " + new Date());
processCommand();
System.out.println(Thread.currentThread().getName() + " End. Time = " + new Date());
}
private void processCommand() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return this.command;
}
}
```
ç¼åæµè¯ç¨åºï¼æä»¬è¿é以é¿éå·´å·´æ¨èçä½¿ç¨ `ThreadPoolExecutor` æé 彿°èªå®ä¹åæ°çæ¹å¼æ¥åå»ºçº¿ç¨æ± ã
`ThreadPoolExecutorDemo.java`
```java
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExecutorDemo {
private static final int CORE_POOL_SIZE = 5;
private static final int MAX_POOL_SIZE = 10;
private static final int QUEUE_CAPACITY = 100;
private static final Long KEEP_ALIVE_TIME = 1L;
public static void main(String[] args) {
//使ç¨é¿éå·´å·´æ¨èçåå»ºçº¿ç¨æ± çæ¹å¼
//éè¿ThreadPoolExecutoræé 彿°èªå®ä¹åæ°å建
ThreadPoolExecutor executor = new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAX_POOL_SIZE,
KEEP_ALIVE_TIME,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(QUEUE_CAPACITY),
new ThreadPoolExecutor.CallerRunsPolicy());
for (int i = 0; i < 10; i++) {
//å建WorkerThread对象ï¼WorkerThreadç±»å®ç°äºRunnable æ¥å£ï¼
Runnable worker = new MyRunnable("" + i);
//æ§è¡Runnable
executor.execute(worker);
}
//ç»æ¢çº¿ç¨æ±
executor.shutdown();
while (!executor.isTerminated()) {
}
System.out.println("Finished all threads");
}
}
```
å¯ä»¥ç尿们ä¸é¢çä»£ç æå®äºï¼
1. `corePoolSize`: æ ¸å¿çº¿ç¨æ°ä¸º 5ã
2. `maximumPoolSize` ï¼æå¤§çº¿ç¨æ° 10
3. `keepAliveTime` : çå¾
æ¶é´ä¸º 1Lã
4. `unit`: çå¾
æ¶é´çåä½ä¸º TimeUnit.SECONDSã
5. `workQueue`ï¼ä»»å¡éå为 `ArrayBlockingQueue`ï¼å¹¶ä¸å®¹é为 100;
6. `handler`:饱åçç¥ä¸º `CallerRunsPolicy`ã
**Outputï¼**
```
pool-1-thread-2 Start. Time = Tue Nov 12 20:59:44 CST 2019
pool-1-thread-5 Start. Time = Tue Nov 12 20:59:44 CST 2019
pool-1-thread-4 Start. Time = Tue Nov 12 20:59:44 CST 2019
pool-1-thread-1 Start. Time = Tue Nov 12 20:59:44 CST 2019
pool-1-thread-3 Start. Time = Tue Nov 12 20:59:44 CST 2019
pool-1-thread-5 End. Time = Tue Nov 12 20:59:49 CST 2019
pool-1-thread-3 End. Time = Tue Nov 12 20:59:49 CST 2019
pool-1-thread-2 End. Time = Tue Nov 12 20:59:49 CST 2019
pool-1-thread-4 End. Time = Tue Nov 12 20:59:49 CST 2019
pool-1-thread-1 End. Time = Tue Nov 12 20:59:49 CST 2019
pool-1-thread-2 Start. Time = Tue Nov 12 20:59:49 CST 2019
pool-1-thread-1 Start. Time = Tue Nov 12 20:59:49 CST 2019
pool-1-thread-4 Start. Time = Tue Nov 12 20:59:49 CST 2019
pool-1-thread-3 Start. Time = Tue Nov 12 20:59:49 CST 2019
pool-1-thread-5 Start. Time = Tue Nov 12 20:59:49 CST 2019
pool-1-thread-2 End. Time = Tue Nov 12 20:59:54 CST 2019
pool-1-thread-3 End. Time = Tue Nov 12 20:59:54 CST 2019
pool-1-thread-4 End. Time = Tue Nov 12 20:59:54 CST 2019
pool-1-thread-5 End. Time = Tue Nov 12 20:59:54 CST 2019
pool-1-thread-1 End. Time = Tue Nov 12 20:59:54 CST 2019
```
#### 7. çº¿ç¨æ± åçåæ
æ¿æ¥ 4.6 èï¼æä»¬éè¿ä»£ç è¾åºç»æå¯ä»¥çåºï¼**çº¿ç¨æ± æ¯æ¬¡ä¼åæ¶æ§è¡ 5 个任å¡ï¼è¿ 5 ä¸ªä»»å¡æ§è¡å®ä¹åï¼å©ä½ç 5 ä¸ªä»»å¡æä¼è¢«æ§è¡ã** 大家å¯ä»¥å
éè¿ä¸é¢è®²è§£çå
容ï¼åæä¸ä¸å°åºæ¯ååäºï¼ï¼èªå·±ç¬ç«æèä¸ä¼ï¼
ç°å¨ï¼æä»¬å°±åæä¸é¢çè¾åºå
容æ¥ç®ååæä¸ä¸çº¿ç¨æ± åçã
**ä¸ºäºææçº¿ç¨æ± çåçï¼æä»¬éè¦é¦å
åæä¸ä¸ `execute`æ¹æ³ã**å¨ 4.6 èä¸ç Demo ä¸æä»¬ä½¿ç¨ `executor.execute(worker)`æ¥æäº¤ä¸ä¸ªä»»å¡å°çº¿ç¨æ± ä¸å»ï¼è¿ä¸ªæ¹æ³é常éè¦ï¼ä¸é¢æä»¬æ¥ççå®çæºç ï¼
```java
// åæ¾çº¿ç¨æ± çè¿è¡ç¶æ (runState) åçº¿ç¨æ± å
ææçº¿ç¨çæ°é (workerCount)
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static int workerCountOf(int c) {
return c & CAPACITY;
}
private final BlockingQueue workQueue;
public void execute(Runnable command) {
// 妿任å¡ä¸ºnullï¼åæåºå¼å¸¸ã
if (command == null)
throw new NullPointerException();
// ctl ä¸ä¿åççº¿ç¨æ± å½åçä¸äºç¶æä¿¡æ¯
int c = ctl.get();
// ä¸é¢ä¼æ¶åå° 3 æ¥ æä½
// 1.é¦å
夿å½åçº¿ç¨æ± ä¸ä¹è¡ç任塿°éæ¯å¦å°äº corePoolSize
// 妿å°äºçè¯ï¼éè¿addWorker(command, true)æ°å»ºä¸ä¸ªçº¿ç¨ï¼å¹¶å°ä»»å¡(command)æ·»å å°è¯¥çº¿ç¨ä¸ï¼ç¶åï¼å¯å¨è¯¥çº¿ç¨ä»èæ§è¡ä»»å¡ã
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
// 2.妿å½åä¹è¡ç任塿°é大äºçäº corePoolSize çæ¶åå°±ä¼èµ°å°è¿é
// éè¿ isRunning æ¹æ³å¤æçº¿ç¨æ± ç¶æï¼çº¿ç¨æ± å¤äº RUNNING ç¶ææä¼è¢«å¹¶ä¸éåå¯ä»¥å å
¥ä»»å¡ï¼è¯¥ä»»å¡æä¼è¢«å å
¥è¿å»
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
// 忬¡è·åçº¿ç¨æ± ç¶æï¼å¦æçº¿ç¨æ± ç¶æä¸æ¯ RUNNING ç¶æå°±éè¦ä»ä»»å¡éåä¸ç§»é¤ä»»å¡ï¼å¹¶å°è¯å¤æçº¿ç¨æ¯å¦å
¨é¨æ§è¡å®æ¯ãåæ¶æ§è¡æç»çç¥ã
if (!isRunning(recheck) && remove(command))
reject(command);
// 妿å½åçº¿ç¨æ± 为空就æ°å建ä¸ä¸ªçº¿ç¨å¹¶æ§è¡ã
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
//3. éè¿addWorker(command, false)æ°å»ºä¸ä¸ªçº¿ç¨ï¼å¹¶å°ä»»å¡(command)æ·»å å°è¯¥çº¿ç¨ä¸ï¼ç¶åï¼å¯å¨è¯¥çº¿ç¨ä»èæ§è¡ä»»å¡ã
//妿addWorker(command, false)æ§è¡å¤±è´¥ï¼åéè¿reject()æ§è¡ç¸åºçæç»çç¥çå
容ã
else if (!addWorker(command, false))
reject(command);
}
```
éè¿ä¸å¾å¯ä»¥æ´å¥½ç对ä¸é¢è¿ 3 æ¥åä¸ä¸ªå±ç¤ºï¼ä¸å¾æ¯æä¸ºäºçäºç´æ¥ä»ç½ä¸æ¾å°ï¼åå°å䏿ã

ç°å¨ï¼è®©æä»¬å¨åå° 4.6 èæä»¬åç Demoï¼ ç°å¨åºè¯¥æ¯ä¸æ¯å¾å®¹æå°±å¯ä»¥ææå®çåçäºå¢ï¼
没ææçè¯ï¼ä¹æ²¡å
³ç³»ï¼å¯ä»¥ççæçåæï¼
> æä»¬å¨ä»£ç 䏿¨¡æäº 10 个任å¡ï¼æä»¬é
ç½®çæ ¸å¿çº¿ç¨æ°ä¸º 5 ãçå¾
éå容é为 100 ï¼æä»¥æ¯æ¬¡åªå¯è½åå¨ 5 个任å¡åæ¶æ§è¡ï¼å©ä¸ç 5 个任å¡ä¼è¢«æ¾å°çå¾
éåä¸å»ãå½åç 5 个任å¡ä¹è¡å®æåï¼æä¼ä¹è¡å©ä¸ç 5 个任å¡ã
### 2.3.15 Atomic ååç±»
#### 1. ä»ç»ä¸ä¸Atomic ååç±»
Atomic ç¿»è¯æä¸ææ¯ååçææãå¨åå¦ä¸ï¼æä»¬ç¥éå忝ææä¸è¬ç©è´¨çæå°åä½ï¼å¨åå¦ååºä¸æ¯ä¸å¯åå²çã卿们è¿é Atomic æ¯æä¸ä¸ªæä½æ¯ä¸å¯ä¸æçãå³ä½¿æ¯å¨å¤ä¸ªçº¿ç¨ä¸èµ·æ§è¡çæ¶åï¼ä¸ä¸ªæä½ä¸æ¦å¼å§ï¼å°±ä¸ä¼è¢«å
¶ä»çº¿ç¨å¹²æ°ã
æä»¥ï¼æè°åå类说ç®åç¹å°±æ¯å
·æåå/ååæä½ç¹å¾çç±»ã
å¹¶åå
`java.util.concurrent` çååç±»é½åæ¾å¨`java.util.concurrent.atomic`ä¸,å¦ä¸å¾æç¤ºã

#### 2. JUC å
ä¸çååç±»æ¯åª4ç±»?
**åºæ¬ç±»å**
使ç¨ååçæ¹å¼æ´æ°åºæ¬ç±»å
- AtomicIntegerï¼æ´å½¢ååç±»
- AtomicLongï¼é¿æ´åååç±»
- AtomicBooleanï¼å¸å°åååç±»
**æ°ç»ç±»å**
使ç¨ååçæ¹å¼æ´æ°æ°ç»éçæä¸ªå
ç´
- AtomicIntegerArrayï¼æ´å½¢æ°ç»ååç±»
- AtomicLongArrayï¼é¿æ´å½¢æ°ç»ååç±»
- AtomicReferenceArrayï¼å¼ç¨ç±»åæ°ç»ååç±»
**å¼ç¨ç±»å**
- AtomicReferenceï¼å¼ç¨ç±»åååç±»
- AtomicStampedReferenceï¼ååæ´æ°å¸¦æçæ¬å·çå¼ç¨ç±»åãè¯¥ç±»å°æ´æ°å¼ä¸å¼ç¨å
³èèµ·æ¥ï¼å¯ç¨äºè§£å³ååçæ´æ°æ°æ®åæ°æ®ççæ¬å·ï¼å¯ä»¥è§£å³ä½¿ç¨ CAS è¿è¡ååæ´æ°æ¶å¯è½åºç°ç ABA é®é¢ã
- AtomicMarkableReference ï¼ååæ´æ°å¸¦ææ è®°ä½çå¼ç¨ç±»å
**对象ç屿§ä¿®æ¹ç±»å**
- AtomicIntegerFieldUpdaterï¼ååæ´æ°æ´å½¢åæ®µçæ´æ°å¨
- AtomicLongFieldUpdaterï¼ååæ´æ°é¿æ´å½¢åæ®µçæ´æ°å¨
-
#### 3. 讲讲 AtomicInteger ç使ç¨
**AtomicInteger ç±»å¸¸ç¨æ¹æ³**
```java
public final int get() //è·åå½åçå¼
public final int getAndSet(int newValue)//è·åå½åçå¼ï¼å¹¶è®¾ç½®æ°çå¼
public final int getAndIncrement()//è·åå½åçå¼ï¼å¹¶èªå¢
public final int getAndDecrement() //è·åå½åçå¼ï¼å¹¶èªå
public final int getAndAdd(int delta) //è·åå½åçå¼ï¼å¹¶å ä¸é¢æçå¼
boolean compareAndSet(int expect, int update) //妿è¾å
¥çæ°å¼çäºé¢æå¼ï¼å以ååæ¹å¼å°è¯¥å¼è®¾ç½®ä¸ºè¾å
¥å¼ï¼updateï¼
public final void lazySet(int newValue)//æç»è®¾ç½®ä¸ºnewValue,ä½¿ç¨ lazySet 设置ä¹åå¯è½å¯¼è´å
¶ä»çº¿ç¨å¨ä¹åçä¸å°æ®µæ¶é´å
è¿æ¯å¯ä»¥è¯»å°æ§çå¼ã
```
**AtomicInteger ç±»ç使ç¨ç¤ºä¾**
ä½¿ç¨ AtomicInteger ä¹åï¼ä¸ç¨å¯¹ increment() æ¹æ³å éä¹å¯ä»¥ä¿è¯çº¿ç¨å®å
¨ã
```java
class AtomicIntegerTest {
private AtomicInteger count = new AtomicInteger();
//使ç¨AtomicIntegerä¹åï¼ä¸éè¦å¯¹è¯¥æ¹æ³å éï¼ä¹å¯ä»¥å®ç°çº¿ç¨å®å
¨ã
public void increment() {
count.incrementAndGet();
}
public int getCount() {
return count.get();
}
}
```
##### 4. è½ä¸è½ç»æç®åä»ç»ä¸ä¸ AtomicInteger ç±»çåç
AtomicInteger 线ç¨å®å
¨åçç®ååæ
AtomicInteger ç±»çé¨åæºç ï¼
```java
// setup to use Unsafe.compareAndSwapInt for updatesï¼æ´æ°æä½æ¶æä¾âæ¯è¾å¹¶æ¿æ¢âçä½ç¨ï¼
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
private volatile int value;
```
AtomicInteger 类主è¦å©ç¨ CAS (compare and swap) + volatile å native æ¹æ³æ¥ä¿è¯ååæä½ï¼ä»èé¿å
synchronized çé«å¼éï¼æ§è¡æç大为æåã
CASçåçæ¯æ¿ææçå¼å忬çä¸ä¸ªå¼ä½æ¯è¾ï¼å¦æç¸ååæ´æ°ææ°çå¼ãUnSafe ç±»ç objectFieldOffset() æ¹æ³æ¯ä¸ä¸ªæ¬å°æ¹æ³ï¼è¿ä¸ªæ¹æ³æ¯ç¨æ¥æ¿å°â忥çå¼âçå
åå°åï¼è¿å弿¯ valueOffsetãå¦å¤ value æ¯ä¸ä¸ªvolatileåéï¼å¨å
åä¸å¯è§ï¼å æ¤ JVM å¯ä»¥ä¿è¯ä»»ä½æ¶å»ä»»ä½çº¿ç¨æ»è½æ¿å°è¯¥åéçææ°å¼ã
å
³äº Atomic ååç±»è¿é¨åæ´å¤å
容å¯ä»¥æ¥çæçè¿ç¯æç« ï¼å¹¶åç¼ç¨é¢è¯å¿
å¤ï¼[JUC ä¸ç Atomic ååç±»æ»ç»](https://mp.weixin.qq.com/s/joa-yOiTrYF67bElj8xqvg)
### 2.3.16 AQS
#### 1. AQS ä»ç»
AQSçå
¨ç§°ä¸ºï¼AbstractQueuedSynchronizerï¼ï¼è¿ä¸ªç±»å¨java.util.concurrent.lockså
ä¸é¢ã

AQSæ¯ä¸ä¸ªç¨æ¥æå»ºéå忥å¨çæ¡æ¶ï¼ä½¿ç¨AQSè½ç®åä¸é«æå°æé åºåºç¨å¹¿æ³ç大éç忥å¨ï¼æ¯å¦æä»¬æå°çReentrantLockï¼Semaphoreï¼å
¶ä»ç诸å¦ReentrantReadWriteLockï¼SynchronousQueueï¼FutureTaskçççæ¯åºäºAQSçãå½ç¶ï¼æä»¬èªå·±ä¹è½å©ç¨AQSé常轻æ¾å®¹æå°æé åºç¬¦åæä»¬èªå·±éæ±ç忥å¨ã
#### 2. AQS åçåæ
AQS åçè¿é¨ååèäºé¨åå客ï¼å¨5.2èæ«å°¾æ¾äºé¾æ¥ã
> å¨é¢è¯ä¸è¢«é®å°å¹¶åç¥è¯çæ¶åï¼å¤§å¤é½ä¼è¢«é®å°âè¯·ä½ è¯´ä¸ä¸èªå·±å¯¹äºAQSåçççè§£âãä¸é¢ç»å¤§å®¶ä¸ä¸ªç¤ºä¾ä¾å¤§å®¶åå ï¼é¢è¯ä¸æ¯èé¢ï¼å¤§å®¶ä¸å®è¦å å
¥èªå·±çææ³ï¼å³ä½¿å å
¥ä¸äºèªå·±çææ³ä¹è¦ä¿è¯èªå·±è½å¤éä¿çè®²åºæ¥è䏿¯èåºæ¥ã
ä¸é¢å¤§é¨åå
容å
¶å®å¨AQS类注éä¸å·²ç»ç»åºäºï¼ä¸è¿æ¯è±è¯ççæ¯è¾ååä¸ç¹ï¼æå
´è¶£çè¯å¯ä»¥ççæºç ã
##### AQS åçæ¦è§
**AQSæ ¸å¿ææ³æ¯ï¼å¦æè¢«è¯·æ±çå
±äº«èµæºç©ºé²ï¼åå°å½å请æ±èµæºç线ç¨è®¾ç½®ä¸ºææçå·¥ä½çº¿ç¨ï¼å¹¶ä¸å°å
±äº«èµæºè®¾ç½®ä¸ºéå®ç¶æãå¦æè¢«è¯·æ±çå
±äº«èµæºè¢«å ç¨ï¼é£ä¹å°±éè¦ä¸å¥çº¿ç¨é»å¡çå¾
以å被å¤éæ¶éåé
çæºå¶ï¼è¿ä¸ªæºå¶AQSæ¯ç¨CLHéåéå®ç°çï¼å³å°ææ¶è·åä¸å°éç线ç¨å å
¥å°éåä¸ã**
> CLH(Craig,Landin,and Hagersten)é忝ä¸ä¸ªèæçååéåï¼èæçååéåå³ä¸åå¨éåå®ä¾ï¼ä»
åå¨ç»ç¹ä¹é´çå
³èå
³ç³»ï¼ãAQSæ¯å°æ¯æ¡è¯·æ±å
±äº«èµæºç线ç¨å°è£
æä¸ä¸ªCLHééåçä¸ä¸ªç»ç¹ï¼Nodeï¼æ¥å®ç°éçåé
ã
ç个AQS(AbstractQueuedSynchronizer)åçå¾ï¼

AQS使ç¨ä¸ä¸ªintæååéæ¥è¡¨ç¤ºåæ¥ç¶æï¼éè¿å
ç½®çFIFOé忥宿è·åèµæºçº¿ç¨çæéå·¥ä½ãAQS使ç¨CASå¯¹è¯¥åæ¥ç¶æè¿è¡ååæä½å®ç°å¯¹å
¶å¼çä¿®æ¹ã
```java
private volatile int state;//å
±äº«åéï¼ä½¿ç¨volatile修饰ä¿è¯çº¿ç¨å¯è§æ§
```
ç¶æä¿¡æ¯éè¿protectedç±»åçgetStateï¼setStateï¼compareAndSetStateè¿è¡æä½
```java
//è¿ååæ¥ç¶æçå½åå¼
protected final int getState() {
return state;
}
// è®¾ç½®åæ¥ç¶æçå¼
protected final void setState(int newState) {
state = newState;
}
//ååå°ï¼CASæä½ï¼å°åæ¥ç¶æå¼è®¾ç½®ä¸ºç»å®å¼update妿å½ååæ¥ç¶æçå¼çäºexpectï¼ææå¼ï¼
protected final boolean compareAndSetState(int expect, int update) {
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
```
##### AQS å¯¹èµæºçå
±äº«æ¹å¼
**AQSå®ä¹ä¸¤ç§èµæºå
±äº«æ¹å¼**
- **Exclusive**ï¼ç¬å ï¼ï¼åªæä¸ä¸ªçº¿ç¨è½æ§è¡ï¼å¦ReentrantLockãåå¯å为å
¬å¹³éåéå
¬å¹³éï¼
- å
¬å¹³éï¼æç
§çº¿ç¨å¨éåä¸çæé顺åºï¼å
å°è
å
æ¿å°é
- éå
¬å¹³éï¼å½çº¿ç¨è¦è·åéæ¶ï¼æ è§éå顺åºç´æ¥å»æ¢éï¼è°æ¢å°å°±æ¯è°ç
- **Share**ï¼å
±äº«ï¼ï¼å¤ä¸ªçº¿ç¨å¯åæ¶æ§è¡ï¼å¦Semaphore/CountDownLatchãSemaphoreãCountDownLatchã CyclicBarrierãReadWriteLock æä»¬é½ä¼å¨åé¢è®²å°ã
ReentrantReadWriteLock å¯ä»¥çææ¯ç»åå¼ï¼å 为ReentrantReadWriteLockä¹å°±æ¯è¯»åéå
许å¤ä¸ªçº¿ç¨åæ¶å¯¹æä¸èµæºè¿è¡è¯»ã
ä¸åçèªå®ä¹åæ¥å¨äºç¨å
±äº«èµæºçæ¹å¼ä¹ä¸åãèªå®ä¹åæ¥å¨å¨å®ç°æ¶åªéè¦å®ç°å
±äº«èµæº state çè·åä¸éæ¾æ¹å¼å³å¯ï¼è³äºå
·ä½çº¿ç¨çå¾
éåçç»´æ¤ï¼å¦è·åèµæºå¤±è´¥å
¥é/å¤éåºéçï¼ï¼AQSå·²ç»å¨é¡¶å±å®ç°å¥½äºã
##### AQSåºå±ä½¿ç¨äºæ¨¡æ¿æ¹æ³æ¨¡å¼
忥å¨ç设计æ¯åºäºæ¨¡æ¿æ¹æ³æ¨¡å¼çï¼å¦æéè¦èªå®ä¹åæ¥å¨ä¸è¬çæ¹å¼æ¯è¿æ ·ï¼æ¨¡æ¿æ¹æ³æ¨¡å¼å¾ç»å
¸çä¸ä¸ªåºç¨ï¼ï¼
1. 使ç¨è
ç»§æ¿AbstractQueuedSynchronizerå¹¶éåæå®çæ¹æ³ãï¼è¿äºéåæ¹æ³å¾ç®åï¼æ 鿝坹äºå
±äº«èµæºstateçè·ååéæ¾ï¼
2. å°AQSç»åå¨èªå®ä¹åæ¥ç»ä»¶çå®ç°ä¸ï¼å¹¶è°ç¨å
¶æ¨¡æ¿æ¹æ³ï¼èè¿äºæ¨¡æ¿æ¹æ³ä¼è°ç¨ä½¿ç¨è
éåçæ¹æ³ã
è¿åæä»¬ä»¥å¾éè¿å®ç°æ¥å£çæ¹å¼æå¾å¤§åºå«ï¼è¿æ¯æ¨¡æ¿æ¹æ³æ¨¡å¼å¾ç»å
¸çä¸ä¸ªè¿ç¨ã
**AQS使ç¨äºæ¨¡æ¿æ¹æ³æ¨¡å¼ï¼èªå®ä¹åæ¥å¨æ¶éè¦éåä¸é¢å 个AQSæä¾çæ¨¡æ¿æ¹æ³ï¼**
```java
isHeldExclusively()//è¯¥çº¿ç¨æ¯å¦æ£å¨ç¬å èµæºãåªæç¨å°conditionæéè¦å»å®ç°å®ã
tryAcquire(int)//ç¬å æ¹å¼ãå°è¯è·åèµæºï¼æååè¿åtrueï¼å¤±è´¥åè¿åfalseã
tryRelease(int)//ç¬å æ¹å¼ãå°è¯éæ¾èµæºï¼æååè¿åtrueï¼å¤±è´¥åè¿åfalseã
tryAcquireShared(int)//å
±äº«æ¹å¼ãå°è¯è·åèµæºãè´æ°è¡¨ç¤ºå¤±è´¥ï¼0表示æåï¼ä½æ²¡æå©ä½å¯ç¨èµæºï¼æ£æ°è¡¨ç¤ºæåï¼ä¸æå©ä½èµæºã
tryReleaseShared(int)//å
±äº«æ¹å¼ãå°è¯éæ¾èµæºï¼æååè¿åtrueï¼å¤±è´¥åè¿åfalseã
```
é»è®¤æ
åµä¸ï¼æ¯ä¸ªæ¹æ³é½æåº `UnsupportedOperationException`ã è¿äºæ¹æ³çå®ç°å¿
é¡»æ¯å
é¨çº¿ç¨å®å
¨çï¼å¹¶ä¸é常åºè¯¥ç®çè䏿¯é»å¡ãAQSç±»ä¸çå
¶ä»æ¹æ³é½æ¯final ï¼æä»¥æ æ³è¢«å
¶ä»ç±»ä½¿ç¨ï¼åªæè¿å ä¸ªæ¹æ³å¯ä»¥è¢«å
¶ä»ç±»ä½¿ç¨ã
以ReentrantLock为ä¾ï¼stateåå§å为0ï¼è¡¨ç¤ºæªéå®ç¶æãA线ç¨lock()æ¶ï¼ä¼è°ç¨tryAcquire()ç¬å 该éå¹¶å°state+1ãæ¤åï¼å
¶ä»çº¿ç¨åtryAcquire()æ¶å°±ä¼å¤±è´¥ï¼ç´å°A线ç¨unlock()å°state=0ï¼å³éæ¾éï¼ä¸ºæ¢ï¼å
¶å®çº¿ç¨æææºä¼è·å该éãå½ç¶ï¼éæ¾éä¹åï¼A线ç¨èªå·±æ¯å¯ä»¥éå¤è·åæ¤éçï¼stateä¼ç´¯å ï¼ï¼è¿å°±æ¯å¯éå
¥çæ¦å¿µãä½è¦æ³¨æï¼è·åå¤å°æ¬¡å°±è¦éæ¾å¤ä¹æ¬¡ï¼è¿æ ·æè½ä¿è¯stateæ¯è½åå°é¶æçã
å以CountDownLatch以ä¾ï¼ä»»å¡å为N个å线ç¨å»æ§è¡ï¼stateä¹åå§å为Nï¼æ³¨æNè¦ä¸çº¿ç¨ä¸ªæ°ä¸è´ï¼ãè¿N个åçº¿ç¨æ¯å¹¶è¡æ§è¡çï¼æ¯ä¸ªåçº¿ç¨æ§è¡å®åcountDown()䏿¬¡ï¼stateä¼CAS(Compare and Swap)å1ãçå°ææå线ç¨é½æ§è¡å®å(å³state=0)ï¼ä¼unpark()主è°ç¨çº¿ç¨ï¼ç¶å主è°ç¨çº¿ç¨å°±ä¼ä»await()彿°è¿åï¼ç»§ç»åä½å¨ä½ã
ä¸è¬æ¥è¯´ï¼èªå®ä¹åæ¥å¨è¦ä¹æ¯ç¬å æ¹æ³ï¼è¦ä¹æ¯å
±äº«æ¹å¼ï¼ä»ä»¬ä¹åªéå®ç°`tryAcquire-tryRelease`ã`tryAcquireShared-tryReleaseShared`ä¸çä¸ç§å³å¯ãä½AQS乿¯æèªå®ä¹åæ¥å¨åæ¶å®ç°ç¬å åå
±äº«ä¸¤ç§æ¹å¼ï¼å¦`ReentrantReadWriteLock`ã
æ¨èä¸¤ç¯ AQS åçåç¸å
³æºç åæçæç« ï¼
- http://www.cnblogs.com/waterystone/p/4920797.html
- https://www.cnblogs.com/chengxiao/archive/2017/07/24/7141160.html
#### 3. AQS ç»ä»¶æ»ç»
- **Semaphore(ä¿¡å·é)-å
许å¤ä¸ªçº¿ç¨åæ¶è®¿é®ï¼** synchronized å ReentrantLock 齿¯ä¸æ¬¡åªå
许ä¸ä¸ªçº¿ç¨è®¿é®æä¸ªèµæºï¼Semaphore(ä¿¡å·é)å¯ä»¥æå®å¤ä¸ªçº¿ç¨åæ¶è®¿é®æä¸ªèµæºã
- **CountDownLatch ï¼å计æ¶å¨ï¼ï¼** CountDownLatchæ¯ä¸ä¸ªåæ¥å·¥å
·ç±»ï¼ç¨æ¥åè°å¤ä¸ªçº¿ç¨ä¹é´ç忥ãè¿ä¸ªå·¥å
·éå¸¸ç¨æ¥æ§å¶çº¿ç¨çå¾
ï¼å®å¯ä»¥è®©æä¸ä¸ªçº¿ç¨çå¾
ç´å°å计æ¶ç»æï¼åå¼å§æ§è¡ã
- **CyclicBarrier(å¾ªç¯æ
æ )ï¼** CyclicBarrier å CountDownLatch é常类似ï¼å®ä¹å¯ä»¥å®ç°çº¿ç¨é´çææ¯çå¾
ï¼ä½æ¯å®çåè½æ¯ CountDownLatch æ´å 夿å强大ã主è¦åºç¨åºæ¯å CountDownLatch 类似ãCyclicBarrier çåé¢æææ¯å¯å¾ªç¯ä½¿ç¨ï¼Cyclicï¼çå±éï¼Barrierï¼ãå®è¦åçäºæ
æ¯ï¼è®©ä¸ç»çº¿ç¨å°è¾¾ä¸ä¸ªå±éï¼ä¹å¯ä»¥å«åæ¥ç¹ï¼æ¶è¢«é»å¡ï¼ç´å°æåä¸ä¸ªçº¿ç¨å°è¾¾å±éæ¶ï¼å±éæä¼å¼é¨ï¼ææè¢«å±éæ¦æªççº¿ç¨æä¼ç»§ç»å¹²æ´»ãCyclicBarrieré»è®¤çæé æ¹æ³æ¯ CyclicBarrier(int parties)ï¼å
¶åæ°è¡¨ç¤ºå±éæ¦æªççº¿ç¨æ°éï¼æ¯ä¸ªçº¿ç¨è°ç¨await()æ¹æ³åè¯ CyclicBarrier æå·²ç»å°è¾¾äºå±éï¼ç¶åå½å线ç¨è¢«é»å¡ã
### Reference
- ãæ·±å
¥çè§£ Java èææºã
- ã宿 Java é«å¹¶åç¨åºè®¾è®¡ã
- ãJavaå¹¶åç¼ç¨çèºæ¯ã
- http://www.cnblogs.com/waterystone/p/4920797.html
- https://www.cnblogs.com/chengxiao/archive/2017/07/24/7141160.html
-
## 2.4 JVM
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
### 2.4.1 ä»ç»ä¸ Java å
ååºå(è¿è¡æ¶æ°æ®åº)
Java èææºå¨æ§è¡ Java ç¨åºçè¿ç¨ä¸ä¼æå®ç®¡ççå
åååæè¥å¹²ä¸ªä¸åçæ°æ®åºåãJDK. 1.8 åä¹åççæ¬ç¥æä¸åï¼ä¸é¢ä¼ä»ç»å°ã
**JDK 1.8ä¹åï¼**
**JDK 1.8 ï¼**
**线ç¨ç§æçï¼**
- ç¨åºè®¡æ°å¨
- èææºæ
- æ¬å°æ¹æ³æ
**线ç¨å
±äº«çï¼**
- å
- æ¹æ³åº
- ç´æ¥å
å(éè¿è¡æ¶æ°æ®åºçä¸é¨å)
#### ç¨åºè®¡æ°å¨
ç¨åºè®¡æ°å¨æ¯ä¸åè¾å°çå
å空é´ï¼å¯ä»¥ç使¯å½åçº¿ç¨ææ§è¡çåèç çè¡å·æç¤ºå¨ã**åèç è§£éå¨å·¥ä½æ¶éè¿æ¹åè¿ä¸ªè®¡æ°å¨ç弿¥éåä¸ä¸æ¡éè¦æ§è¡çåèç æä»¤ï¼åæ¯ã循ç¯ã跳转ãå¼å¸¸å¤çãçº¿ç¨æ¢å¤çåè½é½éè¦ä¾èµè¿ä¸ªè®¡æ°å¨æ¥å®ã**
å¦å¤ï¼**为äºçº¿ç¨åæ¢åè½æ¢å¤å°æ£ç¡®çæ§è¡ä½ç½®ï¼æ¯æ¡çº¿ç¨é½éè¦æä¸ä¸ªç¬ç«çç¨åºè®¡æ°å¨ï¼å线ç¨ä¹é´è®¡æ°å¨äºä¸å½±åï¼ç¬ç«åå¨ï¼æä»¬ç§°è¿ç±»å
ååºå为â线ç¨ç§æâçå
åã**
**ä»ä¸é¢çä»ç»ä¸æä»¬ç¥éç¨åºè®¡æ°å¨ä¸»è¦æä¸¤ä¸ªä½ç¨ï¼**
1. åèç è§£éå¨éè¿æ¹åç¨åºè®¡æ°å¨æ¥ä¾æ¬¡è¯»åæä»¤ï¼ä»èå®ç°ä»£ç çæµç¨æ§å¶ï¼å¦ï¼é¡ºåºæ§è¡ãéæ©ã循ç¯ãå¼å¸¸å¤çã
2. å¨å¤çº¿ç¨çæ
åµä¸ï¼ç¨åºè®¡æ°å¨ç¨äºè®°å½å½åçº¿ç¨æ§è¡çä½ç½®ï¼ä»èå½çº¿ç¨è¢«åæ¢åæ¥çæ¶åè½å¤ç¥é该线ç¨ä¸æ¬¡è¿è¡å°åªå¿äºã
**注æï¼ç¨åºè®¡æ°å¨æ¯å¯ä¸ä¸ä¸ªä¸ä¼åºç° OutOfMemoryError çå
ååºåï¼å®ççå½å¨æéç线ç¨çå建èå建ï¼éç线ç¨çç»æèæ»äº¡ã**
#### Java èææºæ
**ä¸ç¨åºè®¡æ°å¨ä¸æ ·ï¼Javaèææºæ 乿¯çº¿ç¨ç§æçï¼å®ççå½å¨æå线ç¨ç¸åï¼æè¿°çæ¯ Java æ¹æ³æ§è¡çå
忍¡åï¼æ¯æ¬¡æ¹æ³è°ç¨çæ°æ®é½æ¯éè¿æ ä¼ éçã**
**Java å
åå¯ä»¥ç²ç³çåºå为å å
åï¼Heapï¼åæ å
å(Stack),å
¶ä¸æ å°±æ¯ç°å¨è¯´çèææºæ ï¼æè
说æ¯èææºæ ä¸å±é¨åé表é¨åã** ï¼å®é
ä¸ï¼Javaèææºæ æ¯ç±ä¸ä¸ªä¸ªæ å¸§ç»æï¼èæ¯ä¸ªæ 帧ä¸é½æ¥æï¼å±é¨åé表ãæä½æ°æ ã卿龿¥ãæ¹æ³åºå£ä¿¡æ¯ãï¼
**å±é¨åé表主è¦åæ¾äºç¼è¯å¨å¯ç¥çåç§æ°æ®ç±»å**ï¼booleanãbyteãcharãshortãintãfloatãlongãdoubleï¼ã**对象å¼ç¨**ï¼referenceç±»åï¼å®ä¸åäºå¯¹è±¡æ¬èº«ï¼å¯è½æ¯ä¸ä¸ªæå对象起å§å°åçå¼ç¨æéï¼ä¹å¯è½æ¯æåä¸ä¸ªä»£è¡¨å¯¹è±¡ç奿æå
¶ä»ä¸æ¤å¯¹è±¡ç¸å
³çä½ç½®ï¼ã
**Java èææºæ ä¼åºç°ä¸¤ç§å¼å¸¸ï¼StackOverFlowError å OutOfMemoryErrorã**
- **StackOverFlowErrorï¼** è¥Javaèææºæ çå
å大å°ä¸å
è®¸å¨ææ©å±ï¼é£ä¹å½çº¿ç¨è¯·æ±æ çæ·±åº¦è¶
è¿å½åJavaèææºæ çæå¤§æ·±åº¦çæ¶åï¼å°±æåºStackOverFlowErrorå¼å¸¸ã
- **OutOfMemoryErrorï¼** è¥ Java èææºæ çå
å大å°å
è®¸å¨ææ©å±ï¼ä¸å½çº¿ç¨è¯·æ±æ æ¶å
åç¨å®äºï¼æ æ³å卿æ©å±äºï¼æ¤æ¶æåºOutOfMemoryErrorå¼å¸¸ã
Java èææºæ 乿¯çº¿ç¨ç§æçï¼æ¯ä¸ªçº¿ç¨é½æåèªçJavaèææºæ ï¼èä¸éç线ç¨çå建èå建ï¼éç线ç¨çæ»äº¡èæ»äº¡ã
**æ©å±ï¼é£ä¹æ¹æ³/彿°å¦ä½è°ç¨ï¼**
Java æ å¯ç¨ç±»æ¯æ°æ®ç»æä¸æ ï¼Java æ ä¸ä¿åç主è¦å
å®¹æ¯æ å¸§ï¼æ¯ä¸æ¬¡å½æ°è°ç¨é½ä¼æä¸ä¸ªå¯¹åºçæ 帧被åå
¥Javaæ ï¼æ¯ä¸ä¸ªå½æ°è°ç¨ç»æåï¼é½ä¼æä¸ä¸ªæ 帧被弹åºã
Javaæ¹æ³æä¸¤ç§è¿åæ¹å¼ï¼
1. return è¯å¥ã
2. æåºå¼å¸¸ã
ä¸ç®¡åªç§è¿åæ¹å¼é½ä¼å¯¼è´æ 帧被弹åºã
#### æ¬å°æ¹æ³æ
åèææºæ æåæ¥çä½ç¨é常ç¸ä¼¼ï¼åºå«æ¯ï¼ **èææºæ ä¸ºèææºæ§è¡ Java æ¹æ³ ï¼ä¹å°±æ¯åèç ï¼æå¡ï¼èæ¬å°æ¹æ³æ åä¸ºèææºä½¿ç¨å°ç Native æ¹æ³æå¡ã** å¨ HotSpot èææºä¸å Java èææºæ åäºä¸ºä¸ã
æ¬å°æ¹æ³è¢«æ§è¡çæ¶åï¼å¨æ¬å°æ¹æ³æ ä¹ä¼å建ä¸ä¸ªæ 帧ï¼ç¨äºåæ¾è¯¥æ¬å°æ¹æ³çå±é¨åé表ãæä½æ°æ ã卿龿¥ãåºå£ä¿¡æ¯ã
æ¹æ³æ§è¡å®æ¯åç¸åºçæ 帧ä¹ä¼åºæ å¹¶éæ¾å
å空é´ï¼ä¹ä¼åºç° StackOverFlowError å OutOfMemoryError 两ç§å¼å¸¸ã
#### å
Java èææºæç®¡ççå
å䏿大çä¸åï¼Java å æ¯ææçº¿ç¨å
±äº«çä¸åå
ååºåï¼å¨èææºå¯å¨æ¶å建ã**æ¤å
ååºåçå¯ä¸ç®çå°±æ¯åæ¾å¯¹è±¡å®ä¾ï¼å 乿æç对象å®ä¾ä»¥åæ°ç»é½å¨è¿éåé
å
åã**
Java å æ¯å徿¶éå¨ç®¡çç主è¦åºåï¼å æ¤ä¹è¢«ç§°ä½**GCå ï¼Garbage Collected Heapï¼**.ä»åå¾åæ¶çè§åº¦ï¼ç±äºç°å¨æ¶éå¨åºæ¬é½éç¨å代å徿¶éç®æ³ï¼æä»¥Javaå è¿å¯ä»¥ç»åä¸ºï¼æ°ç代åè年代ï¼åç»è´ä¸ç¹æï¼Eden空é´ãFrom SurvivorãTo Survivor空é´çã**è¿ä¸æ¥ååçç®çæ¯æ´å¥½å°åæ¶å
åï¼æè
æ´å¿«å°åé
å
åã**
ä¸å¾æç¤ºç edenåºãs0åºãs1åºé½å±äºæ°ç代ï¼tentired åºå±äºè年代ã大é¨åæ
åµï¼å¯¹è±¡é½ä¼é¦å
å¨ Eden åºååé
ï¼å¨ä¸æ¬¡æ°ç代åå¾åæ¶åï¼å¦æå¯¹è±¡è¿åæ´»ï¼åä¼è¿å
¥ s0 æè
s1ï¼å¹¶ä¸å¯¹è±¡çå¹´é¾è¿ä¼å 1(Edenåº->Survivor åºå对象çåå§å¹´é¾å为1)ï¼å½å®çå¹´é¾å¢å å°ä¸å®ç¨åº¦ï¼é»è®¤ä¸º15å²ï¼ï¼å°±ä¼è¢«æåå°è年代ä¸ã对象æåå°è年代çå¹´é¾éå¼ï¼å¯ä»¥éè¿åæ° `-XX:MaxTenuringThreshold` æ¥è®¾ç½®ã
#### æ¹æ³åº
æ¹æ³åºä¸ Java å 䏿 ·ï¼æ¯å个线ç¨å
±äº«çå
ååºåï¼å®ç¨äºåå¨å·²è¢«èææºå è½½ç类信æ¯ã常éãéæåéã峿¶ç¼è¯å¨ç¼è¯åç代ç çæ°æ®ãè½ç¶Javaèææºè§èææ¹æ³åºæè¿°ä¸ºå çä¸ä¸ªé»è¾é¨åï¼ä½æ¯å®å´æä¸ä¸ªå«åå«å **Non-Heapï¼éå ï¼**ï¼ç®çåºè¯¥æ¯ä¸ Java å åºå弿¥ã
æ¹æ³åºä¹è¢«ç§°ä¸ºæ°¸ä¹
代ãå¾å¤äººé½ä¼å䏿¸
æ¹æ³åºåæ°¸ä¹
代çå
³ç³»ï¼ä¸ºæ¤æä¹æ¥é
äºæç®ã
##### æ¹æ³åºåæ°¸ä¹
代çå
³ç³»
> ãJavaèææºè§èãåªæ¯è§å®äºææ¹æ³åºè¿ä¹ä¸ªæ¦å¿µåå®çä½ç¨ï¼å¹¶æ²¡æè§å®å¦ä½å»å®ç°å®ãé£ä¹ï¼å¨ä¸åç JVM 䏿¹æ³åºçå®ç°è¯å®æ¯ä¸åçäºã **æ¹æ³åºåæ°¸ä¹
代çå
³ç³»å¾åJava䏿¥å£åç±»çå
³ç³»ï¼ç±»å®ç°äºæ¥å£ï¼èæ°¸ä¹
代就æ¯HotSpotèææºå¯¹èææºè§è䏿¹æ³åºçä¸ç§å®ç°æ¹å¼ã** ä¹å°±æ¯è¯´ï¼æ°¸ä¹
代æ¯HotSpotçæ¦å¿µï¼æ¹æ³åºæ¯Javaèææºè§èä¸çå®ä¹ï¼æ¯ä¸ç§è§èï¼èæ°¸ä¹
代æ¯ä¸ç§å®ç°ï¼ä¸ä¸ªæ¯æ åä¸ä¸ªæ¯å®ç°ï¼å
¶ä»çèææºå®ç°å¹¶æ²¡ææ°¸ä¹
带è¿ä¸è¯´æ³ã
##### 常ç¨åæ°
JDK 1.8 ä¹åæ°¸ä¹
ä»£è¿æ²¡è¢«å½»åºç§»é¤çæ¶åé常éè¿ä¸é¢è¿äºåæ°æ¥è°èæ¹æ³åºå¤§å°
```java
-XX:PermSize=N //æ¹æ³åº(æ°¸ä¹
代)åå§å¤§å°
-XX:MaxPermSize=N //æ¹æ³åº(æ°¸ä¹
代)æå¤§å¤§å°,è¶
è¿è¿ä¸ªå¼å°ä¼æåºOutOfMemoryErrorå¼å¸¸:java.lang.OutOfMemoryError: PermGen
```
ç¸å¯¹èè¨ï¼å徿¶éè¡ä¸ºå¨è¿ä¸ªåºåæ¯æ¯è¾å°åºç°çï¼ä½å¹¶éæ°æ®è¿å
¥æ¹æ³åºåå°±âæ°¸ä¹
åå¨âäºã**
JDK 1.8 çæ¶åï¼æ¹æ³åºï¼HotSpotçæ°¸ä¹
代ï¼è¢«å½»åºç§»é¤äºï¼JDK1.7就已ç»å¼å§äºï¼ï¼åè代乿¯å
空é´ï¼å
空é´ä½¿ç¨çæ¯ç´æ¥å
åã
ä¸é¢æ¯ä¸äºå¸¸ç¨åæ°ï¼
```java
-XX:MetaspaceSize=N //设置Metaspaceçåå§ï¼åæå°å¤§å°ï¼
-XX:MaxMetaspaceSize=N //设置Metaspaceçæå¤§å¤§å°
```
䏿°¸ä¹
代å¾å¤§çä¸åå°±æ¯ï¼å¦æä¸æå®å¤§å°çè¯ï¼éçæ´å¤ç±»çå建ï¼èææºä¼èå°½ææå¯ç¨çç³»ç»å
åã
##### 为ä»ä¹è¦å°æ°¸ä¹
代(PermGen)æ¿æ¢ä¸ºå
空é´(MetaSpace)å¢?
æ´ä¸ªæ°¸ä¹
代æä¸ä¸ª JVM æ¬èº«è®¾ç½®åºå®å¤§å°ä¸çº¿ï¼æ æ³è¿è¡è°æ´ï¼èå
空é´ä½¿ç¨çæ¯ç´æ¥å
åï¼åæ¬æºå¯ç¨å
åçéå¶ï¼å¹¶ä¸æ°¸è¿ä¸ä¼å¾å°java.lang.OutOfMemoryErrorãä½ å¯ä»¥ä½¿ç¨ `-XXï¼MaxMetaspaceSize` æ å¿è®¾ç½®æå¤§å
空é´å¤§å°ï¼é»è®¤å¼ä¸º unlimitedï¼è¿æå³çå®åªåç³»ç»å
åçéå¶ã`-XXï¼MetaspaceSize` è°æ´æ å¿å®ä¹å
空é´çåå§å¤§å°å¦ææªæå®æ¤æ å¿ï¼å Metaspace å°æ ¹æ®è¿è¡æ¶çåºç¨ç¨åºéæ±å¨æå°éæ°è°æ´å¤§å°ã
å½ç¶è¿åªæ¯å
¶ä¸ä¸ä¸ªåå ï¼è¿æå¾å¤åºå±çåå ï¼è¿é就䏿äºã
#### è¿è¡æ¶å¸¸éæ±
è¿è¡æ¶å¸¸éæ± æ¯æ¹æ³åºçä¸é¨åãClass æä»¶ä¸é¤äºæç±»ççæ¬ãåæ®µãæ¹æ³ãæ¥å£çæè¿°ä¿¡æ¯å¤ï¼è¿æå¸¸éæ± ä¿¡æ¯ï¼ç¨äºåæ¾ç¼è¯æçæçåç§åé¢éå符å·å¼ç¨ï¼
æ¢ç¶è¿è¡æ¶å¸¸éæ± æ¶æ¹æ³åºçä¸é¨åï¼èªç¶åå°æ¹æ³åºå
åçéå¶ï¼å½å¸¸éæ± æ æ³åç³è¯·å°å
åæ¶ä¼æåº OutOfMemoryError å¼å¸¸ã
**JDK1.7åä¹åçæ¬ç JVM å·²ç»å°è¿è¡æ¶å¸¸éæ± ä»æ¹æ³åºä¸ç§»äºåºæ¥ï¼å¨ Java å ï¼Heapï¼ä¸å¼è¾äºä¸ååºååæ¾è¿è¡æ¶å¸¸éæ± ã**

ââå¾çæ¥æºï¼https://blog.csdn.net/wangbiao007/article/details/78545189
#### ç´æ¥å
å
**ç´æ¥å
å并䏿¯èææºè¿è¡æ¶æ°æ®åºçä¸é¨åï¼ä¹ä¸æ¯èææºè§èä¸å®ä¹çå
ååºåï¼ä½æ¯è¿é¨åå
åä¹è¢«é¢ç¹å°ä½¿ç¨ãèä¸ä¹å¯è½å¯¼è´ OutOfMemoryError å¼å¸¸åºç°ã**
JDK1.4 䏿°å å
¥ç **NIO(New Input/Output) ç±»**ï¼å¼å
¥äºä¸ç§åºäº**ééï¼Channelï¼** ä¸**ç¼ååºï¼Bufferï¼** ç I/O æ¹å¼ï¼å®å¯ä»¥ç´æ¥ä½¿ç¨ Native 彿°åºç´æ¥åé
å å¤å
åï¼ç¶åéè¿ä¸ä¸ªåå¨å¨ Java å ä¸ç DirectByteBuffer 对象ä½ä¸ºè¿åå
åçå¼ç¨è¿è¡æä½ãè¿æ ·å°±è½å¨ä¸äºåºæ¯ä¸æ¾èæé«æ§è½ï¼å 为**é¿å
äºå¨ Java å å Native å ä¹é´æ¥åå¤å¶æ°æ®**ã
æ¬æºç´æ¥å
åçåé
ä¸ä¼æ¶å° Java å çéå¶ï¼ä½æ¯ï¼æ¢ç¶æ¯å
åå°±ä¼åå°æ¬æºæ»å
å大å°ä»¥åå¤çå¨å¯»å空é´çéå¶ã
### 2.4.2 说ä¸ä¸Java对象çå建è¿ç¨
ä¸å¾ä¾¿æ¯ Java 对象çå建è¿ç¨ï¼æå»ºè®®æå¥½æ¯è½é»ååºæ¥ï¼å¹¶ä¸è¦ææ¡æ¯ä¸æ¥å¨åä»ä¹ã

**â ç±»å è½½æ£æ¥ï¼** èææºéå°ä¸æ¡ new æä»¤æ¶ï¼é¦å
å°å»æ£æ¥è¿ä¸ªæä»¤çåæ°æ¯å¦è½å¨å¸¸éæ± ä¸å®ä½å°è¿ä¸ªç±»ç符å·å¼ç¨ï¼å¹¶ä¸æ£æ¥è¿ä¸ªç¬¦å·å¼ç¨ä»£è¡¨çç±»æ¯å¦å·²è¢«å è½½è¿ãè§£æååå§åè¿ãå¦ææ²¡æï¼é£å¿
é¡»å
æ§è¡ç¸åºçç±»å è½½è¿ç¨ã
**â¡åé
å
åï¼** å¨**ç±»å è½½æ£æ¥**éè¿åï¼æ¥ä¸æ¥èææºå°ä¸ºæ°ç对象**åé
å
å**ã对象æéçå
å大å°å¨ç±»å è½½å®æå便å¯ç¡®å®ï¼ä¸ºå¯¹è±¡åé
空é´çä»»å¡çåäºæä¸åç¡®å®å¤§å°çå
åä» Java å ä¸åååºæ¥ã**åé
æ¹å¼**æ **âæé碰æâ** å **â空é²å表â** 两ç§ï¼**éæ©é£ç§åé
æ¹å¼ç± Java å æ¯å¦è§æ´å³å®ï¼èJavaå æ¯å¦è§æ´åç±æéç¨çå徿¶é卿¯å¦å¸¦æå缩æ´çåè½å³å®**ã
**å
ååé
çä¸¤ç§æ¹å¼ï¼ï¼è¡¥å
å
容ï¼éè¦ææ¡ï¼**
鿩以ä¸ä¸¤ç§æ¹å¼ä¸çåªä¸ç§ï¼åå³äº Java å å
忝å¦è§æ´ãè Java å å
忝å¦è§æ´ï¼åå³äº GC æ¶éå¨çç®æ³æ¯"æ è®°-æ¸
é¤"ï¼è¿æ¯"æ è®°-æ´ç"ï¼ä¹ç§°ä½"æ è®°-å缩"ï¼ï¼å¼å¾æ³¨æçæ¯ï¼å¤å¶ç®æ³å
å乿¯è§æ´ç

**å
ååé
å¹¶åé®é¢ï¼è¡¥å
å
容ï¼éè¦ææ¡ï¼**
å¨åå»ºå¯¹è±¡çæ¶åæä¸ä¸ªå¾éè¦çé®é¢ï¼å°±æ¯çº¿ç¨å®å
¨ï¼å 为å¨å®é
å¼åè¿ç¨ä¸ï¼å建对象æ¯å¾é¢ç¹çäºæ
ï¼ä½ä¸ºèææºæ¥è¯´ï¼å¿
é¡»è¦ä¿è¯çº¿ç¨æ¯å®å
¨çï¼é常æ¥è®²ï¼èææºéç¨ä¸¤ç§æ¹å¼æ¥ä¿è¯çº¿ç¨å®å
¨ï¼
- **CAS+失败éè¯ï¼** CAS æ¯ä¹è§éçä¸ç§å®ç°æ¹å¼ãæè°ä¹è§éå°±æ¯ï¼æ¯æ¬¡ä¸å éèæ¯å设没æå²çªèå»å®ææé¡¹æä½ï¼å¦æå 为å²çªå¤±è´¥å°±éè¯ï¼ç´å°æå为æ¢ã**èææºéç¨ CAS é
ä¸å¤±è´¥éè¯çæ¹å¼ä¿è¯æ´æ°æä½çååæ§ã**
- **TLABï¼** 为æ¯ä¸ä¸ªçº¿ç¨é¢å
å¨Edenåºåé
ä¸åå¿å
åï¼JVMå¨ç»çº¿ç¨ä¸ç对象åé
å
åæ¶ï¼é¦å
å¨TLABåé
ï¼å½å¯¹è±¡å¤§äºTLABä¸çå©ä½å
åæTLABçå
åå·²ç¨å°½æ¶ï¼åéç¨ä¸è¿°çCASè¿è¡å
ååé
**â¢åå§åé¶å¼ï¼** å
ååé
宿åï¼èææºéè¦å°åé
å°çå
å空é´é½åå§å为é¶å¼ï¼ä¸å
æ¬å¯¹è±¡å¤´ï¼ï¼è¿ä¸æ¥æä½ä¿è¯äºå¯¹è±¡çå®ä¾åæ®µå¨ Java 代ç ä¸å¯ä»¥ä¸èµåå§å¼å°±ç´æ¥ä½¿ç¨ï¼ç¨åºè½è®¿é®å°è¿äºåæ®µçæ°æ®ç±»åæå¯¹åºçé¶å¼ã
**â£è®¾ç½®å¯¹è±¡å¤´ï¼** åå§åé¶å¼å®æä¹åï¼**èææºè¦å¯¹å¯¹è±¡è¿è¡å¿
è¦ç设置**ï¼ä¾å¦è¿ä¸ªå¯¹è±¡æ¯é£ä¸ªç±»çå®ä¾ãå¦ä½æè½æ¾å°ç±»çå
æ°æ®ä¿¡æ¯ã对象çåå¸åã对象ç GC å代年é¾çä¿¡æ¯ã **è¿äºä¿¡æ¯åæ¾å¨å¯¹è±¡å¤´ä¸ã** å¦å¤ï¼æ ¹æ®èææºå½åè¿è¡ç¶æçä¸åï¼å¦æ¯å¦å¯ç¨ååéçï¼å¯¹è±¡å¤´ä¼æä¸åç设置æ¹å¼ã
**â¤æ§è¡ init æ¹æ³ï¼** å¨ä¸é¢å·¥ä½é½å®æä¹åï¼ä»èææºçè§è§æ¥çï¼ä¸ä¸ªæ°ç对象已ç»äº§çäºï¼ä½ä» Java ç¨åºçè§è§æ¥çï¼å¯¹è±¡å建æåå¼å§ï¼`` æ¹æ³è¿æ²¡ææ§è¡ï¼ææçåæ®µé½è¿ä¸ºé¶ãæä»¥ä¸è¬æ¥è¯´ï¼æ§è¡ new æä»¤ä¹å伿¥çæ§è¡ `` æ¹æ³ï¼æå¯¹è±¡æç
§ç¨åºåçææ¿è¿è¡åå§åï¼è¿æ ·ä¸ä¸ªçæ£å¯ç¨ç对象æç®å®å
¨äº§çåºæ¥ã
### 2.4.3 对象ç访é®å®ä½æåªä¸¤ç§æ¹å¼?
建ç«å¯¹è±¡å°±æ¯ä¸ºäºä½¿ç¨å¯¹è±¡ï¼æä»¬çJavaç¨åºéè¿æ ä¸ç reference æ°æ®æ¥æä½å ä¸çå
·ä½å¯¹è±¡ã对象çè®¿é®æ¹å¼æèææºå®ç°èå®ï¼ç®å主æµçè®¿é®æ¹å¼æ**â 使ç¨å¥æ**å**â¡ç´æ¥æé**两ç§ï¼
1. **奿ï¼** å¦æä½¿ç¨å¥æçè¯ï¼é£ä¹Javaå ä¸å°ä¼åååºä¸åå
忥ä½ä¸ºå¥ææ± ï¼reference ä¸åå¨çå°±æ¯å¯¹è±¡ç奿å°åï¼è奿ä¸å
å«äºå¯¹è±¡å®ä¾æ°æ®ä¸ç±»åæ°æ®åèªçå
·ä½å°åä¿¡æ¯ï¼

2. **ç´æ¥æéï¼** å¦æä½¿ç¨ç´æ¥æé访é®ï¼é£ä¹ Java å 对象çå¸å±ä¸å°±å¿
é¡»èèå¦ä½æ¾ç½®è®¿é®ç±»åæ°æ®çç¸å
³ä¿¡æ¯ï¼èreference ä¸åå¨çç´æ¥å°±æ¯å¯¹è±¡çå°åã

**è¿ä¸¤ç§å¯¹è±¡è®¿é®æ¹å¼åæä¼å¿ã使ç¨å¥ææ¥è®¿é®çæå¤§å¥½å¤æ¯ reference ä¸åå¨çæ¯ç¨³å®ç奿å°åï¼å¨å¯¹è±¡è¢«ç§»å¨æ¶åªä¼æ¹å奿ä¸çå®ä¾æ°æ®æéï¼è reference æ¬èº«ä¸éè¦ä¿®æ¹ã使ç¨ç´æ¥æéè®¿é®æ¹å¼æå¤§ç好å¤å°±æ¯é度快ï¼å®èçäºä¸æ¬¡æéå®ä½çæ¶é´å¼éã**
### 2.4.4 说ä¸ä¸å å
åä¸å¯¹è±¡çåé
çåºæ¬çç¥
**å 空é´çåºæ¬ç»æï¼**
ä¸å¾æç¤ºç edenåºãs0åºãs1åºé½å±äºæ°ç代ï¼tentired åºå±äºè年代ã大é¨åæ
åµï¼å¯¹è±¡é½ä¼é¦å
å¨ Eden åºååé
ï¼å¨ä¸æ¬¡æ°ç代åå¾åæ¶åï¼å¦æå¯¹è±¡è¿åæ´»ï¼åä¼è¿å
¥ s0 æè
s1ï¼å¹¶ä¸å¯¹è±¡çå¹´é¾è¿ä¼å 1(Edenåº->Survivor åºå对象çåå§å¹´é¾å为1)ï¼å½å®çå¹´é¾å¢å å°ä¸å®ç¨åº¦ï¼é»è®¤ä¸º15å²ï¼ï¼å°±ä¼è¢«æåå°è年代ä¸ã对象æåå°è年代çå¹´é¾éå¼ï¼å¯ä»¥éè¿åæ° `-XX:MaxTenuringThreshold` æ¥è®¾ç½®ã
å¦å¤ï¼å¤§å¯¹è±¡åé¿æåæ´»ç对象ä¼ç´æ¥è¿å
¥è年代ã

### 2.4.5 Minor GcåFull GC æä»ä¹ä¸åå¢ï¼
大夿°æ
åµä¸ï¼å¯¹è±¡å¨æ°çä»£ä¸ eden åºåé
ãå½ eden åºæ²¡æè¶³å¤ç©ºé´è¿è¡åé
æ¶ï¼èææºå°åèµ·ä¸æ¬¡Minor GCã
- **æ°ç代GCï¼Minor GCï¼**:æåçæ°ç代ççå徿¶éå¨ä½ï¼Minor GCé常é¢ç¹ï¼åæ¶é度ä¸è¬ä¹æ¯è¾å¿«ã
- **è年代GCï¼Major GC/Full GCï¼**:æåçå¨è年代çGCï¼åºç°äºMajor GCç»å¸¸ä¼ä¼´éè³å°ä¸æ¬¡çMinor GCï¼å¹¶éç»å¯¹ï¼ï¼Major GCçé度ä¸è¬ä¼æ¯Minor GCçæ
¢10å以ä¸ã
### 2.4.6 å¦ä½å¤æå¯¹è±¡æ¯å¦æ»äº¡?(ä¸¤ç§æ¹æ³)
å ä¸å 乿¾çææç对象å®ä¾ï¼å¯¹å åå¾åæ¶åçç¬¬ä¸æ¥å°±æ¯è¦å¤æåªäºå¯¹è±¡å·²ç»æ»äº¡ï¼å³ä¸è½å被任ä½éå¾ä½¿ç¨ç对象ï¼ã
#### å¼ç¨è®¡æ°æ³
ç»å¯¹è±¡ä¸æ·»å ä¸ä¸ªå¼ç¨è®¡æ°å¨ï¼æ¯å½æä¸ä¸ªå°æ¹å¼ç¨å®ï¼è®¡æ°å¨å°±å 1ï¼å½å¼ç¨å¤±æï¼è®¡æ°å¨å°±å1ï¼ä»»ä½æ¶å计æ°å¨ä¸º0ç对象就æ¯ä¸å¯è½å被使ç¨çã
#### å¯è¾¾æ§åæç®æ³
è¿ä¸ªç®æ³çåºæ¬ææ³å°±æ¯éè¿ä¸ç³»åç称为 **âGC Rootsâ** ç对象ä½ä¸ºèµ·ç¹ï¼ä»è¿äºèç¹å¼å§åä¸æç´¢ï¼èç¹æèµ°è¿çè·¯å¾ç§°ä¸ºå¼ç¨é¾ï¼å½ä¸ä¸ªå¯¹è±¡å° GC Roots 没æä»»ä½å¼ç¨é¾ç¸è¿çè¯ï¼åè¯ææ¤å¯¹è±¡æ¯ä¸å¯ç¨çã

### 2.4.7 ç®åçä»ç»ä¸ä¸å¼ºå¼ç¨,软å¼ç¨,å¼±å¼ç¨,èå¼ç¨
æ 论æ¯éè¿å¼ç¨è®¡æ°æ³å¤æå¯¹è±¡å¼ç¨æ°éï¼è¿æ¯éè¿å¯è¾¾æ§åææ³å¤æå¯¹è±¡çå¼ç¨é¾æ¯å¦å¯è¾¾ï¼å¤å®å¯¹è±¡çåæ´»é½ä¸âå¼ç¨âæå
³ã
JDK1.2ä¹åï¼Javaä¸å¼ç¨çå®ä¹å¾ä¼ ç»ï¼å¦æreferenceç±»åçæ°æ®åå¨çæ°å¼ä»£è¡¨çæ¯å¦ä¸åå
åçèµ·å§å°åï¼å°±ç§°è¿åå
å代表ä¸ä¸ªå¼ç¨ã
JDK1.2以åï¼Java对å¼ç¨çæ¦å¿µè¿è¡äºæ©å
ï¼å°å¼ç¨å为强å¼ç¨ã软å¼ç¨ãå¼±å¼ç¨ãèå¼ç¨åç§ï¼å¼ç¨å¼ºåº¦éæ¸åå¼±ï¼
#### 强å¼ç¨(StrongReference)
以åæä»¬ä½¿ç¨ç大é¨åå¼ç¨å®é
ä¸é½æ¯å¼ºå¼ç¨ï¼è¿æ¯ä½¿ç¨ææ®éçå¼ç¨ã妿ä¸ä¸ªå¯¹è±¡å
·æå¼ºå¼ç¨ï¼é£å°±ç±»ä¼¼äº**å¿
ä¸å¯å°ççæ´»ç¨å**ï¼åå¾åæ¶å¨ç»ä¸ä¼åæ¶å®ãå½å
å空 é´ä¸è¶³ï¼Javaèææºå®æ¿æåºOutOfMemoryErroré误ï¼ä½¿ç¨åºå¼å¸¸ç»æ¢ï¼ä¹ä¸ä¼é éæåæ¶å
·æå¼ºå¼ç¨ç对象æ¥è§£å³å
åä¸è¶³é®é¢ã
#### 软å¼ç¨(SoftReference)
妿ä¸ä¸ªå¯¹è±¡åªå
·æè½¯å¼ç¨ï¼é£å°±ç±»ä¼¼äº**坿坿 ççæ´»ç¨å**ã妿å
å空é´è¶³å¤ï¼åå¾åæ¶å¨å°±ä¸ä¼åæ¶å®ï¼å¦æå
å空é´ä¸è¶³äºï¼å°±ä¼åæ¶è¿äºå¯¹è±¡çå
åãåªè¦åå¾åæ¶å¨æ²¡æåæ¶å®ï¼è¯¥å¯¹è±¡å°±å¯ä»¥è¢«ç¨åºä½¿ç¨ã软å¼ç¨å¯ç¨æ¥å®ç°å
åææçé«éç¼åã
软å¼ç¨å¯ä»¥åä¸ä¸ªå¼ç¨éåï¼ReferenceQueueï¼èå使ç¨ï¼å¦æè½¯å¼ç¨æå¼ç¨ç对象被åå¾åæ¶ï¼JAVAèææºå°±ä¼æè¿ä¸ªè½¯å¼ç¨å å
¥å°ä¸ä¹å
³èçå¼ç¨éåä¸ã
#### å¼±å¼ç¨(WeakReference)
妿ä¸ä¸ªå¯¹è±¡åªå
·æå¼±å¼ç¨ï¼é£å°±ç±»ä¼¼äº**坿坿 ççæ´»ç¨å**ãå¼±å¼ç¨ä¸è½¯å¼ç¨çåºå«å¨äºï¼åªå
·æå¼±å¼ç¨çå¯¹è±¡æ¥ææ´çæççå½å¨æãå¨åå¾åæ¶å¨çº¿ç¨æ«æå® æç®¡è¾çå
ååºåçè¿ç¨ä¸ï¼ä¸æ¦åç°äºåªå
·æå¼±å¼ç¨ç对象ï¼ä¸ç®¡å½åå
å空é´è¶³å¤ä¸å¦ï¼é½ä¼åæ¶å®çå
åãä¸è¿ï¼ç±äºåå¾åæ¶å¨æ¯ä¸ä¸ªä¼å
级å¾ä½ç线ç¨ï¼ å æ¤ä¸ä¸å®ä¼å¾å¿«åç°é£äºåªå
·æå¼±å¼ç¨ç对象ã
å¼±å¼ç¨å¯ä»¥åä¸ä¸ªå¼ç¨éåï¼ReferenceQueueï¼èå使ç¨ï¼å¦æå¼±å¼ç¨æå¼ç¨ç对象被åå¾åæ¶ï¼Javaèææºå°±ä¼æè¿ä¸ªå¼±å¼ç¨å å
¥å°ä¸ä¹å
³èçå¼ç¨éåä¸ã
**4ï¼èå¼ç¨ï¼PhantomReferenceï¼**
"èå¼ç¨"顾åæä¹ï¼å°±æ¯å½¢åè设ï¼ä¸å
¶ä»å ç§å¼ç¨é½ä¸åï¼èå¼ç¨å¹¶ä¸ä¼å³å®å¯¹è±¡ççå½å¨æã妿ä¸ä¸ªå¯¹è±¡ä»
ææèå¼ç¨ï¼é£ä¹å®å°±å没æä»»ä½å¼ç¨ä¸æ ·ï¼å¨ä»»ä½æ¶åé½å¯è½è¢«åå¾åæ¶ã
**èå¼ç¨ä¸»è¦ç¨æ¥è·è¸ªå¯¹è±¡è¢«åå¾åæ¶çæ´»å¨**ã
**èå¼ç¨ä¸è½¯å¼ç¨åå¼±å¼ç¨çä¸ä¸ªåºå«å¨äºï¼** èå¼ç¨å¿
é¡»åå¼ç¨éåï¼ReferenceQueueï¼èå使ç¨ãå½å å¾åæ¶å¨åå¤åæ¶ä¸ä¸ªå¯¹è±¡æ¶ï¼å¦æåç°å®è¿æèå¼ç¨ï¼å°±ä¼å¨åæ¶å¯¹è±¡çå
åä¹åï¼æè¿ä¸ªèå¼ç¨å å
¥å°ä¸ä¹å
³èçå¼ç¨éåä¸ãç¨åºå¯ä»¥éè¿å¤æå¼ç¨éå䏿¯ å¦å·²ç»å å
¥äºèå¼ç¨ï¼æ¥äºè§£è¢«å¼ç¨ç对象æ¯å¦å°è¦è¢«åå¾åæ¶ãç¨åºå¦æåç°æä¸ªèå¼ç¨å·²ç»è¢«å å
¥å°å¼ç¨éåï¼é£ä¹å°±å¯ä»¥å¨æå¼ç¨ç对象çå
åè¢«åæ¶ä¹åéåå¿
è¦çè¡å¨ã
ç¹å«æ³¨æï¼å¨ç¨åºè®¾è®¡ä¸ä¸è¬å¾å°ä½¿ç¨å¼±å¼ç¨ä¸èå¼ç¨ï¼ä½¿ç¨è½¯å¼ç¨çæ
åµè¾å¤ï¼è¿æ¯å 为**软å¼ç¨å¯ä»¥å éJVM对åå¾å
åçåæ¶é度ï¼å¯ä»¥ç»´æ¤ç³»ç»çè¿è¡å®å
¨ï¼é²æ¢å
åæº¢åºï¼OutOfMemoryï¼çé®é¢ç产ç**ã
### 2.4.8 å¦ä½å¤æä¸ä¸ªå¸¸éæ¯åºå¼å¸¸é?
è¿è¡æ¶å¸¸éæ± ä¸»è¦åæ¶çæ¯åºå¼ç常éãé£ä¹ï¼æä»¬å¦ä½å¤æä¸ä¸ªå¸¸éæ¯åºå¼å¸¸éå¢ï¼
åå¦å¨å¸¸éæ± ä¸åå¨å符串 "abc"ï¼å¦æå½å没æä»»ä½String对象å¼ç¨è¯¥å符串常éçè¯ï¼å°±è¯´æå¸¸é "abc" å°±æ¯åºå¼å¸¸éï¼å¦æè¿æ¶åçå
ååæ¶çè¯è䏿å¿
è¦çè¯ï¼"abc" å°±ä¼è¢«ç³»ç»æ¸
çåºå¸¸éæ± ã
### 2.4.9 å¦ä½å¤æä¸ä¸ªç±»æ¯æ ç¨çç±»?
æ¹æ³åºä¸»è¦åæ¶çæ¯æ ç¨çç±»ï¼é£ä¹å¦ä½å¤æä¸ä¸ªç±»æ¯æ ç¨çç±»çå¢ï¼
å¤å®ä¸ä¸ªå¸¸éæ¯å¦æ¯âåºå¼å¸¸éâæ¯è¾ç®åï¼èè¦å¤å®ä¸ä¸ªç±»æ¯å¦æ¯âæ ç¨çç±»âçæ¡ä»¶åç¸å¯¹èå»è®¸å¤ãç±»éè¦åæ¶æ»¡è¶³ä¸é¢3个æ¡ä»¶æè½ç®æ¯ **âæ ç¨çç±»â** ï¼
- 该类ææçå®ä¾é½å·²ç»è¢«åæ¶ï¼ä¹å°±æ¯ Java å ä¸ä¸åå¨è¯¥ç±»çä»»ä½å®ä¾ã
- å 载该类ç ClassLoader å·²ç»è¢«åæ¶ã
- 该类对åºç java.lang.Class 对象没æå¨ä»»ä½å°æ¹è¢«å¼ç¨ï¼æ æ³å¨ä»»ä½å°æ¹éè¿åå°è®¿é®è¯¥ç±»çæ¹æ³ã
èææºå¯ä»¥å¯¹æ»¡è¶³ä¸è¿°3个æ¡ä»¶çæ ç¨ç±»è¿è¡åæ¶ï¼è¿é说çä»
ä»
æ¯âå¯ä»¥âï¼è并䏿¯åå¯¹è±¡ä¸æ ·ä¸ä½¿ç¨äºå°±ä¼å¿
ç¶è¢«åæ¶ã
### 2.4.10 å徿¶éæåªäºç®æ³ï¼åèªçç¹ç¹ï¼

#### æ è®°-æ¸
é¤ç®æ³
ç®æ³åä¸ºâæ è®°âåâæ¸
é¤âé¶æ®µï¼é¦å
æ è®°åºææéè¦åæ¶ç对象ï¼å¨æ è®°å®æåç»ä¸åæ¶ææè¢«æ è®°ç对象ã宿¯æåºç¡çæ¶éç®æ³ï¼åç»çç®æ³é½æ¯å¯¹å
¶ä¸è¶³è¿è¡æ¹è¿å¾å°ãè¿ç§å徿¶éç®æ³ä¼å¸¦æ¥ä¸¤ä¸ªææ¾çé®é¢ï¼
1. **æçé®é¢**
2. **空é´é®é¢ï¼æ è®°æ¸
é¤åä¼äº§ç大éä¸è¿ç»çç¢çï¼**
#### å¤å¶ç®æ³
为äºè§£å³æçé®é¢ï¼âå¤å¶âæ¶éç®æ³åºç°äºãå®å¯ä»¥å°å
åå为大å°ç¸åç两åï¼æ¯æ¬¡ä½¿ç¨å
¶ä¸çä¸åãå½è¿ä¸åçå
å使ç¨å®åï¼å°±å°è¿åæ´»ç对象å¤å¶å°å¦ä¸åå»ï¼ç¶ååæä½¿ç¨ç空é´ä¸æ¬¡æ¸
çæãè¿æ ·å°±ä½¿æ¯æ¬¡çå
å忶齿¯å¯¹å
ååºé´çä¸åè¿è¡åæ¶ã
#### æ è®°-æ´çç®æ³
æ ¹æ®è年代çç¹ç¹ç¹åºçä¸ç§æ è®°ç®æ³ï¼æ è®°è¿ç¨ä»ç¶ä¸âæ è®°-æ¸
é¤âç®æ³ä¸æ ·ï¼ä½åç»æ¥éª¤ä¸æ¯ç´æ¥å¯¹å¯åæ¶å¯¹è±¡åæ¶ï¼èæ¯è®©ææåæ´»ç对象åä¸ç«¯ç§»å¨ï¼ç¶åç´æ¥æ¸
çæç«¯è¾¹ç以å¤çå
åã

#### å代æ¶éç®æ³
å½åèææºçå徿¶éé½éç¨å代æ¶éç®æ³ï¼è¿ç§ç®æ³æ²¡æä»ä¹æ°çææ³ï¼åªæ¯æ ¹æ®å¯¹è±¡åæ´»å¨æçä¸åå°å
åå为å åãä¸è¬å°javaå å为æ°ç代åè年代ï¼è¿æ ·æä»¬å°±å¯ä»¥æ ¹æ®å个年代çç¹ç¹éæ©åéçå徿¶éç®æ³ã
**æ¯å¦å¨æ°ç代ä¸ï¼æ¯æ¬¡æ¶éé½ä¼æå¤§é对象æ»å»ï¼æä»¥å¯ä»¥éæ©å¤å¶ç®æ³ï¼åªéè¦ä»åºå°é对象çå¤å¶ææ¬å°±å¯ä»¥å®ææ¯æ¬¡å徿¶éãèè年代çå¯¹è±¡åæ´»å çæ¯æ¯è¾é«çï¼è䏿²¡æé¢å¤ç空é´å¯¹å®è¿è¡åé
æ
ä¿ï¼æä»¥æä»¬å¿
é¡»éæ©âæ è®°-æ¸
é¤âæâæ è®°-æ´çâç®æ³è¿è¡å徿¶éã**
### 2.4.11 HotSpot为ä»ä¹è¦å为æ°ç代åè年代ï¼
ä¸»è¦æ¯ä¸ºäºæåGCæçãä¸é¢æå°çå代æ¶éç®æ³å·²ç»å¾å¥½çè§£éäºè¿ä¸ªé®é¢ã
### 2.4.12 常è§çåå¾åæ¶å¨æé£äº?

**å¦æè¯´æ¶éç®æ³æ¯å
ååæ¶çæ¹æ³è®ºï¼é£ä¹å徿¶éå¨å°±æ¯å
ååæ¶çå
·ä½å®ç°ã**
è½ç¶æä»¬å¯¹å个æ¶éå¨è¿è¡æ¯è¾ï¼ä½å¹¶éè¦æéåºä¸ä¸ªæå¥½çæ¶éå¨ãå 为ç¥éç°å¨ä¸ºæ¢è¿æ²¡ææå¥½çå徿¶éå¨åºç°ï¼æ´å 没æä¸è½çå徿¶éå¨ï¼**æä»¬è½åçå°±æ¯æ ¹æ®å
·ä½åºç¨åºæ¯éæ©éåèªå·±çå徿¶éå¨**ãè¯æ³ä¸ä¸ï¼å¦ææä¸ç§åæµ·ä¹å
ãä»»ä½åºæ¯ä¸é½éç¨çå®ç¾æ¶éå¨åå¨ï¼é£ä¹æä»¬çHotSpotèææºå°±ä¸ä¼å®ç°é£ä¹å¤ä¸åçå徿¶éå¨äºã
#### Serialæ¶éå¨
Serialï¼ä¸²è¡ï¼æ¶é卿¶é卿¯æåºæ¬ãå岿æ ä¹
çå徿¶éå¨äºã大家çååå°±ç¥éè¿ä¸ªæ¶é卿¯ä¸ä¸ªåçº¿ç¨æ¶éå¨äºãå®ç **âå线ç¨â** çæä¹ä¸ä»
ä»
æå³çå®åªä¼ä½¿ç¨ä¸æ¡å徿¶é线ç¨å»å®æå徿¶éå·¥ä½ï¼æ´éè¦çæ¯å®å¨è¿è¡å徿¶éå·¥ä½çæ¶åå¿
é¡»æåå
¶ä»ææçå·¥ä½çº¿ç¨ï¼ **"Stop The World"** ï¼ï¼ç´å°å®æ¶éç»æã
**æ°ç代éç¨å¤å¶ç®æ³ï¼è年代éç¨æ è®°-æ´çç®æ³ã**

èææºç设计è
们å½ç¶ç¥éStop The World带æ¥çä¸è¯ç¨æ·ä½éªï¼æä»¥å¨åç»çå徿¶éå¨è®¾è®¡ä¸åé¡¿æ¶é´å¨ä¸æç¼©çï¼ä»ç¶è¿æåé¡¿ï¼å¯»æ¾æä¼ç§çå徿¶éå¨çè¿ç¨ä»ç¶å¨ç»§ç»ï¼ã
使¯Serialæ¶éå¨ææ²¡æä¼äºå
¶ä»å徿¶éå¨çå°æ¹å¢ï¼å½ç¶æï¼å®**ç®åè髿ï¼ä¸å
¶ä»æ¶éå¨çå线ç¨ç¸æ¯ï¼**ãSerialæ¶éå¨ç±äºæ²¡æçº¿ç¨äº¤äºçå¼éï¼èªç¶å¯ä»¥è·å¾å¾é«çåçº¿ç¨æ¶éæçãSerialæ¶éå¨å¯¹äºè¿è¡å¨Client模å¼ä¸çèææºæ¥è¯´æ¯ä¸ªä¸éçéæ©ã
#### ParNewæ¶éå¨
**ParNewæ¶éå¨å
¶å®å°±æ¯Serialæ¶éå¨çå¤çº¿ç¨çæ¬ï¼é¤äºä½¿ç¨å¤çº¿ç¨è¿è¡å徿¶éå¤ï¼å
¶ä½è¡ä¸ºï¼æ§å¶åæ°ãæ¶éç®æ³ãåæ¶çç¥ççï¼åSerialæ¶éå¨å®å
¨ä¸æ ·ã**
**æ°ç代éç¨å¤å¶ç®æ³ï¼è年代éç¨æ è®°-æ´çç®æ³ã**

宿¯è®¸å¤è¿è¡å¨Server模å¼ä¸çèææºçé¦è¦éæ©ï¼é¤äºSerialæ¶éå¨å¤ï¼åªæå®è½ä¸CMSæ¶éå¨ï¼çæ£æä¹ä¸çå¹¶åæ¶éå¨ï¼åé¢ä¼ä»ç»å°ï¼é
åå·¥ä½ã
**å¹¶è¡åå¹¶åæ¦å¿µè¡¥å
ï¼**
- **å¹¶è¡ï¼Parallelï¼** ï¼æå¤æ¡å徿¶é线ç¨å¹¶è¡å·¥ä½ï¼ä½æ¤æ¶ç¨æ·çº¿ç¨ä»ç¶å¤äºçå¾
ç¶æã
- **å¹¶åï¼Concurrentï¼**ï¼æç¨æ·çº¿ç¨ä¸å徿¶é线ç¨åæ¶æ§è¡ï¼ä½ä¸ä¸å®æ¯å¹¶è¡ï¼å¯è½ä¼äº¤æ¿æ§è¡ï¼ï¼ç¨æ·ç¨åºå¨ç»§ç»è¿è¡ï¼èå徿¶éå¨è¿è¡å¨å¦ä¸ä¸ªCPUä¸ã
#### Parallel Scavengeæ¶éå¨
Parallel Scavenge æ¶éå¨ç±»ä¼¼äºParNew æ¶éå¨ã **é£ä¹å®æä»ä¹ç¹å«ä¹å¤å¢ï¼**
```
-XX:+UseParallelGC
使ç¨Parallelæ¶éå¨+ è年代串è¡
-XX:+UseParallelOldGC
使ç¨Parallelæ¶éå¨+ è年代并è¡
```
**Parallel Scavengeæ¶éå¨å
³æ³¨ç¹æ¯ååéï¼é«æççå©ç¨CPUï¼ãCMSçå徿¶éå¨çå
³æ³¨ç¹æ´å¤çæ¯ç¨æ·çº¿ç¨çåé¡¿æ¶é´ï¼æé«ç¨æ·ä½éªï¼ãæè°ååéå°±æ¯CPUä¸ç¨äºè¿è¡ç¨æ·ä»£ç çæ¶é´ä¸CPUæ»æ¶èæ¶é´çæ¯å¼ã** Parallel Scavengeæ¶é卿ä¾äºå¾å¤åæ°ä¾ç¨æ·æ¾å°æåéçåé¡¿æ¶é´ææå¤§ååéï¼å¦æå¯¹äºæ¶éå¨è¿ä½ä¸å¤ªäºè§£çè¯ï¼æå·¥ä¼ååå¨çè¯å¯ä»¥éæ©æå
å管çä¼å交ç»èææºå»å®æä¹æ¯ä¸ä¸ªä¸éçéæ©ã
**æ°ç代éç¨å¤å¶ç®æ³ï¼è年代éç¨æ è®°-æ´çç®æ³ã**

#### Serial Oldæ¶éå¨
**Serialæ¶éå¨çèå¹´ä»£çæ¬**ï¼å®åæ ·æ¯ä¸ä¸ªåçº¿ç¨æ¶éå¨ãå®ä¸»è¦æä¸¤å¤§ç¨éï¼ä¸ç§ç¨éæ¯å¨JDK1.5以å以åççæ¬ä¸ä¸Parallel Scavengeæ¶é卿é
使ç¨ï¼å¦ä¸ç§ç¨éæ¯ä½ä¸ºCMSæ¶éå¨çå夿¹æ¡ã
#### Parallel Oldæ¶éå¨
**Parallel Scavengeæ¶éå¨çèå¹´ä»£çæ¬**ã使ç¨å¤çº¿ç¨åâæ è®°-æ´çâç®æ³ã卿³¨éååé以åCPUèµæºçåºåï¼é½å¯ä»¥ä¼å
èè Parallel Scavengeæ¶éå¨åParallel Oldæ¶éå¨ã
#### CMSæ¶éå¨
**CMSï¼Concurrent Mark Sweepï¼æ¶é卿¯ä¸ç§ä»¥è·åæçåæ¶åé¡¿æ¶é´ä¸ºç®æ çæ¶éå¨ãå®èé常符å卿³¨éç¨æ·ä½éªçåºç¨ä¸ä½¿ç¨ã**
**CMSï¼Concurrent Mark Sweepï¼æ¶é卿¯HotSpotèææºç¬¬ä¸æ¬¾çæ£æä¹ä¸çå¹¶åæ¶éå¨ï¼å®ç¬¬ä¸æ¬¡å®ç°äºè®©å徿¶é线ç¨ä¸ç¨æ·çº¿ç¨ï¼åºæ¬ä¸ï¼åæ¶å·¥ä½ã**
ä»ååä¸ç**Mark Sweep**è¿ä¸¤ä¸ªè¯å¯ä»¥çåºï¼CMSæ¶é卿¯ä¸ç§ **âæ è®°-æ¸
é¤âç®æ³**å®ç°çï¼å®çè¿ä½è¿ç¨ç¸æ¯äºåé¢å ç§å徿¶é卿¥è¯´æ´å 夿ä¸äºãæ´ä¸ªè¿ç¨å为å个æ¥éª¤ï¼
- **åå§æ è®°ï¼** æåææçå
¶ä»çº¿ç¨ï¼å¹¶è®°å½ä¸ç´æ¥ä¸rootç¸è¿ç对象ï¼é度å¾å¿« ï¼
- **å¹¶åæ è®°ï¼** åæ¶å¼å¯GCåç¨æ·çº¿ç¨ï¼ç¨ä¸ä¸ªéå
ç»æå»è®°å½å¯è¾¾å¯¹è±¡ãä½å¨è¿ä¸ªé¶æ®µç»æï¼è¿ä¸ªéå
ç»æå¹¶ä¸è½ä¿è¯å
å«å½åææçå¯è¾¾å¯¹è±¡ãå ä¸ºç¨æ·çº¿ç¨å¯è½ä¼ä¸æçæ´æ°å¼ç¨åï¼æä»¥GCçº¿ç¨æ æ³ä¿è¯å¯è¾¾æ§åæç宿¶æ§ãæä»¥è¿ä¸ªç®æ³éä¼è·è¸ªè®°å½è¿äºåçå¼ç¨æ´æ°çå°æ¹ã
- **éæ°æ è®°ï¼** éæ°æ è®°é¶æ®µå°±æ¯ä¸ºäºä¿®æ£å¹¶åæ è®°æé´å ä¸ºç¨æ·ç¨åºç»§ç»è¿è¡èå¯¼è´æ 记产çåå¨çé£ä¸é¨åå¯¹è±¡çæ è®°è®°å½ï¼è¿ä¸ªé¶æ®µçåé¡¿æ¶é´ä¸è¬ä¼æ¯åå§æ è®°é¶æ®µçæ¶é´ç¨é¿ï¼è¿è¿æ¯å¹¶åæ è®°é¶æ®µæ¶é´ç
- **并忏
é¤ï¼** å¼å¯ç¨æ·çº¿ç¨ï¼åæ¶GC线ç¨å¼å§å¯¹ä¸ºæ è®°çåºå忏
æ«ã

ä»å®çååå°±å¯ä»¥çåºå®æ¯ä¸æ¬¾ä¼ç§çå徿¶éå¨ï¼ä¸»è¦ä¼ç¹ï¼**å¹¶åæ¶éãä½åé¡¿**ã使¯å®æä¸é¢ä¸ä¸ªææ¾ç缺ç¹ï¼
- **对CPUèµæºææï¼**
- **æ æ³å¤çæµ®å¨åå¾ï¼**
- **å®ä½¿ç¨çåæ¶ç®æ³-âæ è®°-æ¸
é¤âç®æ³ä¼å¯¼è´æ¶éç»ææ¶ä¼æå¤§é空é´ç¢ç产çã**
#### G1æ¶éå¨
**G1 (Garbage-First)æ¯ä¸æ¬¾é¢åæå¡å¨çå徿¶éå¨,主è¦é对é
å¤å¤é¢å¤çå¨å大容éå
åçæºå¨. 以æé«æ¦ç满足GCåé¡¿æ¶é´è¦æ±çåæ¶,è¿å
·å¤é«ååéæ§è½ç¹å¾.**
被è§ä¸ºJDK1.7ä¸HotSpotèææºçä¸ä¸ªéè¦è¿åç¹å¾ãå®å
·å¤ä¸ä¸ç¹ç¹ï¼
- **å¹¶è¡ä¸å¹¶å**ï¼G1è½å
åå©ç¨CPUã夿 ¸ç¯å¢ä¸ç硬件ä¼å¿ï¼ä½¿ç¨å¤ä¸ªCPUï¼CPUæè
CPUæ ¸å¿ï¼æ¥ç¼©çStop-The-Worldåé¡¿æ¶é´ãé¨åå
¶ä»æ¶éå¨åæ¬éè¦åé¡¿Javaçº¿ç¨æ§è¡çGCå¨ä½ï¼G1æ¶éå¨ä»ç¶å¯ä»¥éè¿å¹¶åçæ¹å¼è®©javaç¨åºç»§ç»æ§è¡ã
- **å代æ¶é**ï¼è½ç¶G1å¯ä»¥ä¸éè¦å
¶ä»æ¶éå¨é
åå°±è½ç¬ç«ç®¡çæ´ä¸ªGCå ï¼ä½æ¯è¿æ¯ä¿çäºåä»£çæ¦å¿µã
- **ç©ºé´æ´å**ï¼ä¸CMSçâæ è®°--æ¸
çâç®æ³ä¸åï¼G1仿´ä½æ¥çæ¯åºäºâæ è®°æ´çâç®æ³å®ç°çæ¶éå¨ï¼ä»å±é¨ä¸æ¥çæ¯åºäºâå¤å¶âç®æ³å®ç°çã
- **å¯é¢æµçåé¡¿**ï¼è¿æ¯G1ç¸å¯¹äºCMSçå¦ä¸ä¸ªå¤§ä¼å¿ï¼éä½åé¡¿æ¶é´æ¯G1 å CMS å
񆇆
³æ³¨ç¹ï¼ä½G1 é¤äºè¿½æ±ä½åé¡¿å¤ï¼è¿è½å»ºç«å¯é¢æµçåé¡¿æ¶é´æ¨¡åï¼è½è®©ä½¿ç¨è
æç¡®æå®å¨ä¸ä¸ªé¿åº¦ä¸ºM毫ç§çæ¶é´ç段å
ã
G1æ¶éå¨çè¿ä½å¤§è´å为以ä¸å 个æ¥éª¤ï¼
- **åå§æ è®°**
- **å¹¶åæ è®°**
- **æç»æ è®°**
- **çéåæ¶**
**G1æ¶éå¨å¨åå°ç»´æ¤äºä¸ä¸ªä¼å
åè¡¨ï¼æ¯æ¬¡æ ¹æ®å
è®¸çæ¶éæ¶é´ï¼ä¼å
鿩忶价弿大çRegion(è¿ä¹å°±æ¯å®çååGarbage-Firstçç±æ¥)**ãè¿ç§ä½¿ç¨Regionååå
å空é´ä»¥åæä¼å
级çåºååæ¶æ¹å¼ï¼ä¿è¯äºGFæ¶éå¨å¨æéæ¶é´å
å¯ä»¥å°½å¯è½é«çæ¶éæçï¼æå
ååæ´ä¸ºé¶ï¼ã
### 2.4.13 ç±»æä»¶ç»æ
#### ä»ç»ä¸ä¸ç±»æä»¶ç»æå§ï¼
æ ¹æ® Java èææºè§èï¼ç±»æä»¶ç±å个 ClassFile ç»æç»æï¼
```java
ClassFile {
u4 magic; //Class æä»¶çæ å¿
u2 minor_version;//Class çå°çæ¬å·
u2 major_version;//Class çå¤§çæ¬å·
u2 constant_pool_count;//叏鿱 çæ°é
cp_info constant_pool[constant_pool_count-1];//叏鿱
u2 access_flags;//Class çè®¿é®æ è®°
u2 this_class;//å½åç±»
u2 super_class;//ç¶ç±»
u2 interfaces_count;//æ¥å£
u2 interfaces[interfaces_count];//ä¸ä¸ªç±»å¯ä»¥å®ç°å¤ä¸ªæ¥å£
u2 fields_count;//Class æä»¶çåæ®µå±æ§
field_info fields[fields_count];//ä¸ä¸ªç±»ä¼å¯ä»¥æä¸ªå段
u2 methods_count;//Class æä»¶çæ¹æ³æ°é
method_info methods[methods_count];//ä¸ä¸ªç±»å¯ä»¥æä¸ªå¤ä¸ªæ¹æ³
u2 attributes_count;//æ¤ç±»ç屿§è¡¨ä¸ç屿§æ°
attribute_info attributes[attributes_count];//屿§è¡¨éå
}
```
**Classæä»¶åèç ç»æç»ç»ç¤ºæå¾** ï¼ä¹åå¨ç½ä¸ä¿åçï¼é常ä¸éï¼ååºå¤ä¸æï¼ï¼

ä¸é¢ä¼æç
§ä¸å¾ç»ææé¡ºåºè¯¦ç»ä»ç»ä¸ä¸ Class æä»¶ç»ææ¶åå°çä¸äºç»ä»¶ã
1. **éæ°:** ç¡®å®è¿ä¸ªæä»¶æ¯å¦ä¸ºä¸ä¸ªè½è¢«èææºæ¥æ¶ç Class æä»¶ã
2. **Class æä»¶çæ¬** ï¼Class æä»¶ççæ¬å·ï¼ä¿è¯ç¼è¯æ£å¸¸æ§è¡ã
3. **叏鿱 ** ï¼å¸¸éæ± ä¸»è¦åæ¾ä¸¤å¤§å¸¸éï¼åé¢éå符å·å¼ç¨ã
4. **è®¿é®æ å¿** ï¼æ å¿ç¨äºè¯å«ä¸äºç±»æè
æ¥å£å±æ¬¡ç访é®ä¿¡æ¯ï¼å
æ¬ï¼è¿ä¸ª Class æ¯ç±»è¿æ¯æ¥å£ï¼æ¯å¦ä¸º public æè
abstract ç±»åï¼å¦ææ¯ç±»çè¯æ¯å¦å£°æä¸º final ççã
5. **å½å类索å¼,ç¶ç±»ç´¢å¼** ï¼ç±»ç´¢å¼ç¨äºç¡®å®è¿ä¸ªç±»çå
¨éå®åï¼ç¶ç±»ç´¢å¼ç¨äºç¡®å®è¿ä¸ªç±»çç¶ç±»çå
¨éå®åï¼ç±äº Java è¯è¨çåç»§æ¿ï¼æä»¥ç¶ç±»ç´¢å¼åªæä¸ä¸ªï¼é¤äº `java.lang.Object` ä¹å¤ï¼ææç java ç±»é½æç¶ç±»ï¼å æ¤é¤äº `java.lang.Object` å¤ï¼ææ Java ç±»çç¶ç±»ç´¢å¼é½ä¸ä¸º 0ã
6. **æ¥å£ç´¢å¼éå** ï¼æ¥å£ç´¢å¼éåç¨æ¥æè¿°è¿ä¸ªç±»å®ç°äºé£äºæ¥å£ï¼è¿äºè¢«å®ç°çæ¥å£å°æ`implents`(妿è¿ä¸ªç±»æ¬èº«æ¯æ¥å£çè¯åæ¯`extends`) åçæ¥å£é¡ºåºä»å·¦å°å³æå卿¥å£ç´¢å¼éåä¸ã
7. **åæ®µè¡¨éå** ï¼æè¿°æ¥å£æç±»ä¸å£°æçåéãåæ®µå
æ¬ç±»çº§åé以åå®ä¾åéï¼ä½ä¸å
æ¬å¨æ¹æ³å
é¨å£°æçå±é¨åéã
8. **æ¹æ³è¡¨éå** ï¼ç±»ä¸çæ¹æ³ã
9. **屿§è¡¨éå** ï¼ å¨ Class æä»¶ï¼åæ®µè¡¨ï¼æ¹æ³è¡¨ä¸é½å¯ä»¥æºå¸¦èªå·±ç屿§è¡¨éåã
### 2.4.14 ç±»å è½½è¿ç¨
#### ç¥éç±»å è½½çè¿ç¨åï¼
ç±»å è½½è¿ç¨ï¼**å è½½->è¿æ¥->åå§å**ãè¿æ¥è¿ç¨åå¯åä¸ºä¸æ¥:**éªè¯->åå¤->è§£æ**ã

#### é£å è½½è¿ä¸æ¥åäºä»ä¹?
ç±»å è½½è¿ç¨çç¬¬ä¸æ¥ï¼ä¸»è¦å®æä¸é¢3ä»¶äºæ
ï¼
1. éè¿å
¨ç±»åè·åå®ä¹æ¤ç±»çäºè¿å¶åèæµ
2. å°åèæµæä»£è¡¨çéæåå¨ç»æè½¬æ¢ä¸ºæ¹æ³åºçè¿è¡æ¶æ°æ®ç»æ
3. å¨å
åä¸çæä¸ä¸ªä»£è¡¨è¯¥ç±»ç Class 对象,ä½ä¸ºæ¹æ³åºè¿äºæ°æ®ç访é®å
¥å£
èææºè§èå¤ä¸é¢è¿3ç¹å¹¶ä¸å
·ä½ï¼å æ¤æ¯éå¸¸çµæ´»çãæ¯å¦ï¼"éè¿å
¨ç±»åè·åå®ä¹æ¤ç±»çäºè¿å¶åèæµ" å¹¶æ²¡æææå
·ä½ä»åªéè·åãææ ·è·åãæ¯å¦ï¼æ¯è¾å¸¸è§çå°±æ¯ä» ZIP å
ä¸è¯»åï¼æ¥ååºç°çJARãEARãWARæ ¼å¼çåºç¡ï¼ãå
¶ä»æä»¶çæï¼å
¸ååºç¨å°±æ¯JSPï¼ççã
**ä¸ä¸ªéæ°ç»ç±»çå è½½é¶æ®µï¼å è½½é¶æ®µè·åç±»çäºè¿å¶åèæµçå¨ä½ï¼æ¯å¯æ§æ§æå¼ºçé¶æ®µï¼è¿ä¸æ¥æä»¬å¯ä»¥å»å®æè¿å¯ä»¥èªå®ä¹ç±»å è½½å¨å»æ§å¶åèæµçè·åæ¹å¼ï¼éåä¸ä¸ªç±»å è½½å¨ç `loadClass()` æ¹æ³ï¼ãæ°ç»ç±»åä¸éè¿ç±»å è½½å¨å建ï¼å®ç± Java èææºç´æ¥å建ã**
ç±»å è½½å¨ãåäº²å§æ´¾æ¨¡å乿¯é常éè¦çç¥è¯ç¹ï¼è¿é¨åå
容ä¼å¨åé¢çé®é¢ä¸åç¬ä»ç»å°ã
å è½½é¶æ®µåè¿æ¥é¶æ®µçé¨åå
容æ¯äº¤åè¿è¡çï¼å è½½é¶æ®µå°æªç»æï¼è¿æ¥é¶æ®µå¯è½å°±å·²ç»å¼å§äºã
#### ç¥éåªäºç±»å è½½å¨?
JVM ä¸å
ç½®äºä¸ä¸ªéè¦ç ClassLoaderï¼é¤äº BootstrapClassLoader å
¶ä»ç±»å è½½å¨åç± Java å®ç°ä¸å
¨é¨ç»§æ¿èª`java.lang.ClassLoader`ï¼
1. **BootstrapClassLoader(å¯å¨ç±»å è½½å¨)** ï¼æé¡¶å±çå 载类ï¼ç±C++å®ç°ï¼è´è´£å è½½ `%JAVA_HOME%/lib`ç®å½ä¸çjarå
åç±»æè
æè¢« `-Xbootclasspath`åæ°æå®çè·¯å¾ä¸çææç±»ã
2. **ExtensionClassLoader(æ©å±ç±»å è½½å¨)** ï¼ä¸»è¦è´è´£å è½½ç®å½ `%JRE_HOME%/lib/ext` ç®å½ä¸çjarå
åç±»ï¼æè¢« `java.ext.dirs` ç³»ç»åéææå®çè·¯å¾ä¸çjarå
ã
3. **AppClassLoader(åºç¨ç¨åºç±»å è½½å¨)** :é¢åæä»¬ç¨æ·çå è½½å¨ï¼è´è´£å è½½å½ååºç¨classpathä¸çææjarå
åç±»ã
#### åäº²å§æ´¾æ¨¡åç¥éåï¼è½ä»ç»ä¸ä¸å?
##### åäº²å§æ´¾æ¨¡åä»ç»
æ¯ä¸ä¸ªç±»é½æä¸ä¸ªå¯¹åºå®çç±»å è½½å¨ãç³»ç»ä¸ç ClassLoder å¨ååå·¥ä½çæ¶åä¼é»è®¤ä½¿ç¨ **åäº²å§æ´¾æ¨¡å** ãå³å¨ç±»å è½½çæ¶åï¼ç³»ç»ä¼é¦å
夿å½åç±»æ¯å¦è¢«å è½½è¿ãå·²ç»è¢«å è½½çç±»ä¼ç´æ¥è¿åï¼å¦åæä¼å°è¯å è½½ã**å è½½çæ¶åï¼é¦å
ä¼æè¯¥è¯·æ±å§æ´¾è¯¥ç¶ç±»å è½½å¨ç `loadClass()` å¤çï¼å æ¤ææçè¯·æ±æç»é½åºè¯¥ä¼ éå°é¡¶å±çå¯å¨ç±»å è½½å¨ `BootstrapClassLoader` ä¸ãå½ç¶ç±»å è½½å¨æ æ³å¤çæ¶ï¼æç±èªå·±æ¥å¤çã**å½ç¶ç±»å è½½å¨ä¸ºnullæ¶ï¼ä¼ä½¿ç¨å¯å¨ç±»å è½½å¨ `BootstrapClassLoader` ä½ä¸ºç¶ç±»å è½½å¨ã

æ¯ä¸ªç±»å è½½é½æä¸ä¸ªç¶ç±»å è½½å¨ï¼æä»¬éè¿ä¸é¢çç¨åºæ¥éªè¯ã
```java
public class ClassLoaderDemo {
public static void main(String[] args) {
System.out.println("ClassLodarDemo's ClassLoader is " + ClassLoaderDemo.class.getClassLoader());
System.out.println("The Parent of ClassLodarDemo's ClassLoader is " + ClassLoaderDemo.class.getClassLoader().getParent());
System.out.println("The GrandParent of ClassLodarDemo's ClassLoader is " + ClassLoaderDemo.class.getClassLoader().getParent().getParent());
}
}
```
Output
```
ClassLodarDemo's ClassLoader is sun.misc.Launcher$AppClassLoader@18b4aac2
The Parent of ClassLodarDemo's ClassLoader is sun.misc.Launcher$ExtClassLoader@1b6d3586
The GrandParent of ClassLodarDemo's ClassLoader is null
```
`AppClassLoader`çç¶ç±»å è½½å¨ä¸º`ExtClassLoader`
`ExtClassLoader`çç¶ç±»å è½½å¨ä¸ºnullï¼**nullå¹¶ä¸ä»£è¡¨`ExtClassLoader`没æç¶ç±»å è½½å¨ï¼èæ¯ `Bootstrap ClassLoader`** ã
å
¶å®è¿ä¸ªå亲翻è¯ç容æè®©å«äººè¯¯è§£ï¼æä»¬ä¸è¬çè§£çåäº²é½æ¯ç¶æ¯ï¼è¿éçå亲æ´å¤å°è¡¨è¾¾çæ¯âç¶æ¯è¿ä¸è¾âç人èå·²ï¼å¹¶ä¸æ¯è¯´ççæä¸ä¸ª Mather ClassLoader åä¸ä¸ª Father ClassLoader ãå¦å¤ï¼ç±»å è½½å¨ä¹é´çâç¶åâå
³ç³»ä¹ä¸æ¯éè¿ç»§æ¿æ¥ä½ç°çï¼æ¯ç±âä¼å
çº§âæ¥å³å®ã宿¹APIææ¡£å¯¹è¿é¨åçæè¿°å¦ä¸:
> The Java platform uses a delegation model for loading classes. **The basic idea is that every class loader has a "parent" class loader.** When loading a class, a class loader first "delegates" the search for the class to its parent class loader before attempting to find the class itself.
##### åäº²å§æ´¾æ¨¡åå®ç°æºç åæ
åäº²å§æ´¾æ¨¡åçå®ç°ä»£ç é常ç®åï¼é»è¾é常æ¸
æ°ï¼é½éä¸å¨ `java.lang.ClassLoader` ç `loadClass()` ä¸ï¼ç¸å
³ä»£ç å¦ä¸æç¤ºã
```java
private final ClassLoader parent;
protected Class> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// é¦å
ï¼æ£æ¥è¯·æ±çç±»æ¯å¦å·²ç»è¢«å è½½è¿
Class> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
if (parent != null) {//ç¶å è½½å¨ä¸ä¸ºç©ºï¼è°ç¨ç¶å è½½å¨loadClass()æ¹æ³å¤ç
c = parent.loadClass(name, false);
} else {//ç¶å è½½å¨ä¸ºç©ºï¼ä½¿ç¨å¯å¨ç±»å è½½å¨ BootstrapClassLoader å è½½
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
//æåºå¼å¸¸è¯´æç¶ç±»å è½½å¨æ æ³å®æå 载请æ±
}
if (c == null) {
long t1 = System.nanoTime();
//èªå·±å°è¯å è½½
c = findClass(name);
// this is the defining class loader; record the stats
sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
sun.misc.PerfCounter.getFindClasses().increment();
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
```
##### åäº²å§æ´¾æ¨¡å带æ¥äºä»ä¹å¥½å¤å¢ï¼
åäº²å§æ´¾æ¨¡åä¿è¯äºJavaç¨åºç稳å®è¿è¡ï¼å¯ä»¥é¿å
ç±»çéå¤å è½½ï¼JVM åºåä¸åç±»çæ¹å¼ä¸ä»
ä»
æ ¹æ®ç±»åï¼ç¸åçç±»æä»¶è¢«ä¸åçç±»å è½½å¨å 载产ççæ¯ä¸¤ä¸ªä¸åçç±»ï¼ï¼ä¹ä¿è¯äº Java çæ ¸å¿ API ä¸è¢«ç¯¡æ¹ã妿ä¸ç¨æ²¡æä½¿ç¨åäº²å§æ´¾æ¨¡åï¼èæ¯æ¯ä¸ªç±»å è½½å¨å è½½èªå·±çè¯å°±ä¼åºç°ä¸äºé®é¢ï¼æ¯å¦æä»¬ç¼åä¸ä¸ªç§°ä¸º `java.lang.Object` ç±»çè¯ï¼é£ä¹ç¨åºè¿è¡çæ¶åï¼ç³»ç»å°±ä¼åºç°å¤ä¸ªä¸åç `Object` ç±»ã
##### 妿æä»¬ä¸æ³ç¨åäº²å§æ´¾æ¨¡åæä¹åï¼
为äºé¿å
åäº²å§ææºå¶ï¼æä»¬å¯ä»¥èªå·±å®ä¹ä¸ä¸ªç±»å è½½å¨ï¼ç¶åéè½½ `loadClass()` å³å¯ã
##### å¦ä½èªå®ä¹ç±»å è½½å¨?
é¤äº `BootstrapClassLoader` å
¶ä»ç±»å è½½å¨åç± Java å®ç°ä¸å
¨é¨ç»§æ¿èª`java.lang.ClassLoader`ã妿æä»¬è¦èªå®ä¹èªå·±çç±»å è½½å¨ï¼å¾ææ¾éè¦ç»§æ¿ `ClassLoader`ã
------
# ä¸ è®¡ç®æºåºç¡
## 3.1 è®¡ç®æºç½ç»
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
### 3.1.1 OSIä¸TCP/IPåå±çç»æä¸åè½,齿åªäºåè®®?
å¦ä¹ è®¡ç®æºç½ç»æ¶æä»¬ä¸è¬éç¨æä¸çåæ³ï¼ä¹å°±æ¯ä¸å OSI å TCP/IP çä¼ç¹ï¼éç¨ä¸ç§åªæäºå±åè®®çä½ç³»ç»æï¼è¿æ ·æ¢ç®æ´åè½å°æ¦å¿µéè¿°æ¸
æ¥ã

ç»åäºèç½çæ
åµï¼èªä¸èä¸å°ï¼é常ç®è¦çä»ç»ä¸ä¸åå±çä½ç¨ã
#### åºç¨å±
**åºç¨å±(application-layerï¼ç任塿¯éè¿åºç¨è¿ç¨é´çäº¤äºæ¥å®æç¹å®ç½ç»åºç¨ã**åºç¨å±åè®®å®ä¹çæ¯åºç¨è¿ç¨ï¼è¿ç¨ï¼ä¸»æºä¸æ£å¨è¿è¡çç¨åºï¼é´çéä¿¡å交äºçè§åã对äºä¸åçç½ç»åºç¨éè¦ä¸åçåºç¨å±åè®®ãå¨äºèç½ä¸åºç¨å±åè®®å¾å¤ï¼å¦**ååç³»ç»DNS**ï¼æ¯æä¸ç»´ç½åºç¨ç **HTTPåè®®**ï¼æ¯æçµåé®ä»¶ç **SMTPåè®®**ççãæä»¬æåºç¨å±äº¤äºçæ°æ®åå
ç§°ä¸ºæ¥æã
**ååç³»ç»**
> ååç³»ç»(Domain Name System缩å DNSï¼Domain Name被è¯ä¸ºåå)æ¯å ç¹ç½çä¸é¡¹æ ¸å¿æå¡ï¼å®ä½ä¸ºå¯ä»¥å°åååIPå°åç¸äºæ å°çä¸ä¸ªåå¸å¼æ°æ®åºï¼è½å¤ä½¿äººæ´æ¹ä¾¿ç访é®äºèç½ï¼èä¸ç¨å»è®°ä½è½å¤è¢«æºå¨ç´æ¥è¯»åçIPæ°ä¸²ãï¼ç¾åº¦ç¾ç§ï¼ä¾å¦ï¼ä¸ä¸ªå
¬å¸ç Web ç½ç«å¯ç使¯å®å¨ç½ä¸ç鍿·ï¼èååå°±ç¸å½äºå
¶é¨çå°åï¼é常ååé½ä½¿ç¨è¯¥å
¬å¸çåç§°æç®ç§°ãä¾å¦ä¸é¢æå°ç微软å
¬å¸çååï¼ç±»ä¼¼çè¿æï¼IBM å
¬å¸çå忝 www.ibm.comãOracle å
¬å¸çå忝 www.oracle.comãCiscoå
¬å¸çå忝 www.cisco.com çã
**HTTPåè®®**
> è¶
ææ¬ä¼ è¾åè®®ï¼HTTPï¼HyperText Transfer Protocol)æ¯äºèç½ä¸åºç¨æä¸ºå¹¿æ³çä¸ç§ç½ç»åè®®ãææç WWWï¼ä¸ç»´ç½ï¼ æä»¶é½å¿
é¡»éµå®è¿ä¸ªæ åã设计 HTTP æåçç®çæ¯ä¸ºäºæä¾ä¸ç§åå¸åæ¥æ¶ HTML 页é¢çæ¹æ³ãï¼ç¾åº¦ç¾ç§ï¼
#### è¿è¾å±
**è¿è¾å±(transport layer)ç主è¦ä»»å¡å°±æ¯è´è´£å两å°ä¸»æºè¿ç¨ä¹é´çéä¿¡æä¾éç¨çæ°æ®ä¼ è¾æå¡**ãåºç¨è¿ç¨å©ç¨è¯¥æå¡ä¼ éåºç¨å±æ¥æãâéç¨çâæ¯æå¹¶ä¸é对æä¸ä¸ªç¹å®çç½ç»åºç¨ï¼èæ¯å¤ç§åºç¨å¯ä»¥ä½¿ç¨åä¸ä¸ªè¿è¾å±æå¡ãç±äºä¸å°ä¸»æºå¯åæ¶è¿è¡å¤ä¸ªçº¿ç¨ï¼å æ¤è¿è¾å±æå¤ç¨ååç¨çåè½ãæè°å¤ç¨å°±æ¯æå¤ä¸ªåºç¨å±è¿ç¨å¯åæ¶ä½¿ç¨ä¸é¢è¿è¾å±çæå¡ï¼åç¨åå¤ç¨ç¸åï¼æ¯è¿è¾å±ææ¶å°çä¿¡æ¯åå«äº¤ä»ä¸é¢åºç¨å±ä¸çç¸åºè¿ç¨ã
**è¿è¾å±ä¸»è¦ä½¿ç¨ä»¥ä¸ä¸¤ç§åè®®:**
1. **ä¼ è¾æ§å¶åè®® TCP**ï¼Transmission Control Protocolï¼--æä¾**é¢åè¿æ¥**çï¼**å¯é ç**æ°æ®ä¼ è¾æå¡ã
2. **ç¨æ·æ°æ®åè®® UDP**ï¼User Datagram Protocolï¼--æä¾**æ è¿æ¥**çï¼å°½æå¤§åªåçæ°æ®ä¼ è¾æå¡ï¼**ä¸ä¿è¯æ°æ®ä¼ è¾çå¯é æ§**ï¼ã
**TCP ä¸ UDP ç对æ¯è§é®é¢ä¸ã**
#### ç½ç»å±
**å¨ è®¡ç®æºç½ç»ä¸è¿è¡éä¿¡çä¸¤ä¸ªè®¡ç®æºä¹é´å¯è½ä¼ç»è¿å¾å¤ä¸ªæ°æ®é¾è·¯ï¼ä¹å¯è½è¿è¦ç»è¿å¾å¤éä¿¡åç½ãç½ç»å±çä»»å¡å°±æ¯éæ©åéçç½é´è·¯ç±å交æ¢ç»ç¹ï¼ ç¡®ä¿æ°æ®åæ¶ä¼ éã** å¨åéæ°æ®æ¶ï¼ç½ç»å±æè¿è¾å±äº§ççæ¥ææ®µæç¨æ·æ°æ®æ¥å°è£
æåç»åå
è¿è¡ä¼ éãå¨ TCP/IP ä½ç³»ç»æä¸ï¼ç±äºç½ç»å±ä½¿ç¨ **IP åè®®**ï¼å æ¤åç»ä¹å« **IP æ°æ®æ¥** ï¼ç®ç§° **æ°æ®æ¥**ã
è¿éè¦æ³¨æï¼**ä¸è¦æè¿è¾å±çâç¨æ·æ°æ®æ¥ UDP âåç½ç»å±çâ IP æ°æ®æ¥â弿··**ãå¦å¤ï¼æ 论æ¯åªä¸å±çæ°æ®åå
ï¼é½å¯ç¬¼ç»å°ç¨âåç»âæ¥è¡¨ç¤ºã
è¿éå¼ºè°æåºï¼ç½ç»å±ä¸çâç½ç»âäºåå·²ç»ä¸æ¯æä»¬é常è°å°çå
·ä½ç½ç»ï¼èæ¯æè®¡ç®æºç½ç»ä½ç³»ç»ææ¨¡åä¸ç¬¬ä¸å±çåç§°.
äºèç½æ¯ç±å¤§éç弿ï¼heterogeneousï¼ç½ç»éè¿è·¯ç±å¨ï¼routerï¼ç¸äºè¿æ¥èµ·æ¥çãäºèç½ä½¿ç¨çç½ç»å±åè®®æ¯æ è¿æ¥çç½é
åè®®ï¼Intert Protocolï¼å许å¤è·¯ç±éæ©åè®®ï¼å æ¤äºèç½çç½ç»å±ä¹å«å**ç½é
å±**æ**IPå±**ã
#### æ°æ®é¾è·¯å±
**æ°æ®é¾è·¯å±(data link layer)é常ç®ç§°ä¸ºé¾è·¯å±ã两å°ä¸»æºä¹é´çæ°æ®ä¼ è¾ï¼æ»æ¯å¨ä¸æ®µä¸æ®µçé¾è·¯ä¸ä¼ éçï¼è¿å°±éè¦ä½¿ç¨ä¸é¨çé¾è·¯å±çåè®®ã** å¨ä¸¤ä¸ªç¸é»èç¹ä¹é´ä¼ éæ°æ®æ¶ï¼**æ°æ®é¾è·¯å±å°ç½ç»å±äº¤ä¸æ¥ç IP æ°æ®æ¥ç»è£
æå¸§**ï¼å¨ä¸¤ä¸ªç¸é»èç¹é´çé¾è·¯ä¸ä¼ éå¸§ãæ¯ä¸å¸§å
æ¬æ°æ®åå¿
è¦çæ§å¶ä¿¡æ¯ï¼å¦åæ¥ä¿¡æ¯ï¼å°åä¿¡æ¯ï¼å·®éæ§å¶çï¼ã
卿¥æ¶æ°æ®æ¶ï¼æ§å¶ä¿¡æ¯ä½¿æ¥æ¶ç«¯è½å¤ç¥éä¸ä¸ªå¸§ä»åªä¸ªæ¯ç¹å¼å§åå°åªä¸ªæ¯ç¹ç»æãè¿æ ·ï¼æ°æ®é¾è·¯å±å¨æ¶å°ä¸ä¸ªå¸§åï¼å°±å¯ä»ä¸æåºæ°æ®é¨åï¼ä¸äº¤ç»ç½ç»å±ã
æ§å¶ä¿¡æ¯è¿ä½¿æ¥æ¶ç«¯è½å¤æ£æµå°ææ¶å°çå¸§ä¸æè¯¯å·®éã妿åç°å·®éï¼æ°æ®é¾è·¯å±å°±ç®åå°ä¸¢å¼è¿ä¸ªåºäºå·®éç帧ï¼ä»¥é¿å
ç»§ç»å¨ç½ç»ä¸ä¼ éä¸å»ç½ç½æµªè´¹ç½ç»èµæºã妿éè¦æ¹æ£æ°æ®å¨é¾è·¯å±ä¼ è¾æ¶åºç°å·®éï¼è¿å°±æ¯è¯´ï¼æ°æ®é¾è·¯å±ä¸ä»
è¦æ£éï¼èä¸è¿è¦çº éï¼ï¼é£ä¹å°±è¦éç¨å¯é æ§ä¼ è¾åè®®æ¥çº æ£åºç°çå·®éãè¿ç§æ¹æ³ä¼ä½¿é¾è·¯å±çåè®®å¤æäºã
#### ç©çå±
å¨ç©çå±ä¸æä¼ éçæ°æ®å使¯æ¯ç¹ã
**ç©çå±(physical layer)çä½ç¨æ¯å®ç°ç¸é»è®¡ç®æºèç¹ä¹é´æ¯ç¹æµçéæä¼ éï¼å°½å¯è½å±è½æå
·ä½ä¼ è¾ä»è´¨åç©ç设å¤çå·®å¼ã** 使å
¶ä¸é¢çæ°æ®é¾è·¯å±ä¸å¿
èèç½ç»çå
·ä½ä¼ è¾ä»è´¨æ¯ä»ä¹ãâéæä¼ éæ¯ç¹æµâ表示ç»å®é
çµè·¯ä¼ éåçæ¯ç¹æµæ²¡æåçååï¼å¯¹ä¼ éçæ¯ç¹æµæ¥è¯´ï¼è¿ä¸ªçµè·¯å¥½åæ¯çä¸è§çã
å¨äºèç½ä½¿ç¨çåç§å䏿éè¦åæèåçå°±æ¯ TCP/IP 两个åè®®ãç°å¨äººä»¬ç»å¸¸æå°çTCP/IPå¹¶ä¸ä¸å®åæTCPåIPè¿ä¸¤ä¸ªå
·ä½çåè®®ï¼èå¾å¾è¡¨ç¤ºäºèç½æä½¿ç¨çæ´ä¸ªTCP/IPåè®®æã
#### æ»ç»ä¸ä¸
ä¸é¢æä»¬å¯¹è®¡ç®æºç½ç»çäºå±ä½ç³»ç»ææäºåæ¥çäºè§£ï¼ä¸é¢ééä¸å¼ ä¸å±ä½ç³»ç»æå¾æ»ç»ä¸ä¸ãå¾çæ¥æºï¼https://blog.csdn.net/yaopeng_2005/article/details/7064869

### 3.1.2 TCP 䏿¬¡æ¡æå忬¡æ¥æ(é¢è¯å¸¸å®¢)
为äºåç¡®æ è¯¯å°ææ°æ®éè¾¾ç®æ å¤ï¼TCPåè®®éç¨äºä¸æ¬¡æ¡æçç¥ã
#### TCP 䏿¬¡æ¡ææ¼«ç»å¾è§£
å¦ä¸å¾æç¤ºï¼ä¸é¢ç两个æºå¨äººéè¿3æ¬¡æ¡æç¡®å®äºå¯¹æ¹è½æ£ç¡®æ¥æ¶ååéæ¶æ¯(å¾çæ¥æºï¼ãå¾è§£HTTPã)ã

**ç®å示æå¾ï¼**

- 客æ·ç«¯âåé带æ SYN æ å¿çæ°æ®å
â䏿¬¡æ¡æâæå¡ç«¯
- æå¡ç«¯âåé带æ SYN/ACK æ å¿çæ°æ®å
âäºæ¬¡æ¡æâ客æ·ç«¯
- 客æ·ç«¯âåé带æå¸¦æ ACK æ å¿çæ°æ®å
â䏿¬¡æ¡æâæå¡ç«¯
#### 为ä»ä¹è¦ä¸æ¬¡æ¡æ
**䏿¬¡æ¡æçç®çæ¯å»ºç«å¯é çéä¿¡ä¿¡éï¼è¯´å°é讯ï¼ç®åæ¥è¯´å°±æ¯æ°æ®çåé䏿¥æ¶ï¼è䏿¬¡æ¡ææä¸»è¦çç®çå°±æ¯åæ¹ç¡®è®¤èªå·±ä¸å¯¹æ¹çåé䏿¥æ¶æ¯æ£å¸¸çã**
ç¬¬ä¸æ¬¡æ¡æï¼Client ä»ä¹é½ä¸è½ç¡®è®¤ï¼Server 确认äºå¯¹æ¹å鿣叏ï¼èªå·±æ¥æ¶æ£å¸¸
ç¬¬äºæ¬¡æ¡æï¼Client 确认äºï¼èªå·±åéãæ¥æ¶æ£å¸¸ï¼å¯¹æ¹åéãæ¥æ¶æ£å¸¸ï¼Server 确认äºï¼å¯¹æ¹å鿣叏ï¼èªå·±æ¥æ¶æ£å¸¸
ç¬¬ä¸æ¬¡æ¡æï¼Client 确认äºï¼èªå·±åéãæ¥æ¶æ£å¸¸ï¼å¯¹æ¹åéãæ¥æ¶æ£å¸¸ï¼Server 确认äºï¼èªå·±åéãæ¥æ¶æ£å¸¸ï¼å¯¹æ¹åéãæ¥æ¶æ£å¸¸
æä»¥ä¸æ¬¡æ¡æå°±è½ç¡®è®¤ååæ¶ååè½é½æ£å¸¸ï¼ç¼ºä¸ä¸å¯ã
#### 为ä»ä¹è¦ä¼ å SYN
æ¥æ¶ç«¯ä¼ ååé端æåéç SYN æ¯ä¸ºäºåè¯åéç«¯ï¼ææ¥æ¶å°çä¿¡æ¯ç¡®å®å°±æ¯ä½ æåéçä¿¡å·äºã
> SYN æ¯ TCP/IP 建ç«è¿æ¥æ¶ä½¿ç¨çæ¡æä¿¡å·ãå¨å®¢æ·æºåæå¡å¨ä¹é´å»ºç«æ£å¸¸ç TCP ç½ç»è¿æ¥æ¶ï¼å®¢æ·æºé¦å
ååºä¸ä¸ª SYN æ¶æ¯ï¼æå¡å¨ä½¿ç¨ SYN-ACK åºçè¡¨ç¤ºæ¥æ¶å°äºè¿ä¸ªæ¶æ¯ï¼æåå®¢æ·æºå以 ACK(Acknowledgement[æ±è¯ï¼ç¡®è®¤å符 ,卿°æ®éä¿¡ä¼ è¾ä¸ï¼æ¥æ¶ç«åç»åéç«çä¸ç§ä¼ è¾æ§å¶å符ãå®è¡¨ç¤ºç¡®è®¤åæ¥çæ°æ®å·²ç»æ¥åæ 误ã ]ï¼æ¶æ¯ååºãè¿æ ·å¨å®¢æ·æºåæå¡å¨ä¹é´æè½å»ºç«èµ·å¯é çTCPè¿æ¥ï¼æ°æ®æå¯ä»¥å¨å®¢æ·æºåæå¡å¨ä¹é´ä¼ éã
#### ä¼ äº SYN,为å¥è¿è¦ä¼ ACK
åæ¹éä¿¡æ 误å¿
é¡»æ¯ä¸¤è
äºç¸åéä¿¡æ¯é½æ 误ãä¼ äº SYNï¼è¯æå鿹尿¥æ¶æ¹çééæ²¡æé®é¢ï¼ä½æ¯æ¥æ¶æ¹å°åéæ¹çééè¿éè¦ ACK ä¿¡å·æ¥è¿è¡éªè¯ã

æå¼ä¸ä¸ª TCP è¿æ¥åéè¦â忬¡æ¥æâï¼
- 客æ·ç«¯-åéä¸ä¸ª FINï¼ç¨æ¥å
³é客æ·ç«¯å°æå¡å¨çæ°æ®ä¼ é
- æå¡å¨-æ¶å°è¿ä¸ª FINï¼å®ååä¸ ä¸ª ACKï¼ç¡®è®¤åºå·ä¸ºæ¶å°çåºå·å 1 ãå SYN 䏿 ·ï¼ä¸ä¸ª FIN å°å ç¨ä¸ä¸ªåºå·
- æå¡å¨-å
³éä¸å®¢æ·ç«¯çè¿æ¥ï¼åéä¸ä¸ªFINç»å®¢æ·ç«¯
- 客æ·ç«¯-åå ACK æ¥æç¡®è®¤ï¼å¹¶å°ç¡®è®¤åºå·è®¾ç½®ä¸ºæ¶å°åºå·å 1
#### 为ä»ä¹è¦åæ¬¡æ¥æ
ä»»ä½ä¸æ¹é½å¯ä»¥å¨æ°æ®ä¼ éç»æåååºè¿æ¥éæ¾çéç¥ï¼å¾
对æ¹ç¡®è®¤åè¿å
¥åå
³éç¶æãå½å¦ä¸æ¹ä¹æ²¡ææ°æ®ååéçæ¶åï¼åååºè¿æ¥éæ¾éç¥ï¼å¯¹æ¹ç¡®è®¤åå°±å®å
¨å
³éäºTCPè¿æ¥ã
举个ä¾åï¼A å B æçµè¯ï¼éè¯å³å°ç»æåï¼A è¯´âææ²¡å¥è¦è¯´çäºâï¼Båçâæç¥éäºâï¼ä½æ¯ B å¯è½è¿ä¼æè¦è¯´çè¯ï¼A ä¸è½è¦æ± B è·çèªå·±çèå¥ç»æéè¯ï¼äºæ¯ B å¯è½åå·´æå·´æè¯´äºä¸éï¼æå B 说âæè¯´å®äºâï¼A åçâç¥éäºâï¼è¿æ ·éè¯æç®ç»æã
ä¸é¢è®²çæ¯è¾æ¦æ¬ï¼æ¨èä¸ç¯è®²çæ¯è¾ç»è´çæç« ï¼[https://blog.csdn.net/qzcsu/article/details/72861891](https://blog.csdn.net/qzcsu/article/details/72861891)
### 3.1.2 TCP,UDP åè®®çåºå«

UDP å¨ä¼ éæ°æ®ä¹åä¸éè¦å
建ç«è¿æ¥ï¼è¿å°ä¸»æºå¨æ¶å° UDP æ¥æåï¼ä¸éè¦ç»åºä»»ä½ç¡®è®¤ãè½ç¶ UDP 䏿ä¾å¯é 交ä»ï¼ä½å¨æäºæ
åµä¸ UDP ç¡®æ¯ä¸ç§æææç工使¹å¼ï¼ä¸è¬ç¨äºå³æ¶éä¿¡ï¼ï¼æ¯å¦ï¼ QQ è¯é³ã QQ è§é¢ ãç´æçç
TCP æä¾é¢åè¿æ¥çæå¡ãå¨ä¼ éæ°æ®ä¹åå¿
é¡»å
建ç«è¿æ¥ï¼æ°æ®ä¼ éç»æåè¦éæ¾è¿æ¥ã TCP 䏿ä¾å¹¿ææå¤ææå¡ãç±äº TCP è¦æä¾å¯é çï¼é¢åè¿æ¥çä¼ è¾æå¡ï¼TCPçå¯é ä½ç°å¨TCPå¨ä¼ éæ°æ®ä¹åï¼ä¼æä¸æ¬¡æ¡ææ¥å»ºç«è¿æ¥ï¼èä¸å¨æ°æ®ä¼ éæ¶ï¼æç¡®è®¤ãçªå£ãéä¼ ãæ¥å¡æ§å¶æºå¶ï¼å¨æ°æ®ä¼ å®åï¼è¿ä¼æå¼è¿æ¥ç¨æ¥è约系ç»èµæºï¼ï¼è¿ä¸é¾ä»¥é¿å
å¢å äºè®¸å¤å¼éï¼å¦ç¡®è®¤ï¼æµéæ§å¶ï¼è®¡æ¶å¨ä»¥åè¿æ¥ç®¡ççãè¿ä¸ä»
使åè®®æ°æ®åå
çé¦é¨å¢å¤§å¾å¤ï¼è¿è¦å ç¨è®¸å¤å¤çæºèµæºãTCP ä¸è¬ç¨äºæä»¶ä¼ è¾ãåé忥æ¶é®ä»¶ãè¿ç¨ç»å½çåºæ¯ã
### 3.1.3 TCP åè®®å¦ä½ä¿è¯å¯é ä¼ è¾
1. åºç¨æ°æ®è¢«å岿 TCP 认为æéååéçæ°æ®åã
2. TCP ç»åéçæ¯ä¸ä¸ªå
è¿è¡ç¼å·ï¼æ¥æ¶æ¹å¯¹æ°æ®å
è¿è¡æåºï¼ææåºæ°æ®ä¼ éç»åºç¨å±ã
3. **æ ¡éªåï¼** TCP å°ä¿æå®é¦é¨åæ°æ®çæ£éªåãè¿æ¯ä¸ä¸ªç«¯å°ç«¯çæ£éªåï¼ç®çæ¯æ£æµæ°æ®å¨ä¼ è¾è¿ç¨ä¸çä»»ä½ååã妿æ¶å°æ®µçæ£éªåæå·®éï¼TCP å°ä¸¢å¼è¿ä¸ªæ¥ææ®µåä¸ç¡®è®¤æ¶å°æ¤æ¥ææ®µã
4. TCP çæ¥æ¶ç«¯ä¼ä¸¢å¼éå¤çæ°æ®ã
5. **æµéæ§å¶ï¼** TCP è¿æ¥çæ¯ä¸æ¹é½æåºå®å¤§å°çç¼å²ç©ºé´ï¼TCPçæ¥æ¶ç«¯åªå
许åé端å鿥æ¶ç«¯ç¼å²åºè½æ¥çº³çæ°æ®ã彿¥æ¶æ¹æ¥ä¸åå¤çåéæ¹çæ°æ®ï¼è½æç¤ºåéæ¹éä½åéçéçï¼é²æ¢å
丢失ãTCP 使ç¨çæµéæ§å¶åè®®æ¯å¯å大å°çæ»å¨çªå£åè®®ã ï¼TCP å©ç¨æ»å¨çªå£å®ç°æµéæ§å¶ï¼
6. **æ¥å¡æ§å¶ï¼** å½ç½ç»æ¥å¡æ¶ï¼åå°æ°æ®çåéã
7. **ARQåè®®ï¼** 乿¯ä¸ºäºå®ç°å¯é ä¼ è¾çï¼å®çåºæ¬åçå°±æ¯æ¯åå®ä¸ä¸ªåç»å°±åæ¢åéï¼çå¾
对æ¹ç¡®è®¤ã卿¶å°ç¡®è®¤åååä¸ä¸ä¸ªåç»ã
8. **è¶
æ¶éä¼ ï¼** å½ TCP ååºä¸ä¸ªæ®µåï¼å®å¯å¨ä¸ä¸ªå®æ¶å¨ï¼çå¾
ç®ç端确认æ¶å°è¿ä¸ªæ¥ææ®µã妿ä¸è½åæ¶æ¶å°ä¸ä¸ªç¡®è®¤ï¼å°éåè¿ä¸ªæ¥ææ®µã
### 3.1.4 ARQåè®®
**èªå¨éä¼ è¯·æ±**ï¼Automatic Repeat-reQuestï¼ARQï¼æ¯OSI模å䏿°æ®é¾è·¯å±åä¼ è¾å±çéè¯¯çº æ£åè®®ä¹ä¸ãå®éè¿ä½¿ç¨ç¡®è®¤åè¶
æ¶è¿ä¸¤ä¸ªæºå¶ï¼å¨ä¸å¯é æå¡çåºç¡ä¸å®ç°å¯é çä¿¡æ¯ä¼ è¾ã妿åéæ¹å¨åéå䏿®µæ¶é´ä¹å
æ²¡ææ¶å°ç¡®è®¤å¸§ï¼å®é常ä¼éæ°åéãARQå
æ¬åæ¢çå¾
ARQåè®®åè¿ç»ARQåè®®ã
#### 忢çå¾
ARQåè®®
- 忢çå¾
åè®®æ¯ä¸ºäºå®ç°å¯é ä¼ è¾çï¼å®çåºæ¬åçå°±æ¯æ¯åå®ä¸ä¸ªåç»å°±åæ¢åéï¼çå¾
对æ¹ç¡®è®¤ï¼åå¤ACKï¼ã妿è¿äºä¸æ®µæ¶é´ï¼è¶
æ¶æ¶é´åï¼ï¼è¿æ¯æ²¡ææ¶å° ACK 确认ï¼è¯´ææ²¡æåéæåï¼éè¦éæ°åéï¼ç´å°æ¶å°ç¡®è®¤åååä¸ä¸ä¸ªåç»ï¼
- å¨åæ¢çå¾
åè®®ä¸ï¼è¥æ¥æ¶æ¹æ¶å°éå¤åç»ï¼å°±ä¸¢å¼è¯¥åç»ï¼ä½åæ¶è¿è¦åé确认ï¼
**ä¼ç¹ï¼** ç®å
**缺ç¹ï¼** ä¿¡éå©ç¨çä½ï¼çå¾
æ¶é´é¿
**1) æ å·®éæ
åµ:**
åéæ¹åéåç»,æ¥æ¶æ¹å¨è§å®æ¶é´å
æ¶å°,å¹¶ä¸åå¤ç¡®è®¤.å鿹忬¡åéã
**2) åºç°å·®éæ
åµï¼è¶
æ¶éä¼ ï¼:**
忢çå¾
åè®®ä¸è¶
æ¶éä¼ æ¯æåªè¦è¶
è¿ä¸æ®µæ¶é´ä»ç¶æ²¡ææ¶å°ç¡®è®¤ï¼å°±éä¼ åé¢åéè¿çåç»ï¼è®¤ä¸ºåæåéè¿çåç»ä¸¢å¤±äºï¼ãå æ¤æ¯åéå®ä¸ä¸ªåç»éè¦è®¾ç½®ä¸ä¸ªè¶
æ¶è®¡æ¶å¨ï¼å
¶éä¼ æ¶é´åºæ¯æ°æ®å¨åç»ä¼ è¾çå¹³åå¾è¿æ¶é´æ´é¿ä¸äºãè¿ç§èªå¨éä¼ æ¹å¼å¸¸ç§°ä¸º **èªå¨éä¼ è¯·æ± ARQ** ãå¦å¤å¨åæ¢çå¾
åè®®ä¸è¥æ¶å°éå¤åç»ï¼å°±ä¸¢å¼è¯¥åç»ï¼ä½åæ¶è¿è¦åé确认ã**è¿ç» ARQ åè®®** 坿é«ä¿¡éå©ç¨çãåéç»´æä¸ä¸ªåéçªå£ï¼å¡ä½äºåéçªå£å
çåç»å¯è¿ç»åéåºå»ï¼èä¸éè¦çå¾
对æ¹ç¡®è®¤ãæ¥æ¶æ¹ä¸è¬éç¨ç´¯ç§¯ç¡®è®¤ï¼å¯¹æåºå°è¾¾çæåä¸ä¸ªåç»åé确认ï¼è¡¨æå°è¿ä¸ªåç»ä½ç½®çææåç»é½å·²ç»æ£ç¡®æ¶å°äºã
**3) 确认丢失å确认è¿å°**
- **确认丢失** ï¼ç¡®è®¤æ¶æ¯å¨ä¼ è¾è¿ç¨ä¸¢å¤±ãå½AåéM1æ¶æ¯ï¼Bæ¶å°åï¼BåAåéäºä¸ä¸ªM1ç¡®è®¤æ¶æ¯ï¼ä½å´å¨ä¼ è¾è¿ç¨ä¸ä¸¢å¤±ãèAå¹¶ä¸ç¥éï¼å¨è¶
æ¶è®¡æ¶è¿åï¼Aéä¼ M1æ¶æ¯ï¼B忬¡æ¶å°è¯¥æ¶æ¯åéå以ä¸ä¸¤ç¹æªæ½ï¼1. 丢å¼è¿ä¸ªéå¤çM1æ¶æ¯ï¼ä¸åä¸å±äº¤ä»ã 2. åAåéç¡®è®¤æ¶æ¯ãï¼ä¸ä¼è®¤ä¸ºå·²ç»åéè¿äºï¼å°±ä¸ååéãAè½éä¼ ï¼å°±è¯æBçç¡®è®¤æ¶æ¯ä¸¢å¤±ï¼ã
- **确认è¿å°** ï¼ç¡®è®¤æ¶æ¯å¨ä¼ è¾è¿ç¨ä¸è¿å°ãAåéM1æ¶æ¯ï¼Bæ¶å°å¹¶åé确认ãå¨è¶
æ¶æ¶é´å
æ²¡ææ¶å°ç¡®è®¤æ¶æ¯ï¼Aéä¼ M1æ¶æ¯ï¼Bä»ç¶æ¶å°å¹¶ç»§ç»åéç¡®è®¤æ¶æ¯ï¼Bæ¶å°äº2份M1ï¼ãæ¤æ¶Aæ¶å°äºBç¬¬äºæ¬¡åéçç¡®è®¤æ¶æ¯ãæ¥çåéå
¶ä»æ°æ®ãè¿äºä¸ä¼ï¼Aæ¶å°äºBç¬¬ä¸æ¬¡åéç对M1çç¡®è®¤æ¶æ¯ï¼A乿¶å°äº2ä»½ç¡®è®¤æ¶æ¯ï¼ãå¤çå¦ä¸ï¼1. Aæ¶å°éå¤ç确认åï¼ç´æ¥ä¸¢å¼ã2. Bæ¶å°éå¤çM1åï¼ä¹ç´æ¥ä¸¢å¼éå¤çM1ã
#### è¿ç»ARQåè®®
è¿ç» ARQ åè®®å¯æé«ä¿¡éå©ç¨çãåéæ¹ç»´æä¸ä¸ªåéçªå£ï¼å¡ä½äºåéçªå£å
çåç»å¯ä»¥è¿ç»åéåºå»ï¼èä¸éè¦çå¾
对æ¹ç¡®è®¤ãæ¥æ¶æ¹ä¸è¬éç¨ç´¯è®¡ç¡®è®¤ï¼å¯¹æåºå°è¾¾çæåä¸ä¸ªåç»åé确认ï¼è¡¨æå°è¿ä¸ªåç»ä¸ºæ¢çææåç»é½å·²ç»æ£ç¡®æ¶å°äºã
**ä¼ç¹ï¼** ä¿¡éå©ç¨çé«ï¼å®¹æå®ç°ï¼å³ä½¿ç¡®è®¤ä¸¢å¤±ï¼ä¹ä¸å¿
éä¼ ã
**缺ç¹ï¼** ä¸è½ååéæ¹åæ åºæ¥æ¶æ¹å·²ç»æ£ç¡®æ¶å°çææåç»çä¿¡æ¯ã æ¯å¦ï¼åéæ¹åéäº 5æ¡ æ¶æ¯ï¼ä¸é´ç¬¬ä¸æ¡ä¸¢å¤±ï¼3å·ï¼ï¼è¿æ¶æ¥æ¶æ¹åªè½å¯¹å两个åé确认ãåéæ¹æ æ³ç¥éåä¸ä¸ªåç»çä¸è½ï¼èåªå¥½æåä¸ä¸ªå
¨é¨éä¼ ä¸æ¬¡ãè¿ä¹å« Go-Back-Nï¼åé Nï¼ï¼è¡¨ç¤ºéè¦é忥éä¼ å·²ç»åéè¿ç N ä¸ªæ¶æ¯ã
### 3.1.5 æ»å¨çªå£åæµéæ§å¶
**TCP å©ç¨æ»å¨çªå£å®ç°æµéæ§å¶ãæµéæ§å¶æ¯ä¸ºäºæ§å¶åéæ¹åééçï¼ä¿è¯æ¥æ¶æ¹æ¥å¾åæ¥æ¶ã** æ¥æ¶æ¹åéçç¡®è®¤æ¥æä¸ççªå£å段å¯ä»¥ç¨æ¥æ§å¶åéæ¹çªå£å¤§å°ï¼ä»èå½±ååéæ¹çåééçãå°çªå£å段设置为 0ï¼ååéæ¹ä¸è½åéæ°æ®ã
### 3.1.6 æ¥å¡æ§å¶
å¨ææ®µæ¶é´ï¼è¥å¯¹ç½ç»ä¸æä¸èµæºçéæ±è¶
è¿äºè¯¥èµæºæè½æä¾çå¯ç¨é¨åï¼ç½ç»çæ§è½å°±è¦ååãè¿ç§æ
åµå°±å«æ¥å¡ãæ¥å¡æ§å¶å°±æ¯ä¸ºäºé²æ¢è¿å¤çæ°æ®æ³¨å
¥å°ç½ç»ä¸ï¼è¿æ ·å°±å¯ä»¥ä½¿ç½ç»ä¸çè·¯ç±å¨æé¾è·¯ä¸è´è¿è½½ãæ¥å¡æ§å¶æè¦åç齿ä¸ä¸ªåæï¼å°±æ¯ç½ç»è½å¤æ¿åç°æçç½ç»è´è·ãæ¥å¡æ§å¶æ¯ä¸ä¸ªå
¨å±æ§çè¿ç¨ï¼æ¶åå°ææç主æºï¼ææçè·¯ç±å¨ï¼ä»¥åä¸éä½ç½ç»ä¼ è¾æ§è½æå
³çææå ç´ ãç¸åï¼æµéæ§å¶å¾å¾æ¯ç¹å¯¹ç¹éä¿¡éçæ§å¶ï¼æ¯ä¸ªç«¯å°ç«¯çé®é¢ãæµéæ§å¶æè¦åå°çå°±æ¯æå¶åé端åéæ°æ®çéçï¼ä»¥ä¾¿ä½¿æ¥æ¶ç«¯æ¥å¾åæ¥æ¶ã
为äºè¿è¡æ¥å¡æ§å¶ï¼TCP åéæ¹è¦ç»´æä¸ä¸ª **æ¥å¡çªå£(cwnd)** çç¶æåéãæ¥å¡æ§å¶çªå£ç大å°åå³äºç½ç»çæ¥å¡ç¨åº¦ï¼å¹¶ä¸å¨æååãåéæ¹è®©èªå·±çåéçªå£å为æ¥å¡çªå£åæ¥æ¶æ¹çæ¥åçªå£ä¸è¾å°çä¸ä¸ªã
TCPçæ¥å¡æ§å¶éç¨äºåç§ç®æ³ï¼å³ **æ
¢å¼å§** ã **æ¥å¡é¿å
** ã**å¿«éä¼ ** å **å¿«æ¢å¤**ãå¨ç½ç»å±ä¹å¯ä»¥ä½¿è·¯ç±å¨éç¨éå½çåç»ä¸¢å¼çç¥ï¼å¦ä¸»å¨éå管ç AQMï¼ï¼ä»¥åå°ç½ç»æ¥å¡çåçã
- **æ
¢å¼å§ï¼** æ
¢å¼å§ç®æ³çæè·¯æ¯å½ä¸»æºå¼å§åéæ°æ®æ¶ï¼å¦æç«å³æå¤§éæ°æ®åèæ³¨å
¥å°ç½ç»ï¼é£ä¹å¯è½ä¼å¼èµ·ç½ç»é»å¡ï¼å 为ç°å¨è¿ä¸ç¥éç½ç»ç符åæ
åµãç»éªè¡¨æï¼è¾å¥½çæ¹æ³æ¯å
æ¢æµä¸ä¸ï¼å³ç±å°å°å¤§éæ¸å¢å¤§åéçªå£ï¼ä¹å°±æ¯ç±å°å°å¤§éæ¸å¢å¤§æ¥å¡çªå£æ°å¼ãcwndåå§å¼ä¸º1ï¼æ¯ç»è¿ä¸ä¸ªä¼ æè½®æ¬¡ï¼cwndå åã
- **æ¥å¡é¿å
ï¼** æ¥å¡é¿å
ç®æ³çæè·¯æ¯è®©æ¥å¡çªå£cwndç¼æ
¢å¢å¤§ï¼å³æ¯ç»è¿ä¸ä¸ªå¾è¿æ¶é´RTTå°±æåéæ¾çcwndå 1.
- **å¿«éä¼ ä¸å¿«æ¢å¤ï¼**
å¨ TCP/IP ä¸ï¼å¿«ééä¼ åæ¢å¤ï¼fast retransmit and recoveryï¼FRRï¼æ¯ä¸ç§æ¥å¡æ§å¶ç®æ³ï¼å®è½å¿«éæ¢å¤ä¸¢å¤±çæ°æ®å
ãæ²¡æ FRRï¼å¦ææ°æ®å
丢失äºï¼TCP å°ä¼ä½¿ç¨å®æ¶å¨æ¥è¦æ±ä¼ è¾æåã卿åçè¿æ®µæ¶é´å
ï¼æ²¡ææ°çæå¤å¶çæ°æ®å
被åéãæäº FRRï¼å¦ææ¥æ¶æºæ¥æ¶å°ä¸ä¸ªä¸æé¡ºåºçæ°æ®æ®µï¼å®ä¼ç«å³ç»åéæºåéä¸ä¸ªéå¤ç¡®è®¤ã妿åéæºæ¥æ¶å°ä¸ä¸ªéå¤ç¡®è®¤ï¼å®ä¼åå®ç¡®è®¤ä»¶æåºçæ°æ®æ®µä¸¢å¤±äºï¼å¹¶ç«å³éä¼ è¿äºä¸¢å¤±çæ°æ®æ®µãæäº FRRï¼å°±ä¸ä¼å 为éä¼ æ¶è¦æ±çæå被è½è¯¯ã ã彿åç¬çæ°æ®å
丢失æ¶ï¼å¿«ééä¼ åæ¢å¤ï¼FRRï¼è½æææå°å·¥ä½ã彿å¤ä¸ªæ°æ®ä¿¡æ¯å
卿䏿®µå¾ççæ¶é´å
丢失æ¶ï¼å®åä¸è½å¾ææå°å·¥ä½ã
### 3.1.7 卿µè§å¨ä¸è¾å
¥urlå°å ->> æ¾ç¤ºä¸»é¡µçè¿ç¨(é¢è¯å¸¸å®¢)
ç¾åº¦å¥½åæå欢é®è¿ä¸ªé®é¢ã
> æå¼ä¸ä¸ªç½é¡µï¼æ´ä¸ªè¿ç¨ä¼ä½¿ç¨åªäºåè®®
å¾è§£ï¼å¾çæ¥æºï¼ãå¾è§£HTTPãï¼ï¼
æ»ä½æ¥è¯´å为以ä¸å 个è¿ç¨:
1. DNSè§£æ
2. TCPè¿æ¥
3. åéHTTP请æ±
4. æå¡å¨å¤ç请æ±å¹¶è¿åHTTPæ¥æ
5. æµè§å¨è§£ææ¸²æé¡µé¢
6. è¿æ¥ç»æ
å
·ä½å¯ä»¥åèä¸é¢è¿ç¯æç« ï¼
- [https://segmentfault.com/a/1190000006879700](https://segmentfault.com/a/1190000006879700)
### 3.1.8 ç¶æç

### 3.1.9 åç§åè®®ä¸HTTPåè®®ä¹é´çå
³ç³»
ä¸è¬é¢è¯å®ä¼éè¿è¿æ ·çé®é¢æ¥èå¯ä½ å¯¹è®¡ç®æºç½ç»ç¥è¯ä½ç³»ççè§£ã
å¾çæ¥æºï¼ãå¾è§£HTTPã

### 3.1.10 HTTPé¿è¿æ¥,çè¿æ¥
å¨HTTP/1.0ä¸é»è®¤ä½¿ç¨çè¿æ¥ãä¹å°±æ¯è¯´ï¼å®¢æ·ç«¯åæå¡å¨æ¯è¿è¡ä¸æ¬¡HTTPæä½ï¼å°±å»ºç«ä¸æ¬¡è¿æ¥ï¼ä»»å¡ç»æå°±ä¸æè¿æ¥ãå½å®¢æ·ç«¯æµè§å¨è®¿é®çæä¸ªHTMLæå
¶ä»ç±»åçWeb页ä¸å
嫿å
¶ä»çWebèµæºï¼å¦JavaScriptæä»¶ãå¾åæä»¶ãCSSæä»¶çï¼ï¼æ¯éå°è¿æ ·ä¸ä¸ªWebèµæºï¼æµè§å¨å°±ä¼éæ°å»ºç«ä¸ä¸ªHTTPä¼è¯ã
èä»HTTP/1.1èµ·ï¼é»è®¤ä½¿ç¨é¿è¿æ¥ï¼ç¨ä»¥ä¿æè¿æ¥ç¹æ§ã使ç¨é¿è¿æ¥çHTTPåè®®ï¼ä¼å¨ååºå¤´å å
¥è¿è¡ä»£ç ï¼
```
Connection:keep-alive
```
å¨ä½¿ç¨é¿è¿æ¥çæ
åµä¸ï¼å½ä¸ä¸ªç½é¡µæå¼å®æåï¼å®¢æ·ç«¯åæå¡å¨ä¹é´ç¨äºä¼ è¾HTTPæ°æ®çTCPè¿æ¥ä¸ä¼å
³éï¼å®¢æ·ç«¯å次访é®è¿ä¸ªæå¡å¨æ¶ï¼ä¼ç»§ç»ä½¿ç¨è¿ä¸æ¡å·²ç»å»ºç«çè¿æ¥ãKeep-Aliveä¸ä¼æ°¸ä¹
ä¿æè¿æ¥ï¼å®æä¸ä¸ªä¿ææ¶é´ï¼å¯ä»¥å¨ä¸åçæå¡å¨è½¯ä»¶ï¼å¦Apacheï¼ä¸è®¾å®è¿ä¸ªæ¶é´ãå®ç°é¿è¿æ¥éè¦å®¢æ·ç«¯åæå¡ç«¯é½æ¯æé¿è¿æ¥ã
**HTTPåè®®çé¿è¿æ¥åçè¿æ¥ï¼å®è´¨ä¸æ¯TCPåè®®çé¿è¿æ¥åçè¿æ¥ã**
ââ [ãHTTPé¿è¿æ¥ãçè¿æ¥ç©¶ç«æ¯ä»ä¹ï¼ã](https://www.cnblogs.com/gotodsp/p/6366163.html)
### 3.1.11 HTTPæ¯ä¸ä¿åç¶æçåè®®,å¦ä½ä¿åç¨æ·ç¶æ?
HTTP æ¯ä¸ç§ä¸ä¿åç¶æï¼å³æ ç¶æï¼statelessï¼åè®®ãä¹å°±æ¯è¯´ HTTP åè®®èªèº«ä¸å¯¹è¯·æ±åååºä¹é´çéä¿¡ç¶æè¿è¡ä¿åãé£ä¹æä»¬ä¿åç¨æ·ç¶æå¢ï¼Session æºå¶çåå¨å°±æ¯ä¸ºäºè§£å³è¿ä¸ªé®é¢ï¼Session ç主è¦ä½ç¨å°±æ¯éè¿æå¡ç«¯è®°å½ç¨æ·çç¶æãå
¸åçåºæ¯æ¯è´ç©è½¦ï¼å½ä½ è¦æ·»å ååå°è´ç©è½¦çæ¶åï¼ç³»ç»ä¸ç¥éæ¯åªä¸ªç¨æ·æä½çï¼å 为 HTTP åè®®æ¯æ ç¶æçãæå¡ç«¯ç»ç¹å®çç¨æ·å建ç¹å®ç Session ä¹åå°±å¯ä»¥æ è¯è¿ä¸ªç¨æ·å¹¶ä¸è·è¸ªè¿ä¸ªç¨æ·äºï¼ä¸è¬æ
åµä¸ï¼æå¡å¨ä¼å¨ä¸å®æ¶é´å
ä¿åè¿ä¸ª Sessionï¼è¿äºæ¶é´éå¶ï¼å°±ä¼éæ¯è¿ä¸ªSessionï¼ã
卿å¡ç«¯ä¿å Session çæ¹æ³å¾å¤ï¼æå¸¸ç¨çå°±æ¯å
ååæ°æ®åº(æ¯å¦æ¯ä½¿ç¨å
åæ°æ®åºredisä¿å)ãæ¢ç¶ Session 忾卿å¡å¨ç«¯ï¼é£ä¹æä»¬å¦ä½å®ç° Session è·è¸ªå¢ï¼å¤§é¨åæ
åµä¸ï¼æä»¬é½æ¯éè¿å¨ Cookie ä¸éå ä¸ä¸ª Session ID æ¥æ¹å¼æ¥è·è¸ªã
**Cookie 被ç¦ç¨æä¹å?**
æå¸¸ç¨çå°±æ¯å©ç¨ URL éåæ Session ID ç´æ¥éå å¨URLè·¯å¾çåé¢ã

### 3.1.12 Cookieçä½ç¨æ¯ä»ä¹?åSessionæä»ä¹åºå«ï¼
Cookie å Session齿¯ç¨æ¥è·è¸ªæµè§å¨ç¨æ·èº«ä»½çä¼è¯æ¹å¼ï¼ä½æ¯ä¸¤è
çåºç¨åºæ¯ä¸å¤ªä¸æ ·ã
**Cookie ä¸è¬ç¨æ¥ä¿åç¨æ·ä¿¡æ¯** æ¯å¦â æä»¬å¨ Cookie ä¸ä¿åå·²ç»ç»å½è¿å¾ç¨æ·ä¿¡æ¯ï¼ä¸æ¬¡è®¿é®ç½ç«çæ¶å页é¢å¯ä»¥èªå¨å¸®ä½ ç»å½çä¸äºåºæ¬ä¿¡æ¯ç»å¡«äºï¼â¡ä¸è¬çç½ç«é½ä¼æä¿æç»å½ä¹å°±æ¯è¯´ä¸æ¬¡ä½ å访é®ç½ç«çæ¶åå°±ä¸éè¦éæ°ç»å½äºï¼è¿æ¯å ä¸ºç¨æ·ç»å½çæ¶åæä»¬å¯ä»¥åæ¾äºä¸ä¸ª Token å¨ Cookie ä¸ï¼ä¸æ¬¡ç»å½çæ¶ååªéè¦æ ¹æ® Token 弿¥æ¥æ¾ç¨æ·å³å¯(为äºå®å
¨èèï¼éæ°ç»å½ä¸è¬è¦å° Token éå)ï¼â¢ç»å½ä¸æ¬¡ç½ç«å访é®ç½ç«å
¶ä»é¡µé¢ä¸éè¦éæ°ç»å½ã**Session ç主è¦ä½ç¨å°±æ¯éè¿æå¡ç«¯è®°å½ç¨æ·çç¶æã** å
¸åçåºæ¯æ¯è´ç©è½¦ï¼å½ä½ è¦æ·»å ååå°è´ç©è½¦çæ¶åï¼ç³»ç»ä¸ç¥éæ¯åªä¸ªç¨æ·æä½çï¼å 为 HTTP åè®®æ¯æ ç¶æçãæå¡ç«¯ç»ç¹å®çç¨æ·å建ç¹å®ç Session ä¹åå°±å¯ä»¥æ è¯è¿ä¸ªç¨æ·å¹¶ä¸è·è¸ªè¿ä¸ªç¨æ·äºã
Cookie æ°æ®ä¿åå¨å®¢æ·ç«¯(æµè§å¨ç«¯)ï¼Session æ°æ®ä¿å卿å¡å¨ç«¯ã
Cookie åå¨å¨å®¢æ·ç«¯ä¸ï¼èSessionåå¨å¨æå¡å¨ä¸ï¼ç¸å¯¹æ¥è¯´ Session å®å
¨æ§æ´é«ã妿è¦å¨ Cookie ä¸åå¨ä¸äºææä¿¡æ¯ï¼ä¸è¦ç´æ¥åå
¥ Cookie ä¸ï¼æå¥½è½å° Cookie ä¿¡æ¯å å¯ç¶å使ç¨å°çæ¶åå廿å¡å¨ç«¯è§£å¯ã
### 3.1.13 HTTP 1.0åHTTP 1.1ç主è¦åºå«æ¯ä»ä¹?
> è¿é¨ååçå¼ç¨è¿ç¯æç« çä¸äºå
容ã
HTTP1.0ææ©å¨ç½é¡µä¸ä½¿ç¨æ¯å¨1996å¹´ï¼é£ä¸ªæ¶ååªæ¯ä½¿ç¨ä¸äºè¾ä¸ºç®åçç½é¡µä¸åç½ç»è¯·æ±ä¸ï¼èHTTP1.1åå¨1999å¹´æå¼å§å¹¿æ³åºç¨äºç°å¨çå大æµè§å¨ç½ç»è¯·æ±ä¸ï¼åæ¶HTTP1.1乿¯å½åä½¿ç¨æä¸ºå¹¿æ³çHTTPåè®®ã 主è¦åºå«ä¸»è¦ä½ç°å¨ï¼
1. **é¿è¿æ¥** : **å¨HTTP/1.0ä¸ï¼é»è®¤ä½¿ç¨çæ¯çè¿æ¥**ï¼ä¹å°±æ¯è¯´æ¯æ¬¡è¯·æ±é½è¦éæ°å»ºç«ä¸æ¬¡è¿æ¥ãHTTP æ¯åºäºTCP/IPåè®®ç,æ¯ä¸æ¬¡å»ºç«æè
æå¼è¿æ¥é½éè¦ä¸æ¬¡æ¡æåæ¬¡æ¥æçå¼éï¼å¦ææ¯æ¬¡è¯·æ±é½è¦è¿æ ·çè¯ï¼å¼é伿¯è¾å¤§ãå æ¤æå¥½è½ç»´æä¸ä¸ªé¿è¿æ¥ï¼å¯ä»¥ç¨ä¸ªé¿è¿æ¥æ¥åå¤ä¸ªè¯·æ±ã**HTTP 1.1èµ·ï¼é»è®¤ä½¿ç¨é¿è¿æ¥** ,é»è®¤å¼å¯Connectionï¼ keep-aliveã **HTTP/1.1çæç»è¿æ¥æéæµæ°´çº¿æ¹å¼åæµæ°´çº¿æ¹å¼** ãæµæ°´çº¿æ¹å¼æ¯å®¢æ·å¨æ¶å°HTTPçååºæ¥æä¹åå°±è½æ¥çåéæ°çè¯·æ±æ¥æãä¸ä¹ç¸å¯¹åºçéæµæ°´çº¿æ¹å¼æ¯å®¢æ·å¨æ¶å°åä¸ä¸ªååºåæè½åéä¸ä¸ä¸ªè¯·æ±ã
1. **éè¯¯ç¶æååºç ** :å¨HTTP1.1䏿°å¢äº24个éè¯¯ç¶æååºç ï¼å¦409ï¼Conflictï¼è¡¨ç¤ºè¯·æ±çèµæºä¸èµæºçå½åç¶æåçå²çªï¼410ï¼Goneï¼è¡¨ç¤ºæå¡å¨ä¸çæä¸ªèµæºè¢«æ°¸ä¹
æ§çå é¤ã
1. **ç¼åå¤ç** :å¨HTTP1.0ä¸ä¸»è¦ä½¿ç¨headeréçIf-Modified-Since,Expiresæ¥å为ç¼åå¤æçæ åï¼HTTP1.1åå¼å
¥äºæ´å¤çç¼åæ§å¶çç¥ä¾å¦Entity tagï¼If-Unmodified-Since, If-Match, If-None-Matchçæ´å¤å¯ä¾éæ©çç¼åå¤´æ¥æ§å¶ç¼åçç¥ã
1. **带宽ä¼ååç½ç»è¿æ¥ç使ç¨** :HTTP1.0ä¸ï¼åå¨ä¸äºæµªè´¹å¸¦å®½çç°è±¡ï¼ä¾å¦å®¢æ·ç«¯åªæ¯éè¦æä¸ªå¯¹è±¡çä¸é¨åï¼èæå¡å¨å´å°æ´ä¸ªå¯¹è±¡éè¿æ¥äºï¼å¹¶ä¸ä¸æ¯ææç¹ç»ä¼ åè½ï¼HTTP1.1åå¨è¯·æ±å¤´å¼å
¥äºrange头åï¼å®å
许åªè¯·æ±èµæºçæä¸ªé¨åï¼å³è¿åç æ¯206ï¼Partial Contentï¼ï¼è¿æ ·å°±æ¹ä¾¿äºå¼åè
èªç±çéæ©ä»¥ä¾¿äºå
åå©ç¨å¸¦å®½åè¿æ¥ã
### 3.1.12 URIåURLçåºå«æ¯ä»ä¹?
- URI(Uniform Resource Identifier) æ¯ç»ä¸èµæºæ å¿ç¬¦ï¼å¯ä»¥å¯ä¸æ è¯ä¸ä¸ªèµæºã
- URL(Uniform Resource Location) æ¯ç»ä¸èµæºå®ä½ç¬¦ï¼å¯ä»¥æä¾è¯¥èµæºçè·¯å¾ã宿¯ä¸ç§å
·ä½ç URIï¼å³ URL å¯ä»¥ç¨æ¥æ è¯ä¸ä¸ªèµæºï¼èä¸è¿ææäºå¦ä½ locate è¿ä¸ªèµæºã
URIçä½ç¨å身份è¯å·ä¸æ ·ï¼URLçä½ç¨æ´åå®¶åºä½å䏿 ·ãURLæ¯ä¸ç§å
·ä½çURIï¼å®ä¸ä»
å¯ä¸æ è¯èµæºï¼èä¸è¿æä¾äºå®ä½è¯¥èµæºçä¿¡æ¯ã
### 3.1.13 HTTP å HTTPS çåºå«ï¼
1. **端å£** ï¼HTTPçURLç±âhttp://âèµ·å§ä¸é»è®¤ä½¿ç¨ç«¯å£80ï¼èHTTPSçURLç±âhttps://âèµ·å§ä¸é»è®¤ä½¿ç¨ç«¯å£443ã
2. **å®å
¨æ§åèµæºæ¶èï¼** HTTPåè®®è¿è¡å¨TCPä¹ä¸ï¼ææä¼ è¾çå
容齿¯ææï¼å®¢æ·ç«¯åæå¡å¨ç«¯é½æ æ³éªè¯å¯¹æ¹ç身份ãHTTPSæ¯è¿è¡å¨SSL/TLSä¹ä¸çHTTPåè®®ï¼SSL/TLS è¿è¡å¨TCPä¹ä¸ãææä¼ è¾çå
容é½ç»è¿å å¯ï¼å å¯éç¨å¯¹ç§°å å¯ï¼ä½å¯¹ç§°å å¯çå¯é¥ç¨æå¡å¨æ¹çè¯ä¹¦è¿è¡äºé对称å å¯ãæä»¥è¯´ï¼HTTP å®å
¨æ§æ²¡æ HTTPSé«ï¼ä½æ¯ HTTPS æ¯HTTPèè´¹æ´å¤æå¡å¨èµæºã
- 对称å å¯ï¼å¯é¥åªæä¸ä¸ªï¼å å¯è§£å¯ä¸ºåä¸ä¸ªå¯ç ï¼ä¸å è§£å¯é度快ï¼å
¸åç对称å å¯ç®æ³æDESãAESçï¼
- é对称å å¯ï¼å¯é¥æå¯¹åºç°ï¼ä¸æ ¹æ®å
¬é¥æ æ³æ¨ç¥ç§é¥ï¼æ ¹æ®ç§é¥ä¹æ æ³æ¨ç¥å
¬é¥ï¼ï¼å å¯è§£å¯ä½¿ç¨ä¸åå¯é¥ï¼å
¬é¥å å¯éè¦ç§é¥è§£å¯ï¼ç§é¥å å¯éè¦å
¬é¥è§£å¯ï¼ï¼ç¸å¯¹å¯¹ç§°å å¯éåº¦è¾æ
¢ï¼å
¸åçé对称å å¯ç®æ³æRSAãDSAçã
### 建议
é常æ¨è大家çä¸ä¸ ãå¾è§£HTTPã è¿æ¬ä¹¦ï¼è¿æ¬ä¹¦é¡µæ°ä¸å¤ï¼ä½æ¯å
容徿¯å
å®ï¼ä¸ç®¡æ¯ç¨æ¥ç³»ç»çææ¡ç½ç»æ¹é¢çä¸äºç¥è¯è¿æ¯è¯´çº¯ç²¹ä¸ºäºåºä»é¢è¯é½æå¾å¤§å¸®å©ãä¸é¢çä¸äºæç« åªæ¯åèã大äºå¦ä¹ è¿é¨è¯¾ç¨çæ¶åï¼æä»¬ä½¿ç¨çæææ¯ ãè®¡ç®æºç½ç»ç¬¬ä¸çãï¼è°¢å¸ä»ç¼èï¼ï¼ä¸æ¨è大家çè¿æ¬ææï¼ä¹¦é常åèä¸ç¥è¯åç论ï¼ä¸ç¡®å®å¤§å®¶è½ä¸è½å¿å¹³æ°åç读å®ã
### åè
- [https://blog.csdn.net/qq_16209077/article/details/52718250](https://blog.csdn.net/qq_16209077/article/details/52718250)
- [https://blog.csdn.net/zixiaomuwu/article/details/60965466](https://blog.csdn.net/zixiaomuwu/article/details/60965466)
- [https://blog.csdn.net/turn__back/article/details/73743641](https://blog.csdn.net/turn__back/article/details/73743641)
-
## 3.2 æ°æ®ç»æ
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
>
> ä¸é¢åªæ¯ç®åå°æ»ç»ï¼ç»äºä¸äºåèæç« ï¼åé¢ä¼å¯¹è¿é¨åå
容è¿è¡éæã
>
> 欢è¿å¤§å®¶èªèï¼æ°æ®ç»æè¿é¨åå
容æ¯å¾ä¹
ä¹ååçï¼å¦ææèå¥å¯¹è¿æ¹é¢çæ»ç»ä¸éçè¯ï¼æ¬¢è¿æç¨¿èç³»ãæçé®ç®± :[email protected] ã
### 3.2.1 Queue
#### ä»ä¹æ¯éå
éåæ¯æ°æ®ç»æä¸æ¯è¾éè¦çä¸ç§ç±»åï¼å®æ¯æ FIFOï¼å°¾é¨æ·»å ã头é¨å é¤ï¼å
è¿éåçå
ç´ å
åºéåï¼ï¼è·æä»¬çæ´»ä¸çæé类似ã
#### éåçç§ç±»
- **åéå**ï¼åéåå°±æ¯å¸¸è§çéå, æ¯æ¬¡æ·»å å
ç´ æ¶ï¼é½æ¯æ·»å å°éå°¾ï¼åå¨âåæº¢åºâçé®é¢ä¹å°±æ¯æææä½ç½®å´ä¸è½æ·»å çæ
åµï¼
- **循ç¯éå**ï¼é¿å
äºâåæº¢åºâçé®é¢ï¼
#### Java éåæ¡æ¶ä¸çéå Queue
Java éåä¸ç Queue ç»§æ¿èª Collection æ¥å£ ï¼Deque, LinkedList, PriorityQueue, BlockingQueue çç±»é½å®ç°äºå®ã
Queue ç¨æ¥åæ¾ çå¾
å¤çå
ç´ çéåï¼è¿ç§åºæ¯ä¸è¬ç¨äºç¼å²ãå¹¶å访é®ã
é¤äºç»§æ¿ Collection æ¥å£çä¸äºæ¹æ³ï¼Queue è¿æ·»å äºé¢å¤ç æ·»å ãå é¤ãæ¥è¯¢æä½ã
#### æ¨èæç«
- [Java éåæ·±å
¥çè§£ï¼9ï¼ï¼Queue éå](https://blog.csdn.net/u011240877/article/details/52860924)
### 3.2.2 Set
#### ä»ä¹æ¯ Set
Set ç»§æ¿äº Collection æ¥å£ï¼æ¯ä¸ä¸ªä¸å
许åºç°éå¤å
ç´ ï¼å¹¶ä¸æ åºçéåï¼ä¸»è¦ HashSet å TreeSet 两大å®ç°ç±»ã
å¨å¤æéå¤å
ç´ çæ¶åï¼HashSet éåä¼è°ç¨ hashCode()å equal()æ¹æ³æ¥å®ç°ï¼TreeSet éåä¼è°ç¨compareToæ¹æ³æ¥å®ç°ã
#### è¡¥å
ï¼æåºéå䏿 åºéå说æ
- æåºéåï¼éåéçå
ç´ å¯ä»¥æ ¹æ® key æ index è®¿é® (ListãMap)
- æ åºéåï¼éåéçå
ç´ åªè½éåãï¼Setï¼
#### HashSet å TreeSet åºå±æ°æ®ç»æ
**HashSet** æ¯åå¸è¡¨ç»æï¼ä¸»è¦å©ç¨ HashMap ç key æ¥åå¨å
ç´ ï¼è®¡ç®æå
¥å
ç´ ç hashCode æ¥è·åå
ç´ å¨éåä¸çä½ç½®ï¼
**TreeSet** æ¯çº¢é»æ ç»æï¼æ¯ä¸ä¸ªå
ç´ é½æ¯æ ä¸çä¸ä¸ªèç¹ï¼æå
¥çå
ç´ é½ä¼è¿è¡æåºï¼
#### æ¨èæç«
- [Javaéå--Set(åºç¡)](https://www.jianshu.com/p/b48c47a42916)
### 3.2.3 List
#### ä»ä¹æ¯List
å¨ List ä¸ï¼ç¨æ·å¯ä»¥ç²¾ç¡®æ§å¶åè¡¨ä¸æ¯ä¸ªå
ç´ çæå
¥ä½ç½®ï¼å¦å¤ç¨æ·å¯ä»¥éè¿æ´æ°ç´¢å¼ï¼å表ä¸çä½ç½®ï¼è®¿é®å
ç´ ï¼å¹¶æç´¢å表ä¸çå
ç´ ã ä¸ Set ä¸åï¼List é常å
许éå¤çå
ç´ ã å¦å¤ List æ¯æåºéåè Set æ¯æ åºéåã
#### Listç常è§å®ç°ç±»
**ArrayList** æ¯ä¸ä¸ªæ°ç»éåï¼ç¸å½äºå¨ææ°ç»ãå®ç±æ°ç»å®ç°ï¼éæºè®¿é®æçé«ï¼éæºæå
¥ãéæºå 餿çä½ã
**LinkedList** æ¯ä¸ä¸ªååé¾è¡¨ãå®ä¹å¯ä»¥è¢«å½ä½å æ ãéåæå端éåè¿è¡æä½ãLinkedListéæºè®¿é®æçä½ï¼ä½éæºæå
¥ãéæºå 餿çé«ã
**Vector** æ¯ç¢ééåï¼åArrayList䏿 ·ï¼å®ä¹æ¯ä¸ä¸ªå¨ææ°ç»ï¼ç±æ°ç»å®ç°ã使¯ArrayListæ¯é线ç¨å®å
¨çï¼èVectoræ¯çº¿ç¨å®å
¨çã
**Stack** æ¯æ ï¼å®ç»§æ¿äºVectorãå®çç¹æ§æ¯ï¼å
è¿ååº(FILO, First In Last Out)ãç¸å
³é
读ï¼[javaæ°æ®ç»æä¸ç®æ³ä¹æ ï¼Stackï¼è®¾è®¡ä¸å®ç°](https://blog.csdn.net/javazejian/article/details/53362993)
#### ArrayList å LinkedList æºç å¦ä¹
- [ArrayList æºç å¦ä¹ ](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/ArrayList.md)
- [LinkedList æºç å¦ä¹ ](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/LinkedList.md)
#### æ¨èé
读
- [java æ°æ®ç»æä¸ç®æ³ä¹é¡ºåºè¡¨ä¸é¾è¡¨æ·±å
¥åæ](https://blog.csdn.net/javazejian/article/details/52953190)
### 3.2.4 Map
- [éåæ¡æ¶æºç å¦ä¹ ä¹ HashMap(JDK1.8)](https://juejin.im/post/5ab0568b5188255580020e56)
- [ConcurrentHashMap å®ç°åçåæºç åæ](https://link.juejin.im/?target=http%3A%2F%2Fwww.cnblogs.com%2Fchengxiao%2Fp%2F6842045.html)
### 3.2.5 æ
#### 1. äºåæ
[äºåæ ](https://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%A0%91)ï¼ç¾åº¦ç¾ç§ï¼
(1)[å®å
¨äºåæ ](https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91)ââè¥è®¾äºåæ çé«åº¦ä¸ºhï¼é¤ç¬¬ h å±å¤ï¼å
¶å®åå± (1ï½h-1) çç»ç¹æ°é½è¾¾å°æå¤§ä¸ªæ°ï¼ç¬¬h屿å¶åç»ç¹ï¼å¹¶ä¸å¶åç»ç¹é½æ¯ä»å·¦å°å³ä¾æ¬¡æå¸ï¼è¿å°±æ¯å®å
¨äºåæ ã
(2)[满äºåæ ](https://baike.baidu.com/item/%E6%BB%A1%E4%BA%8C%E5%8F%89%E6%A0%91)ââé¤äºå¶ç»ç¹å¤æ¯ä¸ä¸ªç»ç¹é½æå·¦å³åå¶ä¸å¶åç»ç¹é½å¤å¨æåºå±çäºåæ ã
(3)[平衡äºåæ ](https://baike.baidu.com/item/%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91/10421057)ââ平衡äºåæ å被称为AVLæ ï¼åºå«äºAVLç®æ³ï¼ï¼å®æ¯ä¸æ£µäºåæåºæ ï¼ä¸å
·æä»¥ä¸æ§è´¨ï¼å®æ¯ä¸æ£µç©ºæ æå®çå·¦å³ä¸¤ä¸ªåæ çé«åº¦å·®çç»å¯¹å¼ä¸è¶
è¿1ï¼å¹¶ä¸å·¦å³ä¸¤ä¸ªåæ 齿¯ä¸æ£µå¹³è¡¡äºåæ ã
#### 2. å®å
¨äºåæ
[å®å
¨äºåæ ](https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91)ï¼ç¾åº¦ç¾ç§ï¼
å®å
¨äºåæ ï¼å¶èç¹åªè½åºç°å¨æä¸å±å次ä¸å±ï¼å¹¶ä¸æä¸é¢ä¸å±çç»ç¹é½éä¸å¨è¯¥å±æå·¦è¾¹çè¥å¹²ä½ç½®çäºåæ ã
#### 3. 满äºåæ
[满äºåæ ](https://baike.baidu.com/item/%E6%BB%A1%E4%BA%8C%E5%8F%89%E6%A0%91)ï¼ç¾åº¦ç¾ç§ï¼å½å
å¤çå®ä¹ä¸åï¼
å½å
æç¨å®ä¹ï¼ä¸ä¸ªäºåæ ï¼å¦ææ¯ä¸ä¸ªå±çç»ç¹æ°é½è¾¾å°æå¤§å¼ï¼åè¿ä¸ªäºåæ å°±æ¯æ»¡äºåæ ãä¹å°±æ¯è¯´ï¼å¦æä¸ä¸ªäºåæ ç屿°ä¸ºKï¼ä¸ç»ç¹æ»æ°æ¯(2^k) -1 ï¼åå®å°±æ¯æ»¡äºåæ ã
#### 4. å
[æ°æ®ç»æä¹å çå®ä¹](https://blog.csdn.net/qq_33186366/article/details/51876191)
å æ¯å
·æä»¥ä¸æ§è´¨çå®å
¨äºåæ ï¼æ¯ä¸ªç»ç¹çå¼é½å¤§äºæçäºå
¶å·¦å³å©åç»ç¹çå¼ï¼ç§°ä¸ºå¤§é¡¶å ï¼æè
æ¯ä¸ªç»ç¹çå¼é½å°äºæçäºå
¶å·¦å³å©åç»ç¹çå¼ï¼ç§°ä¸ºå°é¡¶å ã
#### 5. äºåæ¥æ¾æ ï¼BSTï¼
[æµ
è°ç®æ³åæ°æ®ç»æ: ä¸ äºåæ¥æ¾æ ](http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html)
äºåæ¥æ¾æ çç¹ç¹ï¼
1. è¥ä»»æèç¹çå·¦åæ ä¸ç©ºï¼åå·¦åæ ä¸ææç»ç¹ç å¼åå°äºå®çæ ¹ç»ç¹çå¼ï¼
2. è¥ä»»æèç¹çå³åæ ä¸ç©ºï¼åå³åæ 䏿æç»ç¹çå¼å大äºå®çæ ¹ç»ç¹çå¼ï¼
3. ä»»æèç¹çå·¦ãå³åæ ä¹åå«ä¸ºäºåæ¥æ¾æ ï¼
4. 没æé®å¼ç¸ççèç¹ï¼no duplicate nodesï¼ã
#### 6. 平衡äºåæ ï¼Self-balancing binary search treeï¼
[ 平衡äºåæ ](https://baike.baidu.com/item/%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91)ï¼ç¾åº¦ç¾ç§ï¼å¹³è¡¡äºåæ ç常ç¨å®ç°æ¹æ³æçº¢é»æ ãAVLãæ¿ç½ªç¾æ ãTreapã伏屿 çï¼
#### 7. çº¢é»æ
çº¢é»æ ç¹ç¹:
1. æ¯ä¸ªèç¹é红å³é»ï¼
2. æ ¹èç¹æ»æ¯é»è²çï¼
3. æ¯ä¸ªå¶åèç¹é½æ¯é»è²ç空èç¹ï¼NILèç¹ï¼ï¼
4. 妿èç¹æ¯çº¢è²çï¼åå®çåèç¹å¿
é¡»æ¯é»è²çï¼åä¹ä¸ä¸å®ï¼ï¼
5. 仿 ¹èç¹å°å¶èç¹æç©ºåèç¹çæ¯æ¡è·¯å¾ï¼å¿
é¡»å
å«ç¸åæ°ç®çé»è²èç¹ï¼å³ç¸åçé»è²é«åº¦ï¼ã
çº¢é»æ çåºç¨ï¼
TreeMapãTreeSet以åJDK1.8çHashMapåºå±é½ç¨å°äºçº¢é»æ ã
**为ä»ä¹è¦ç¨çº¢é»æ ï¼**
ç®åæ¥è¯´çº¢é»æ å°±æ¯ä¸ºäºè§£å³äºåæ¥æ¾æ ç缺é·ï¼å 为äºåæ¥æ¾æ å¨æäºæ
åµä¸ä¼éåæä¸ä¸ªçº¿æ§ç»æã详ç»äºè§£å¯ä»¥æ¥ç [漫ç»ï¼ä»ä¹æ¯çº¢é»æ ï¼](https://juejin.im/post/5a27c6946fb9a04509096248)ï¼ä¹ä»ç»å°äºäºåæ¥æ¾æ ï¼é常æ¨èï¼
æ¨èæç« ï¼
- [漫ç»ï¼ä»ä¹æ¯çº¢é»æ ï¼](https://juejin.im/post/5a27c6946fb9a04509096248)ï¼ä¹ä»ç»å°äºäºåæ¥æ¾æ ï¼é常æ¨èï¼
- [寻æ¾çº¢é»æ çæä½æå](http://dandanlove.com/2018/03/18/red-black-tree/)ï¼æç« æç以åæè·¯ççä¸éï¼
- [çº¢é»æ æ·±å
¥åæåJavaå®ç°](https://zhuanlan.zhihu.com/p/24367771)ï¼ç¾å¢ç¹è¯ææ¯å¢éï¼
##### 8. B-ï¼B+ï¼B*æ
[äºåæ å¦ä¹ ç¬è®°ä¹Bæ ãB+æ ãB*æ ](https://yq.aliyun.com/articles/38345)
[ãB-æ ï¼B+æ ï¼B*æ 详解ã](https://blog.csdn.net/aqzwss/article/details/53074186)
[ãB-æ ï¼B+æ ä¸B*æ çä¼ç¼ºç¹æ¯è¾ã](https://blog.csdn.net/bigtree_3721/article/details/73632405)
B-æ ï¼æBæ ï¼æ¯ä¸ç§å¹³è¡¡çå¤è·¯æ¥æ¾ï¼åç§°æåºï¼æ ï¼å¨æä»¶ç³»ç»ä¸ææåºç¨ã主è¦ç¨ä½æä»¶çç´¢å¼ãå
¶ä¸çB就表示平衡(Balance)
1. B+ æ çå¶åèç¹é¾è¡¨ç»æç¸æ¯äº B- æ ä¾¿äºæ«åºï¼åèå´æ£ç´¢ã
2. B+æ æ¯ærange-queryï¼åºé´æ¥è¯¢ï¼é常æ¹ä¾¿ï¼èBæ 䏿¯æãè¿æ¯æ°æ®åºéç¨B+æ çæä¸»è¦åå ã
3. B\*æ æ¯B+æ çåä½ï¼B\*æ åé
æ°ç»ç¹çæ¦çæ¯B+æ è¦ä½ï¼ç©ºé´ä½¿ç¨çæ´é«ï¼
##### 9. LSM æ
[[HBase] LSMæ VS B+æ ](https://blog.csdn.net/dbanote/article/details/8897599)
B+æ æå¤§çæ§è½é®é¢æ¯ä¼äº§ç大éçéæºIO
为äºå
æB+æ çå¼±ç¹ï¼HBaseå¼å
¥äºLSMæ çæ¦å¿µï¼å³Log-Structured Merge-Treesã
[LSMæ ç±æ¥ãè®¾è®¡ææ³ä»¥ååºç¨å°HBaseçç´¢å¼](http://www.cnblogs.com/yanghuahui/p/3483754.html)
#### 3.2.6 å¾
#### 3.2.7 BFSåDFS
- [ã使ç¨BFSåDFSéåæ åå¾çæè·¯åå®ç°ã](https://blog.csdn.net/Gene1994/article/details/85097507)
## 3.3 ç®æ³
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
### 3.3.1 å é常è§çåç¬¦ä¸²ç®æ³é¢æ»ç»
> ææè½¬è½½ï¼
>
> - æ¬æä½è
ï¼wwwxmu
> - åæå°å:https://www.weiweiblog.cn/13string/
èèå°ç¯å¹
é®é¢ï¼æä¼åä¸¤æ¬¡æ´æ°è¿ä¸ªå
å®¹ãæ¬ç¯æç« åªæ¯åæçä¸é¨åï¼æå¨åæçåºç¡ä¸å¢å äºé¨åå
容以åä¿®æ¹äºé¨å代ç åæ³¨éãå¦å¤ï¼æå¢å äºç±å¥èº 2018 ç§æ Javaï¼`æ±ç»å®åæ³æ¬å·åºåçæ·±åº¦` è¿éé¢ãææä»£ç åç¼è¯æåï¼å¹¶å¸¦ææ³¨éï¼æ¬¢è¿åä½äº«ç¨ï¼
#### KMP ç®æ³
è°å°å符串é®é¢ï¼ä¸å¾ä¸æçå°±æ¯ KMP ç®æ³ï¼å®æ¯ç¨æ¥è§£å³åç¬¦ä¸²æ¥æ¾çé®é¢ï¼å¯ä»¥å¨ä¸ä¸ªå符串ï¼Sï¼ä¸æ¥æ¾ä¸ä¸ªå串ï¼Wï¼åºç°çä½ç½®ãKMP ç®æ³æå符å¹é
çæ¶é´å¤æåº¦ç¼©å°å° O(m+n) ,è空é´å¤æåº¦ä¹åªæO(m)ãå ä¸ºâæ´åæç´¢âçæ¹æ³ä¼åå¤å溯主串ï¼å¯¼è´æçä½ä¸ï¼èKMPç®æ³å¯ä»¥å©ç¨å·²ç»é¨åå¹é
è¿ä¸ªææä¿¡æ¯ï¼ä¿æä¸»ä¸²ä¸çæéä¸å溯ï¼éè¿ä¿®æ¹å串çæéï¼è®©æ¨¡å¼ä¸²å°½éå°ç§»å¨å°ææçä½ç½®ã
å
·ä½ç®æ³ç»è请åèï¼
- **å符串å¹é
çKMPç®æ³:** http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
- **ä»å¤´å°å°¾å½»åºçè§£KMP:** https://blog.csdn.net/v_july_v/article/details/7041827
- **å¦ä½æ´å¥½ççè§£åææ¡ KMP ç®æ³?:** https://www.zhihu.com/question/21923021
- **KMP ç®æ³è¯¦ç»è§£æ:** https://blog.sengxian.com/algorithms/kmp
- **å¾è§£ KMP ç®æ³:** http://blog.jobbole.com/76611/
- **汪é½è½å¬æçKMPå符串å¹é
ç®æ³ãåè¯åå¹ã:** https://www.bilibili.com/video/av3246487/?from=search&seid=17173603269940723925
- **KMPå符串å¹é
ç®æ³1:** https://www.bilibili.com/video/av11866460?from=search&seid=12730654434238709250
**餿¤ä¹å¤ï¼åæ¥äºè§£ä¸ä¸BMç®æ³ï¼**
> BMç®æ³ä¹æ¯ä¸ç§ç²¾ç¡®å符串å¹é
ç®æ³ï¼å®éç¨ä»å³åå·¦æ¯è¾çæ¹æ³ï¼åæ¶åºç¨å°äºä¸¤ç§å¯åå¼è§åï¼å³åå符è§å å好åç¼è§å ï¼æ¥å³å®åå³è·³è·çè·ç¦»ãåºæ¬æè·¯å°±æ¯ä»å³å¾å·¦è¿è¡å符å¹é
ï¼éå°ä¸å¹é
çå符åä»åå符表å好åç¼è¡¨æ¾ä¸ä¸ªæå¤§çå³ç§»å¼ï¼å°æ¨¡å¼ä¸²å³ç§»ç»§ç»å¹é
ã
> ãå符串å¹é
çKMPç®æ³ã:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
#### æ¿æ¢ç©ºæ ¼
> åæofferï¼è¯·å®ç°ä¸ä¸ªå½æ°ï¼å°ä¸ä¸ªå符串ä¸çæ¯ä¸ªç©ºæ ¼æ¿æ¢æâ%20âãä¾å¦ï¼å½å符串为We Are Happy.åç»è¿æ¿æ¢ä¹åçå符串为We%20Are%20Happyã
è¿éææä¾äºä¸¤ç§æ¹æ³ï¼â å¸¸è§æ¹æ³ï¼â¡å©ç¨ API è§£å³ã
```java
//https://www.weiweiblog.cn/replacespace/
public class Solution {
/**
* 第ä¸ç§æ¹æ³ï¼å¸¸è§æ¹æ³ãå©ç¨String.charAt(i)以åString.valueOf(char).equals(" "
* )éååç¬¦ä¸²å¹¶å¤æå
ç´ æ¯å¦ä¸ºç©ºæ ¼ãæ¯åæ¿æ¢ä¸º"%20",å¦å䏿¿æ¢
*/
public static String replaceSpace(StringBuffer str) {
int length = str.length();
// System.out.println("length=" + length);
StringBuffer result = new StringBuffer();
for (int i = 0; i < length; i++) {
char b = str.charAt(i);
if (String.valueOf(b).equals(" ")) {
result.append("%20");
} else {
result.append(b);
}
}
return result.toString();
}
/**
* 第äºç§æ¹æ³ï¼å©ç¨APIæ¿æ¢ææç¨ç©ºæ ¼ï¼ä¸è¡ä»£ç è§£å³é®é¢
*/
public static String replaceSpace2(StringBuffer str) {
return str.toString().replaceAll("\\s", "%20");
}
}
```
### 3.3.2 æé¿å
Œ
񆇬
> Leetcode: ç¼åä¸ä¸ªå½æ°æ¥æ¥æ¾å符串æ°ç»ä¸çæé¿å
Œ
±åç¼ã妿ä¸åå¨å
Œ
±åç¼ï¼è¿å空å符串 ""ã
ç¤ºä¾ 1:
```
è¾å
¥: ["flower","flow","flight"]
è¾åº: "fl"
```
ç¤ºä¾ 2:
```
è¾å
¥: ["dog","racecar","car"]
è¾åº: ""
è§£é: è¾å
¥ä¸åå¨å
Œ
±åç¼ã
```
æè·¯å¾ç®åï¼å
å©ç¨Arrays.sort(strs)为æ°ç»æåºï¼åå°æ°ç»ç¬¬ä¸ä¸ªå
ç´ åæåä¸ä¸ªå
ç´ çå符ä»åå¾å对æ¯å³å¯ï¼
```java
public class Main {
public static String replaceSpace(String[] strs) {
// å¦ææ£æ¥å¼ä¸åæ³åå°±è¿å空串
if (!checkStrs(strs)) {
return "";
}
// æ°ç»é¿åº¦
int len = strs.length;
// ç¨äºä¿åç»æ
StringBuilder res = new StringBuilder();
// ç»å符串æ°ç»çå
ç´ æç
§ååºæåº(å
嫿°åçè¯ï¼æ°å伿å¨åé¢)
Arrays.sort(strs);
int m = strs[0].length();
int n = strs[len - 1].length();
int num = Math.min(m, n);
for (int i = 0; i < num; i++) {
if (strs[0].charAt(i) == strs[len - 1].charAt(i)) {
res.append(strs[0].charAt(i));
} else
break;
}
return res.toString();
}
private static boolean chechStrs(String[] strs) {
boolean flag = false;
if (strs != null) {
// éåstrsæ£æ¥å
ç´ å¼
for (int i = 0; i < strs.length; i++) {
if (strs[i] != null && strs[i].length() != 0) {
flag = true;
} else {
flag = false;
break;
}
}
}
return flag;
}
// æµè¯
public static void main(String[] args) {
String[] strs = { "customer", "car", "cat" };
// String[] strs = { "customer", "car", null };//空串
// String[] strs = {};//空串
// String[] strs = null;//空串
System.out.println(Main.replaceSpace(strs));// c
}
}
```
### 3.3.3 åæä¸²
#### æé¿åæä¸²
> LeetCode: ç»å®ä¸ä¸ªå
å«å¤§å忝åå°å忝çåç¬¦ä¸²ï¼æ¾å°éè¿è¿äºåæ¯æé æçæé¿çåæä¸²ã卿é è¿ç¨ä¸ï¼è¯·æ³¨æåºå大å°åãæ¯å¦`"Aa"`ä¸è½å½åä¸ä¸ªåæåç¬¦ä¸²ãæ³¨
> æ:å设å符串çé¿åº¦ä¸ä¼è¶
è¿ 1010ã
> åæä¸²ï¼âåæä¸²âæ¯ä¸ä¸ªæ£è¯»åå读é½ä¸æ ·çåç¬¦ä¸²ï¼æ¯å¦âlevelâæè
ânoonâççå°±æ¯åæä¸²ãââç¾åº¦ç¾ç§ å°åï¼https://baike.baidu.com/item/%E5%9B%9E%E6%96%87%E4%B8%B2/1274921?fr=aladdin
ç¤ºä¾ 1:
```
è¾å
¥:
"abccccdd"
è¾åº:
7
è§£é:
æä»¬å¯ä»¥æé çæé¿çåæä¸²æ¯"dccaccd", å®çé¿åº¦æ¯ 7ã
```
æä»¬ä¸é¢å·²ç»ç¥éäºä»ä¹æ¯åæä¸²ï¼ç°å¨æä»¬èèä¸ä¸å¯ä»¥ææåæä¸²çä¸¤ç§æ
åµï¼
- å符åºç°æ¬¡æ°ä¸ºåæ°çç»å
- å符åºç°æ¬¡æ°ä¸ºåæ°çç»å+ä¸ä¸ªåªåºç°ä¸æ¬¡çå符
ç»è®¡å符åºç°ç次æ°å³å¯ï¼åæ°æè½ææåæãå 为å
许ä¸é´ä¸ä¸ªæ°åç¬åºç°ï¼æ¯å¦âabcbaâï¼æä»¥å¦ææåæåæ¯è½åï¼æ»é¿åº¦å¯ä»¥å 1ãé¦å
å°å符串转å为å符æ°ç»ãç¶åéå该æ°ç»ï¼å¤æå¯¹åºå符æ¯å¦å¨hashsetä¸ï¼å¦æä¸å¨å°±å è¿å»ï¼å¦æå¨å°±è®©count++ï¼ç¶åç§»é¤è¯¥å符ï¼è¿æ ·å°±è½æ¾å°åºç°æ¬¡æ°ä¸ºåæ°çå符个æ°ã
```java
//https://leetcode-cn.com/problems/longest-palindrome/description/
class Solution {
public int longestPalindrome(String s) {
if (s.length() == 0)
return 0;
// ç¨äºåæ¾å符
HashSet hashset = new HashSet();
char[] chars = s.toCharArray();
int count = 0;
for (int i = 0; i < chars.length; i++) {
if (!hashset.contains(chars[i])) {// 妿hashset没æè¯¥å符就ä¿åè¿å»
hashset.add(chars[i]);
} else {// 妿æ,就让count++ï¼è¯´ææ¾å°äºä¸ä¸ªæå¯¹çå符ï¼ï¼ç¶åæè¯¥å符移é¤
hashset.remove(chars[i]);
count++;
}
}
return hashset.isEmpty() ? count * 2 : count * 2 + 1;
}
}
```
#### éªè¯åæä¸²
> LeetCode: ç»å®ä¸ä¸ªå符串ï¼éªè¯å®æ¯å¦æ¯åæä¸²ï¼åªèè忝忰åå符ï¼å¯ä»¥å¿½ç¥åæ¯ç大å°åã 说æï¼æ¬é¢ä¸ï¼æä»¬å°ç©ºå符串å®ä¹ä¸ºææçåæä¸²ã
ç¤ºä¾ 1:
```
è¾å
¥: "A man, a plan, a canal: Panama"
è¾åº: true
```
ç¤ºä¾ 2:
```
è¾å
¥: "race a car"
è¾åº: false
```
```java
//https://leetcode-cn.com/problems/valid-palindrome/description/
class Solution {
public boolean isPalindrome(String s) {
if (s.length() == 0)
return true;
int l = 0, r = s.length() - 1;
while (l < r) {
// ä»å¤´åå°¾å¼å§åä¸é´éå
if (!Character.isLetterOrDigit(s.charAt(l))) {// åç¬¦ä¸æ¯åæ¯åæ°åçæ
åµ
l++;
} else if (!Character.isLetterOrDigit(s.charAt(r))) {// åç¬¦ä¸æ¯åæ¯åæ°åçæ
åµ
r--;
} else {
// 夿äºè
æ¯å¦ç¸ç
if (Character.toLowerCase(s.charAt(l)) != Character.toLowerCase(s.charAt(r)))
return false;
l++;
r--;
}
}
return true;
}
}
```
#### æé¿åæå串
> Leetcode: LeetCode: æé¿åæå串 ç»å®ä¸ä¸ªå符串 sï¼æ¾å° s 䏿é¿çåæå串ãä½ å¯ä»¥å设 s çæå¤§é¿åº¦ä¸º1000ã
ç¤ºä¾ 1ï¼
```
è¾å
¥: "babad"
è¾åº: "bab"
注æ: "aba"乿¯ä¸ä¸ªææçæ¡ã
```
ç¤ºä¾ 2ï¼
```
è¾å
¥: "cbbd"
è¾åº: "bb"
```
以æä¸ªå
ç´ ä¸ºä¸å¿ï¼åå«è®¡ç®å¶æ°é¿åº¦ç忿大é¿åº¦å奿°é¿åº¦ç忿大é¿åº¦ãç»å¤§å®¶å¤§è´è±äºä¸ªèå¾ï¼ä¸è¦å«å¼ï¼

```java
//https://leetcode-cn.com/problems/longest-palindromic-substring/description/
class Solution {
private int index, len;
public String longestPalindrome(String s) {
if (s.length() < 2)
return s;
for (int i = 0; i < s.length() - 1; i++) {
PalindromeHelper(s, i, i);
PalindromeHelper(s, i, i + 1);
}
return s.substring(index, index + len);
}
public void PalindromeHelper(String s, int l, int r) {
while (l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {
l--;
r++;
}
if (len < r - l - 1) {
index = l + 1;
len = r - l - 1;
}
}
}
```
#### æé¿åæååºå
> LeetCode: æé¿åæååºå
> ç»å®ä¸ä¸ªå符串sï¼æ¾å°å
¶ä¸æé¿çåæååºåãå¯ä»¥å设sçæå¤§é¿åº¦ä¸º1000ã
> **æé¿åæååºååä¸ä¸é¢æé¿åæå串çåºå«æ¯ï¼å串æ¯å符串ä¸è¿ç»çä¸ä¸ªåºåï¼èååºåæ¯å符串ä¸ä¿æç¸å¯¹ä½ç½®çå符åºåï¼ä¾å¦ï¼"bbbb"å¯ä»¥æ¯å符串"bbbab"çååºåä½ä¸æ¯å串ã**
ç»å®ä¸ä¸ªå符串sï¼æ¾å°å
¶ä¸æé¿çåæååºåãå¯ä»¥å设sçæå¤§é¿åº¦ä¸º1000ã
ç¤ºä¾ 1:
```
è¾å
¥:
"bbbab"
è¾åº:
4
```
ä¸ä¸ªå¯è½çæé¿åæååºå为 "bbbb"ã
ç¤ºä¾ 2:
```
è¾å
¥:
"cbbd"
è¾åº:
2
```
ä¸ä¸ªå¯è½çæé¿åæååºå为 "bb"ã
**卿è§åï¼** dp[i][j] = dp[i+1][j-1] + 2 if s.charAt(i) == s.charAt(j) otherwise, dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1])
```java
class Solution {
public int longestPalindromeSubseq(String s) {
int len = s.length();
int [][] dp = new int[len][len];
for(int i = len - 1; i>=0; i--){
dp[i][i] = 1;
for(int j = i+1; j < len; j++){
if(s.charAt(i) == s.charAt(j))
dp[i][j] = dp[i+1][j-1] + 2;
else
dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
}
}
return dp[0][len-1];
}
}
```
#### æ¬å·å¹é
深度
> ç±å¥èº 2018 ç§æ Javaï¼
> ä¸ä¸ªåæ³çæ¬å·å¹é
åºåæä»¥ä¸å®ä¹:
> 1. 空串""æ¯ä¸ä¸ªåæ³çæ¬å·å¹é
åºå
> 2. 妿"X"å"Y"齿¯åæ³çæ¬å·å¹é
åºå,"XY"乿¯ä¸ä¸ªåæ³çæ¬å·å¹é
åºå
> 3. 妿"X"æ¯ä¸ä¸ªåæ³çæ¬å·å¹é
åºå,é£ä¹"(X)"乿¯ä¸ä¸ªåæ³çæ¬å·å¹é
åºå
> 4. æ¯ä¸ªåæ³çæ¬å·åºåé½å¯ä»¥ç±ä»¥ä¸è§åçæã
> ä¾å¦: "","()","()()","((()))"齿¯åæ³çæ¬å·åºå
> 对äºä¸ä¸ªåæ³çæ¬å·åºåæä»¬åæä»¥ä¸å®ä¹å®ç深度:
> 1. 空串""çæ·±åº¦æ¯0
> 2. 妿å符串"X"çæ·±åº¦æ¯x,å符串"Y"çæ·±åº¦æ¯y,é£ä¹å符串"XY"çæ·±åº¦ä¸ºmax(x,y)
> 3. 妿"X"çæ·±åº¦æ¯x,é£ä¹å符串"(X)"çæ·±åº¦æ¯x+1
> ä¾å¦: "()()()"çæ·±åº¦æ¯1,"((()))"çæ·±åº¦æ¯3ãççç°å¨ç»ä½ ä¸ä¸ªåæ³çæ¬å·åºå,éè¦ä½ 计ç®åºå
¶æ·±åº¦ã
```
è¾å
¥æè¿°:
è¾å
¥å
æ¬ä¸ä¸ªåæ³çæ¬å·åºås,sé¿åº¦length(2 ⤠length ⤠50),åºåä¸åªå
å«'('å')'ã
è¾åºæè¿°:
è¾åºä¸ä¸ªæ£æ´æ°,å³è¿ä¸ªåºåçæ·±åº¦ã
```
示ä¾ï¼
```
è¾å
¥:
(())
è¾åº:
2
```
æè·¯èå¾ï¼

代ç å¦ä¸ï¼
```java
import java.util.Scanner;
/**
* https://www.nowcoder.com/test/8246651/summary
*
* @author Snailclimb
* @date 2018å¹´9æ6æ¥
* @Description: TODO æ±ç»å®åæ³æ¬å·åºåçæ·±åº¦
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int cnt = 0, max = 0, i;
for (i = 0; i < s.length(); ++i) {
if (s.charAt(i) == '(')
cnt++;
else
cnt--;
max = Math.max(max, cnt);
}
sc.close();
System.out.println(max);
}
}
```
#### æåç¬¦ä¸²è½¬æ¢ææ´æ°
> åæoffer: å°ä¸ä¸ªåç¬¦ä¸²è½¬æ¢æä¸ä¸ªæ´æ°(å®ç°Integer.valueOf(string)çåè½ï¼ä½æ¯stringä¸ç¬¦åæ°åè¦æ±æ¶è¿å0)ï¼è¦æ±ä¸è½ä½¿ç¨åç¬¦ä¸²è½¬æ¢æ´æ°çåºå½æ°ã æ°å¼ä¸º0æè
åç¬¦ä¸²ä¸æ¯ä¸ä¸ªåæ³çæ°å¼åè¿å0ã
```java
//https://www.weiweiblog.cn/strtoint/
public class Main {
public static int StrToInt(String str) {
if (str.length() == 0)
return 0;
char[] chars = str.toCharArray();
// 夿æ¯å¦åå¨ç¬¦å·ä½
int flag = 0;
if (chars[0] == '+')
flag = 1;
else if (chars[0] == '-')
flag = 2;
int start = flag > 0 ? 1 : 0;
int res = 0;// ä¿åç»æ
for (int i = start; i < chars.length; i++) {
if (Character.isDigit(chars[i])) {// è°ç¨Character.isDigit(char)æ¹æ³å¤ææ¯å¦æ¯æ°åï¼æ¯è¿åTrueï¼å¦åFalse
int temp = chars[i] - '0';
res = res * 10 + temp;
} else {
return 0;
}
}
return flag != 2 ? res : -res;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "-12312312";
System.out.println("使ç¨åºå½æ°è½¬æ¢ï¼" + Integer.valueOf(s));
int res = Main.StrToInt(s);
System.out.println("使ç¨èªå·±åçæ¹æ³è½¬æ¢ï¼" + res);
}
}
```
- [1. 两æ°ç¸å ](#1-两æ°ç¸å )
- [é¢ç®æè¿°](#é¢ç®æè¿°)
- [é®é¢åæ](#é®é¢åæ)
- [Solution](#solution)
- [2. 翻转é¾è¡¨](#2-翻转é¾è¡¨)
- [é¢ç®æè¿°](#é¢ç®æè¿°-1)
- [é®é¢åæ](#é®é¢åæ-1)
- [Solution](#solution-1)
- [3. é¾è¡¨ä¸åæ°ç¬¬k个èç¹](#3-é¾è¡¨ä¸åæ°ç¬¬k个èç¹)
- [é¢ç®æè¿°](#é¢ç®æè¿°-2)
- [é®é¢åæ](#é®é¢åæ-2)
- [Solution](#solution-2)
- [4. å é¤é¾è¡¨çåæ°ç¬¬N个èç¹](#4-å é¤é¾è¡¨çåæ°ç¬¬n个èç¹)
- [é®é¢åæ](#é®é¢åæ-3)
- [Solution](#solution-3)
- [5. å并两个æåºçé¾è¡¨](#5-å并两个æåºçé¾è¡¨)
- [é¢ç®æè¿°](#é¢ç®æè¿°-3)
- [é®é¢åæ](#é®é¢åæ-4)
- [Solution](#solution-4)
### 3.3.4 两æ°ç¸å
#### é¢ç®æè¿°
> Leetcode:ç»å®ä¸¤ä¸ªé空é¾è¡¨æ¥è¡¨ç¤ºä¸¤ä¸ªéè´æ´æ°ã使°æç
§éåºæ¹å¼åå¨ï¼å®ä»¬çæ¯ä¸ªèç¹åªåå¨å个æ°åãå°ä¸¤æ°ç¸å è¿åä¸ä¸ªæ°çé¾è¡¨ã
>
> ä½ å¯ä»¥å设é¤äºæ°å 0 ä¹å¤ï¼è¿ä¸¤ä¸ªæ°åé½ä¸ä¼ä»¥é¶å¼å¤´ã
示ä¾ï¼
```
è¾å
¥ï¼(2 -> 4 -> 3) + (5 -> 6 -> 4)
è¾åºï¼7 -> 0 -> 8
åå ï¼342 + 465 = 807
```
#### é®é¢åæ
Leetcode宿¹è¯¦ç»è§£çå°åï¼
https://leetcode-cn.com/problems/add-two-numbers/solution/
> è¦å¯¹å¤´ç»ç¹è¿è¡æä½æ¶ï¼èèå建åèç¹dummyï¼ä½¿ç¨dummy->nextè¡¨ç¤ºçæ£ç头èç¹ãè¿æ ·å¯ä»¥é¿å
å¤ç头èç¹ä¸ºç©ºçè¾¹çé®é¢ã
æä»¬ä½¿ç¨å鿥è·è¸ªè¿ä½ï¼å¹¶ä»å
嫿使æä½ç表头å¼å§æ¨¡æé
ä½ç¸å çè¿ç¨ã

#### Solution
**æä»¬é¦å
仿使æä½ä¹å°±æ¯å表 l1å l2 ç表头å¼å§ç¸å ãæ³¨æéè¦èèå°è¿ä½çæ
åµï¼**
```java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
//https://leetcode-cn.com/problems/add-two-numbers/description/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode p = l1, q = l2, curr = dummyHead;
//carry 表示è¿ä½æ°
int carry = 0;
while (p != null || q != null) {
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int sum = carry + x + y;
//è¿ä½æ°
carry = sum / 10;
//æ°èç¹çæ°å¼ä¸ºsum % 10
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return dummyHead.next;
}
}
```
### 3.3.5 翻转é¾è¡¨
#### é¢ç®æè¿°
> åæ offer:è¾å
¥ä¸ä¸ªé¾è¡¨ï¼å转é¾è¡¨åï¼è¾åºé¾è¡¨çææå
ç´ ã

#### é®é¢åæ
è¿éç®æ³é¢ï¼è¯´ç´ç½ç¹å°±æ¯ï¼å¦ä½è®©åä¸ä¸ªèç¹æååä¸ä¸ªèç¹ï¼å¨ä¸é¢ç代ç ä¸å®ä¹äºä¸ä¸ª next èç¹ï¼è¯¥èç¹ä¸»è¦æ¯ä¿åè¦å转å°å¤´çé£ä¸ªèç¹ï¼é²æ¢é¾è¡¨ âæè£âã
#### Solution
```java
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
```
```java
/**
*
* @author Snailclimb
* @date 2018å¹´9æ19æ¥
* @Description: TODO
*/
public class Solution {
public ListNode ReverseList(ListNode head) {
ListNode next = null;
ListNode pre = null;
while (head != null) {
// ä¿åè¦å转å°å¤´çé£ä¸ªèç¹
next = head.next;
// è¦å转çé£ä¸ªèç¹æåå·²ç»å转çä¸ä¸ä¸ªèç¹(夿³¨:ç¬¬ä¸æ¬¡åè½¬çæ¶å伿ånull)
head.next = pre;
// ä¸ä¸ä¸ªå·²ç»å转å°å¤´é¨çèç¹
pre = head;
// ä¸ç´åé¾è¡¨å°¾èµ°
head = next;
}
return pre;
}
}
```
æµè¯æ¹æ³ï¼
```java
public static void main(String[] args) {
ListNode a = new ListNode(1);
ListNode b = new ListNode(2);
ListNode c = new ListNode(3);
ListNode d = new ListNode(4);
ListNode e = new ListNode(5);
a.next = b;
b.next = c;
c.next = d;
d.next = e;
new Solution().ReverseList(a);
while (e != null) {
System.out.println(e.val);
e = e.next;
}
}
```
è¾åºï¼
```
5
4
3
2
1
```
### 3.3.6 é¾è¡¨ä¸åæ°ç¬¬k个èç¹
#### é¢ç®æè¿°
> åæoffer: è¾å
¥ä¸ä¸ªé¾è¡¨ï¼è¾åºè¯¥é¾è¡¨ä¸åæ°ç¬¬k个ç»ç¹ã
#### é®é¢åæ
> **é¾è¡¨ä¸åæ°ç¬¬k个èç¹ä¹å°±æ¯æ£æ°ç¬¬(L-K+1)个èç¹ï¼ç¥éäºåªä¸ç¹ï¼è¿ä¸é¢åºæ¬å°±æ²¡é®é¢ï¼**
é¦å
两个èç¹/æéï¼ä¸ä¸ªèç¹ node1 å
å¼å§è·ï¼æé node1 è·å° k-1 个èç¹åï¼å¦ä¸ä¸ªèç¹ node2 å¼å§è·ï¼å½ node1 è·å°æåæ¶ï¼node2 ææçèç¹å°±æ¯åæ°ç¬¬k个èç¹ä¹å°±æ¯æ£æ°ç¬¬(L-K+1)个èç¹ã
#### Solution
```java
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
// æ¶é´å¤æåº¦O(n),䏿¬¡éåå³å¯
// https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
public class Solution {
public ListNode FindKthToTail(ListNode head, int k) {
// 妿é¾è¡¨ä¸ºç©ºæè
kå°äºçäº0
if (head == null || k <= 0) {
return null;
}
// 声æä¸¤ä¸ªæå头ç»ç¹çèç¹
ListNode node1 = head, node2 = head;
// è®°å½èç¹ç个æ°
int count = 0;
// è®°å½kå¼ï¼åé¢è¦ä½¿ç¨
int index = k;
// pæéå
è·ï¼å¹¶ä¸è®°å½èç¹æ°ï¼å½node1èç¹è·äºk-1个èç¹åï¼node2èç¹å¼å§è·ï¼
// å½node1èç¹è·å°æåæ¶ï¼node2èç¹ææçèç¹å°±æ¯åæ°ç¬¬k个èç¹
while (node1 != null) {
node1 = node1.next;
count++;
if (k < 1) {
node2 = node2.next;
}
k--;
}
// 妿èç¹ä¸ªæ°å°äºææ±çåæ°ç¬¬k个èç¹ï¼åè¿å空
if (count < index)
return null;
return node2;
}
}
```
### 3.3.7 å é¤é¾è¡¨çåæ°ç¬¬N个èç¹
> Leetcode:ç»å®ä¸ä¸ªé¾è¡¨ï¼å é¤é¾è¡¨çåæ°ç¬¬ n 个èç¹ï¼å¹¶ä¸è¿åé¾è¡¨ç头ç»ç¹ã
**示ä¾ï¼**
```
ç»å®ä¸ä¸ªé¾è¡¨: 1->2->3->4->5, å n = 2.
å½å é¤äºåæ°ç¬¬äºä¸ªèç¹åï¼é¾è¡¨å为 1->2->3->5.
```
**说æï¼**
ç»å®ç n ä¿è¯æ¯ææçã
**è¿é¶ï¼**
ä½ è½å°è¯ä½¿ç¨ä¸è¶æ«æå®ç°åï¼
该é¢å¨ leetcode ä¸æè¯¦ç»è§£çï¼å
·ä½å¯åè Leetcode.
#### é®é¢åæ
æä»¬æ³¨æå°è¿ä¸ªé®é¢å¯ä»¥å®¹æå°ç®åæå¦ä¸ä¸ªé®é¢ï¼å é¤ä»å表å¼å¤´æ°èµ·ç第 (L - n + 1)个ç»ç¹ï¼å
¶ä¸ Læ¯å表çé¿åº¦ãåªè¦æä»¬æ¾å°å表çé¿åº¦ Lï¼è¿ä¸ªé®é¢å°±å¾å®¹æè§£å³ã

#### Solution
**两次éåæ³**
é¦å
æä»¬å°æ·»å ä¸ä¸ª **åç»ç¹** ä½ä¸ºè¾
å©ï¼è¯¥ç»ç¹ä½äºå表头é¨ãåç»ç¹ç¨æ¥ç®åæäºæç«¯æ
åµï¼ä¾å¦å表ä¸åªå«æä¸ä¸ªç»ç¹ï¼æéè¦å é¤å表ç头é¨ãå¨ç¬¬ä¸æ¬¡éåä¸ï¼æä»¬æ¾åºå表çé¿åº¦ Lãç¶å设置ä¸ä¸ªæååç»ç¹çæéï¼å¹¶ç§»å¨å®éåå表ï¼ç´è³å®å°è¾¾ç¬¬ (L - n) 个ç»ç¹é£éã**æä»¬æç¬¬ (L - n)个ç»ç¹ç next æé鿰龿¥è³ç¬¬ (L - n + 2)个ç»ç¹ï¼å®æè¿ä¸ªç®æ³ã**
```java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
// https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/description/
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// åç»ç¹ï¼åç»ç¹ç¨æ¥ç®åæäºæç«¯æ
åµï¼ä¾å¦å表ä¸åªå«æä¸ä¸ªç»ç¹ï¼æéè¦å é¤å表ç头é¨
ListNode dummy = new ListNode(0);
// åç»ç¹æå头ç»ç¹
dummy.next = head;
// ä¿åé¾è¡¨é¿åº¦
int length = 0;
ListNode len = head;
while (len != null) {
length++;
len = len.next;
}
length = length - n;
ListNode target = dummy;
// æ¾å° L-n ä½ç½®çèç¹
while (length > 0) {
target = target.next;
length--;
}
// æç¬¬ (L - n)个ç»ç¹ç next æé鿰龿¥è³ç¬¬ (L - n + 2)个ç»ç¹
target.next = target.next.next;
return dummy.next;
}
}
```
**å¤æåº¦åæï¼**
- **æ¶é´å¤æåº¦ O(L)** ï¼è¯¥ç®æ³å¯¹å表è¿è¡äºä¸¤æ¬¡éåï¼é¦å
计ç®äºå表çé¿åº¦ LL å
¶æ¬¡æ¾å°ç¬¬ (L - n)(Lân) 个ç»ç¹ã æä½æ§è¡äº 2L-n2Lân æ¥ï¼æ¶é´å¤æåº¦ä¸º O(L)O(L)ã
- **空é´å¤æåº¦ O(1)** ï¼æä»¬åªç¨äºå¸¸é级çé¢å¤ç©ºé´ã
**è¿é¶ââ䏿¬¡éåæ³ï¼**
> **é¾è¡¨ä¸åæ°ç¬¬N个èç¹ä¹å°±æ¯æ£æ°ç¬¬(L-N+1)个èç¹ã
å
¶å®è¿ç§æ¹æ³å°±åæä»¬ä¸é¢ç¬¬å颿¾âé¾è¡¨ä¸åæ°ç¬¬k个èç¹âæç¨çææ³æ¯ä¸æ ·çã**åºæ¬æè·¯å°±æ¯ï¼** å®ä¹ä¸¤ä¸ªèç¹ node1ãnode2;node1 èç¹å
è·ï¼node1èç¹ è·å°ç¬¬ n+1 个èç¹çæ¶å,node2 èç¹å¼å§è·.å½node1 èç¹è·å°æåä¸ä¸ªèç¹æ¶ï¼node2 èç¹æå¨çä½ç½®å°±æ¯ç¬¬ ï¼L-n ï¼ ä¸ªèç¹ï¼L代表æ»é¾è¡¨é¿åº¦ï¼ä¹å°±æ¯åæ°ç¬¬ n+1 个èç¹ï¼
```java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
// 声æä¸¤ä¸ªæå头ç»ç¹çèç¹
ListNode node1 = dummy, node2 = dummy;
// node1 èç¹å
è·ï¼node1èç¹ è·å°ç¬¬ n 个èç¹çæ¶å,node2 èç¹å¼å§è·
// å½node1 èç¹è·å°æåä¸ä¸ªèç¹æ¶ï¼node2 èç¹æå¨çä½ç½®å°±æ¯ç¬¬ ï¼L-n ï¼ ä¸ªèç¹ï¼ä¹å°±æ¯åæ°ç¬¬ n+1ï¼L代表æ»é¾è¡¨é¿åº¦ï¼
while (node1 != null) {
node1 = node1.next;
if (n < 1 && node1 != null) {
node2 = node2.next;
}
n--;
}
node2.next = node2.next.next;
return dummy.next;
}
}
```
### 3.3.8 å并两个æåºçé¾è¡¨
**é¢ç®æè¿°ï¼**
> åæoffer:è¾å
¥ä¸¤ä¸ªåè°éå¢çé¾è¡¨ï¼è¾åºä¸¤ä¸ªé¾è¡¨åæåçé¾è¡¨ï¼å½ç¶æä»¬éè¦åæåçé¾è¡¨æ»¡è¶³åè°ä¸åè§åã
**é®é¢åæï¼**
æä»¬å¯ä»¥è¿æ ·åæ:
1. å设æä»¬æä¸¤ä¸ªé¾è¡¨ A,Bï¼
2. Aç头èç¹A1çå¼ä¸Bç头ç»ç¹B1ç弿¯è¾ï¼å设A1å°ï¼åA1为头èç¹ï¼
3. A2ååB1æ¯è¾ï¼å设B1å°,åï¼A1æåB1ï¼
4. A2ååB2æ¯è¾
å°±è¿æ ·å¾ªç¯å¾å¤å°±è¡äºï¼åºè¯¥è¿ç®å¥½çè§£ã
èèéè¿éå½çæ¹å¼å®ç°ï¼
**Solutionï¼**
**éå½çæ¬ï¼**
```java
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
//https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337?tpId=13&tqId=11169&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
if(list1.val <= list2.val){
list1.next = Merge(list1.next, list2);
return list1;
}else{
list2.next = Merge(list1, list2.next);
return list2;
}
}
}
```
### 3.3.9 åæofferé¨åç¼ç¨é¢
#### ææ³¢é£å¥æ°å
**é¢ç®æè¿°ï¼**
大家é½ç¥éææ³¢é£å¥æ°åï¼ç°å¨è¦æ±è¾å
¥ä¸ä¸ªæ´æ°nï¼è¯·ä½ è¾åºææ³¢é£å¥æ°åç第n项ã
n<=39
**é®é¢åæï¼**
å¯ä»¥è¯å®çæ¯è¿ä¸é¢éè¿éå½çæ¹å¼æ¯è¯å®è½ååºæ¥ï¼ä½æ¯è¿æ ·ä¼æä¸ä¸ªå¾å¤§çé®é¢ï¼é£å°±æ¯éå½å¤§éçéå¤è®¡ç®ä¼å¯¼è´å
åæº¢åºãå¦å¤å¯ä»¥ä½¿ç¨è¿ä»£æ³ï¼ç¨fn1åfn2ä¿å计ç®è¿ç¨ä¸çç»æï¼å¹¶å¤ç¨èµ·æ¥ãä¸é¢æä¼æä¸¤ä¸ªæ¹æ³ç¤ºä¾ä»£ç é½ç»åºæ¥å¹¶ç»åºä¸¤ä¸ªæ¹æ³çè¿è¡æ¶é´å¯¹æ¯ã
**示ä¾ä»£ç ï¼**
**éç¨è¿ä»£æ³ï¼**
```java
int Fibonacci(int number) {
if (number <= 0) {
return 0;
}
if (number == 1 || number == 2) {
return 1;
}
int first = 1, second = 1, third = 0;
for (int i = 3; i <= number; i++) {
third = first + second;
first = second;
second = third;
}
return third;
}
```
**éç¨éå½ï¼**
```java
public int Fibonacci(int n) {
if (n <= 0) {
return 0;
}
if (n == 1||n==2) {
return 1;
}
return Fibonacci(n - 2) + Fibonacci(n - 1);
}
```
### 3.3.10 è·³å°é¶é®é¢
#### é¢ç®æè¿°ï¼
ä¸åªéè䏿¬¡å¯ä»¥è·³ä¸1级å°é¶ï¼ä¹å¯ä»¥è·³ä¸2çº§ãæ±è¯¥éèè·³ä¸ä¸ä¸ªn级çå°é¶æ»å
±æå¤å°ç§è·³æ³ã
#### é®é¢åæï¼
**æ£å¸¸åææ³ï¼**
a.妿䏤ç§è·³æ³ï¼1é¶æè
2é¶ï¼é£ä¹åå®ç¬¬ä¸æ¬¡è·³çæ¯ä¸é¶ï¼é£ä¹å©ä¸çæ¯n-1个å°é¶ï¼è·³æ³æ¯f(n-1);
b.åå®ç¬¬ä¸æ¬¡è·³çæ¯2é¶ï¼é£ä¹å©ä¸çæ¯n-2个å°é¶ï¼è·³æ³æ¯f(n-2)
c.ç±aï¼bå设å¯ä»¥å¾åºæ»è·³æ³ä¸º: f(n) = f(n-1) + f(n-2)
d.ç¶åéè¿å®é
çæ
åµå¯ä»¥å¾åºï¼åªæä¸é¶çæ¶å f(1) = 1 ,åªæä¸¤é¶çæ¶åå¯ä»¥æ f(2) = 2
**æ¾è§å¾åææ³ï¼**
f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5ï¼ å¯ä»¥æ»ç»åºf(n) = f(n-1) + f(n-2)çè§å¾ã
使¯ä¸ºä»ä¹ä¼åºç°è¿æ ·çè§å¾å¢ï¼å设ç°å¨6个å°é¶ï¼æä»¬å¯ä»¥ä»ç¬¬5è·³ä¸æ¥å°6ï¼è¿æ ·çè¯æå¤å°ç§æ¹æ¡è·³å°5å°±æå¤å°ç§æ¹æ¡è·³å°6ï¼å¦å¤æä»¬ä¹å¯ä»¥ä»4跳两æ¥è·³å°6ï¼è·³å°4æå¤å°ç§æ¹æ¡çè¯ï¼å°±æå¤å°ç§æ¹æ¡è·³å°6ï¼å
¶ä»çä¸è½ä»3è·³å°6ä»ä¹çå¦ï¼æä»¥æåå°±æ¯f(6) = f(5) + f(4)ï¼è¿æ ·åä¹å¾å¥½çè§£åæè·³å°é¶çé®é¢äºã
**æä»¥è¿éé¢å
¶å®å°±æ¯ææ³¢é£å¥æ°åçé®é¢ã**
代ç åªéè¦å¨ä¸ä¸é¢ç代ç ç¨åä¿®æ¹å³å¯ãåä¸ä¸é¢å¯ä¸ä¸åçå°±æ¯è¿ä¸é¢çåå§å
ç´ å为 1 2 3 5 8.....èä¸ä¸é¢ä¸º1 1 2 3 5 .......ãå¦å¤è¿ä¸é¢ä¹å¯ä»¥ç¨éå½åï¼ä½æ¯é彿ç太ä½ï¼æä»¥æè¿éåªç»åºäºè¿ä»£æ¹å¼ç代ç ã
##### 示ä¾ä»£ç ï¼
```java
int jumpFloor(int number) {
if (number <= 0) {
return 0;
}
if (number == 1) {
return 1;
}
if (number == 2) {
return 2;
}
int first = 1, second = 2, third = 0;
for (int i = 3; i <= number; i++) {
third = first + second;
first = second;
second = third;
}
return third;
}
```
### 3.3.11 åæè·³å°é¶é®é¢
#### é¢ç®æè¿°ï¼
ä¸åªéè䏿¬¡å¯ä»¥è·³ä¸1级å°é¶ï¼ä¹å¯ä»¥è·³ä¸2级â¦â¦å®ä¹å¯ä»¥è·³ä¸nçº§ãæ±è¯¥éèè·³ä¸ä¸ä¸ªn级çå°é¶æ»å
±æå¤å°ç§è·³æ³ã
#### é®é¢åæï¼
å设n>=2ï¼ç¬¬ä¸æ¥ænç§è·³æ³ï¼è·³1级ãè·³2级ãå°è·³n级
è·³1级ï¼å©ä¸n-1级ï¼åå©ä¸è·³æ³æ¯f(n-1)
è·³2级ï¼å©ä¸n-2级ï¼åå©ä¸è·³æ³æ¯f(n-2)
......
è·³n-1级ï¼å©ä¸1级ï¼åå©ä¸è·³æ³æ¯f(1)
è·³n级ï¼å©ä¸0级ï¼åå©ä¸è·³æ³æ¯f(0)
æä»¥å¨n>=2çæ
åµä¸ï¼
f(n)=f(n-1)+f(n-2)+...+f(1)
å 为f(n-1)=f(n-2)+f(n-3)+...+f(1)
æä»¥f(n)=2*f(n-1) åf(1)=1,æä»¥å¯å¾**f(n)=2^(number-1)**
#### 示ä¾ä»£ç ï¼
```java
int JumpFloorII(int number) {
return 1 << --number;//2^(number-1)ç¨ä½ç§»æä½è¿è¡ï¼æ´å¿«
}
```
#### è¡¥å
ï¼
**java䏿ä¸ç§ç§»ä½è¿ç®ç¬¦ï¼**
1. â<<â : **左移è¿ç®ç¬¦**ï¼çåäºä¹2çn次æ¹
2. â>>â: **å³ç§»è¿ç®ç¬¦**ï¼çåäºé¤2çn次æ¹
3. â>>>â **æ 符å·å³ç§»è¿ç®ç¬¦**ï¼ä¸ç®¡ç§»å¨åæé«ä½æ¯0è¿æ¯1ï¼å³ç§»å左侧产çç空ä½é¨åé½ä»¥0æ¥å¡«å
ãä¸>>类似ã
ä¾ï¼
int a = 16;
int b = a << 2;//左移2ï¼çåäº16 * 2ç2次æ¹ï¼ä¹å°±æ¯16 * 4
int c = a >> 2;//å³ç§»2ï¼çåäº16 / 2ç2次æ¹ï¼ä¹å°±æ¯16 / 4
### 3.3.12 äºç»´æ°ç»æ¥æ¾
#### é¢ç®æè¿°ï¼
å¨ä¸ä¸ªäºç»´æ°ç»ä¸ï¼æ¯ä¸è¡é½æç
§ä»å·¦å°å³éå¢çé¡ºåºæåºï¼æ¯ä¸å齿ç
§ä»ä¸å°ä¸éå¢çé¡ºåºæåºãè¯·å®æä¸ä¸ªå½æ°ï¼è¾å
¥è¿æ ·çä¸ä¸ªäºç»´æ°ç»åä¸ä¸ªæ´æ°ï¼å¤ææ°ç»ä¸æ¯å¦å«æè¯¥æ´æ°ã
#### é®é¢è§£æï¼
è¿ä¸éé¢è¿æ¯æ¯è¾ç®åçï¼æä»¬éè¦èèçæ¯å¦ä½åï¼æçæå¿«ãè¿éæä¸ç§å¾å¥½çè§£çæè·¯ï¼
> ç©éµæ¯æåºçï¼ä»å·¦ä¸è§æ¥çï¼å䏿°åéåï¼å峿°åéå¢ï¼
> å æ¤ä»å·¦ä¸è§å¼å§æ¥æ¾ï¼å½è¦æ¥æ¾æ°åæ¯å·¦ä¸è§æ°å大æ¶ãå³ç§»
> è¦æ¥æ¾æ°åæ¯å·¦ä¸è§æ°åå°æ¶ï¼ä¸ç§»ãè¿æ ·æ¾çé度æå¿«ã
#### 示ä¾ä»£ç ï¼
```java
public boolean Find(int target, int [][] array) {
//åºæ¬æè·¯ä»å·¦ä¸è§å¼å§æ¾ï¼è¿æ ·é度æå¿«
int row = array.length-1;//è¡
int column = 0;//å
//å½è¡æ°å¤§äº0ï¼å½ååæ°å°äºæ»åæ°æ¶å¾ªç¯æ¡ä»¶æç«
while((row >= 0)&& (column< array[0].length)){
if(array[row][column] > target){
row--;
}else if(array[row][column] < target){
column++;
}else{
return true;
}
}
return false;
}
```
### 3.3.13 æ¿æ¢ç©ºæ ¼
#### é¢ç®æè¿°ï¼
请å®ç°ä¸ä¸ªå½æ°ï¼å°ä¸ä¸ªå符串ä¸çç©ºæ ¼æ¿æ¢æâ%20âãä¾å¦ï¼å½å符串为We Are Happy.åç»è¿æ¿æ¢ä¹åçå符串为We%20Are%20Happyã
#### é®é¢åæï¼
è¿éé¢ä¸é¾ï¼æä»¬å¯ä»¥éè¿å¾ªç¯å¤æå符串çå符æ¯å¦ä¸ºç©ºæ ¼ï¼æ¯çè¯å°±å©ç¨append()æ¹æ³æ·»å 追å â%20âï¼å¦åè¿æ¯è¿½å åå符ã
æè
æç®åçæ¹æ³å°±æ¯å©ç¨ï¼ replaceAll(String regex,String replacement)æ¹æ³äºï¼ä¸è¡ä»£ç å°±å¯ä»¥è§£å³ã
#### 示ä¾ä»£ç ï¼
**常è§åæ³ï¼**
```java
public String replaceSpace(StringBuffer str) {
StringBuffer out=new StringBuffer();
for (int i = 0; i < str.toString().length(); i++) {
char b=str.charAt(i);
if(String.valueOf(b).equals(" ")){
out.append("%20");
}else{
out.append(b);
}
}
return out.toString();
}
```
**ä¸è¡ä»£ç è§£å³ï¼**
```java
public String replaceSpace(StringBuffer str) {
//return str.toString().replaceAll(" ", "%20");
//public String replaceAll(String regex,String replacement)
//ç¨ç»å®çæ¿æ¢æ¿æ¢ä¸ç»å®çregular expressionå¹é
çæ¤åç¬¦ä¸²çæ¯ä¸ªåå符串ã
//\ 转ä¹å符. å¦æä½ è¦ä½¿ç¨ "\" æ¬èº«, ååºè¯¥ä½¿ç¨ "\\". Stringç±»åä¸çç©ºæ ¼ç¨â\sâè¡¨ç¤ºï¼æä»¥æè¿éçæµ"\\s"å°±æ¯ä»£è¡¨ç©ºæ ¼çææ
return str.toString().replaceAll("\\s", "%20");
}
```
### 3.3.14 æ°å¼çæ´æ°æ¬¡æ¹
#### é¢ç®æè¿°ï¼
ç»å®ä¸ä¸ªdoubleç±»åçæµ®ç¹æ°baseåintç±»åçæ´æ°exponentãæ±baseçexponent次æ¹ã
#### é®é¢è§£æï¼
è¿éé¢ç®æ¯æ¯è¾éº»ç¦åé¾ä¸ç¹çä¸ä¸ªäºãæè¿ééç¨çæ¯**äºåå¹**ææ³ï¼å½ç¶ä¹å¯ä»¥éç¨**å¿«éå¹**ã
æ´å
·åæoffer书ä¸ç»èï¼è¯¥é¢çè§£é¢æè·¯å¦ä¸ï¼
1.å½åºæ°ä¸º0䏿æ°<0æ¶ï¼ä¼åºç°å¯¹0æ±åæ°çæ
åµï¼éè¿è¡é误å¤çï¼è®¾ç½®ä¸ä¸ªå
¨å±åéï¼
2.å¤æåºæ°æ¯å¦çäº0ï¼ç±äºbase为doubleåï¼æä»¥ä¸è½ç´æ¥ç¨==夿
3.ä¼åæ±å¹å½æ°ï¼äºåå¹ï¼ã
å½nä¸ºå¶æ°ï¼a^n =ï¼a^n/2ï¼*ï¼a^n/2ï¼ï¼
å½nä¸ºå¥æ°ï¼a^n = a^[(n-1)/2] * a^[(n-1)/2] * aãæ¶é´å¤æåº¦O(logn)
**æ¶é´å¤æåº¦**ï¼O(logn)
#### 示ä¾ä»£ç ï¼
```java
public class Solution {
boolean invalidInput=false;
public double Power(double base, int exponent) {
//å¦æåºæ°çäº0并䏿æ°å°äº0
//ç±äºbase为doubleåï¼ä¸è½ç´æ¥ç¨==夿
if(equal(base,0.0)&&exponent<0){
invalidInput=true;
return 0.0;
}
int absexponent=exponent;
//å¦æææ°å°äº0ï¼å°ææ°è½¬æ£
if(exponent<0)
absexponent=-exponent;
//getPoweræ¹æ³æ±åºbaseçexponent次æ¹ã
double res=getPower(base,absexponent);
//å¦æææ°å°äº0ï¼æå¾ç»æä¸ºä¸é¢æ±çç»æçåæ°
if(exponent<0)
res=1.0/res;
return res;
}
//æ¯è¾ä¸¤ä¸ªdoubleåå鿝å¦ç¸ççæ¹æ³
boolean equal(double num1,double num2){
if(num1-num2>-0.000001&&num1-num2<0.000001)
return true;
else
return false;
}
//æ±åºbçe次æ¹çæ¹æ³
double getPower(double b,int e){
//å¦æææ°ä¸º0ï¼è¿å1
if(e==0)
return 1.0;
//å¦æææ°ä¸º1ï¼è¿åb
if(e==1)
return b;
//e>>1ç¸çäºe/2ï¼è¿éå°±æ¯æ±a^n =ï¼a^n/2ï¼*ï¼a^n/2ï¼
double result=getPower(b,e>>1);
result*=result;
//å¦æææ°nä¸ºå¥æ°ï¼åè¦åä¹ä¸æ¬¡åºæ°base
if((e&1)==1)
result*=b;
return result;
}
}
```
å½ç¶è¿ä¸é¢ä¹å¯ä»¥éç¨ç¬¨æ¹æ³ï¼ç´¯ä¹ãä¸è¿è¿ç§æ¹æ³çæ¶é´å¤æåº¦ä¸ºOï¼nï¼ï¼è¿æ ·æ²¡æåä¸ç§æ¹æ³æçé«ã
```java
// 使ç¨ç´¯ä¹
public double powerAnother(double base, int exponent) {
double result = 1.0;
for (int i = 0; i < Math.abs(exponent); i++) {
result *= base;
}
if (exponent >= 0)
return result;
else
return 1 / result;
}
```
### 3.3.15 è°æ´æ°ç»é¡ºåºä½¿å¥æ°ä½äºå¶æ°åé¢
#### é¢ç®æè¿°ï¼
è¾å
¥ä¸ä¸ªæ´æ°æ°ç»ï¼å®ç°ä¸ä¸ªå½æ°æ¥è°æ´è¯¥æ°ç»ä¸æ°åç顺åºï¼ä½¿å¾ææç奿°ä½äºæ°ç»çååé¨åï¼ææçå¶æ°ä½äºä½äºæ°ç»çååé¨åï¼å¹¶ä¿è¯å¥æ°å奿°ï¼å¶æ°åå¶æ°ä¹é´çç¸å¯¹ä½ç½®ä¸åã
#### é®é¢è§£æï¼
è¿é颿æºå¤ç§è§£æ³çï¼ç»å¤§å®¶ä»ç»ä¸ç§æè§å¾æºå¥½çè§£çæ¹æ³ï¼
æä»¬é¦å
ç»è®¡å¥æ°ç个æ°å设为n,ç¶åæ°å»ºä¸ä¸ªçé¿æ°ç»ï¼ç¶åéè¿å¾ªç¯å¤æåæ°ç»ä¸çå
ç´ ä¸ºå¶æ°è¿æ¯å¥æ°ã妿æ¯å仿°ç»ä¸æ 0çå
ç´ å¼å§ï¼æè¯¥å¥æ°æ·»å å°æ°æ°ç»ï¼å¦ææ¯å¶æ°å仿°ç»ä¸æ 为nçå
ç´ å¼å§æè¯¥å¶æ°æ·»å å°æ°æ°ç»ä¸ã
#### 示ä¾ä»£ç ï¼
æ¶é´å¤æåº¦ä¸ºOï¼nï¼ï¼ç©ºé´å¤æåº¦ä¸ºOï¼nï¼çç®æ³
```java
public class Solution {
public void reOrderArray(int [] array) {
//妿æ°ç»é¿åº¦çäº0æè
çäº1ï¼ä»ä¹é½ä¸åç´æ¥è¿å
if(array.length==0||array.length==1)
return;
//oddCountï¼ä¿å奿°ä¸ªæ°
//oddBeginï¼å¥æ°ä»æ°ç»å¤´é¨å¼å§æ·»å
int oddCount=0,oddBegin=0;
//æ°å»ºä¸ä¸ªæ°ç»
int[] newArray=new int[array.length];
//计ç®åºï¼æ°ç»ä¸ç奿°ä¸ªæ°ï¼å¼å§æ·»å å
ç´
for(int i=0;i stack1 = new Stack();
Stack stack2 = new Stack();
//彿§è¡pushæä½æ¶ï¼å°å
ç´ æ·»å å°stack1
public void push(int node) {
stack1.push(node);
}
public int pop() {
//å¦æä¸¤ä¸ªéåé½ä¸ºç©ºåæåºå¼å¸¸,说æç¨æ·æ²¡æpushè¿ä»»ä½å
ç´
if(stack1.empty()&&stack2.empty()){
throw new RuntimeException("Queue is empty!");
}
//妿stack2ä¸ä¸ºç©ºç´æ¥å¯¹stack2æ§è¡popæä½ï¼
if(stack2.empty()){
while(!stack1.empty()){
//å°stack1çå
ç´ æåè¿å
åºpushè¿stack2éé¢
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}
```
### 3.3.20 æ çåå
¥,å¼¹åºåºå
#### é¢ç®æè¿°ï¼
è¾å
¥ä¸¤ä¸ªæ´æ°åºåï¼ç¬¬ä¸ä¸ªåºå表示æ çåå
¥é¡ºåºï¼è¯·å¤æç¬¬äºä¸ªåºåæ¯å¦ä¸ºè¯¥æ çå¼¹åºé¡ºåºãå设åå
¥æ çæææ°ååä¸ç¸çãä¾å¦åºå1,2,3,4,5æ¯ææ çåå
¥é¡ºåºï¼åºå4ï¼5,3,2,1æ¯è¯¥åæ åºå对åºçä¸ä¸ªå¼¹åºåºåï¼ä½4,3,5,1,2å°±ä¸å¯è½æ¯è¯¥åæ åºåçå¼¹åºåºåãï¼æ³¨æï¼è¿ä¸¤ä¸ªåºåçé¿åº¦æ¯ç¸ççï¼
#### é¢ç®åæï¼
è¿é颿³äºå天没ææè·¯ï¼åèäºAliasççæ¡ï¼ä»çæè·¯åçä¹å¾è¯¦ç»åºè¯¥å¾å®¹æçæã
ä½è
ï¼Alias
https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106
æ¥æºï¼ç客ç½
ãæè·¯ãåç¨ä¸ä¸ªè¾
å©çæ ï¼éååæ é¡ºåºï¼å
讲第ä¸ä¸ªæ¾å
¥æ ä¸ï¼è¿éæ¯1ï¼ç¶å夿æ é¡¶å
ç´ æ¯ä¸æ¯åºæ 顺åºç第ä¸ä¸ªå
ç´ ï¼è¿éæ¯4ï¼å¾æ¾ç¶1â 4ï¼æä»¥æä»¬ç»§ç»åæ ï¼ç´å°ç¸ç以åå¼å§åºæ ï¼åºæ ä¸ä¸ªå
ç´ ï¼åå°åºæ 顺åºååç§»å¨ä¸ä½ï¼ç´å°ä¸ç¸çï¼è¿æ ·å¾ªç¯çåæ é¡ºåºéå宿ï¼å¦æè¾
婿 è¿ä¸ä¸ºç©ºï¼è¯´æå¼¹åºåºå䏿¯è¯¥æ çå¼¹åºé¡ºåºã
举ä¾ï¼
å
¥æ 1,2,3,4,5
åºæ 4,5,3,2,1
é¦å
1å
¥è¾
婿 ï¼æ¤æ¶æ é¡¶1â 4ï¼ç»§ç»å
¥æ 2
æ¤æ¶æ é¡¶2â 4ï¼ç»§ç»å
¥æ 3
æ¤æ¶æ é¡¶3â 4ï¼ç»§ç»å
¥æ 4
æ¤æ¶æ é¡¶4ï¼4ï¼åºæ 4ï¼å¼¹åºåºåååä¸ä½ï¼æ¤æ¶ä¸º5ï¼,è¾
婿 é颿¯1,2,3
æ¤æ¶æ é¡¶3â 5ï¼ç»§ç»å
¥æ 5
æ¤æ¶æ é¡¶5=5ï¼åºæ 5,å¼¹åºåºåååä¸ä½ï¼æ¤æ¶ä¸º3ï¼,è¾
婿 é颿¯1,2,3
â¦.
便¬¡æ§è¡ï¼æåè¾
婿 为空ã妿ä¸ä¸ºç©ºè¯´æå¼¹åºåºå䏿¯è¯¥æ çå¼¹åºé¡ºåºã
#### èå¯å
容ï¼
æ
#### 示ä¾ä»£ç ï¼
```java
import java.util.ArrayList;
import java.util.Stack;
//è¿é颿²¡æ³åºæ¥ï¼åèäºAliasåå¦ççæ¡ï¼https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
if(pushA.length == 0 || popA.length == 0)
return false;
Stack s = new Stack();
//ç¨äºæ è¯å¼¹åºåºåçä½ç½®
int popIndex = 0;
for(int i = 0; i< pushA.length;i++){
s.push(pushA[i]);
//妿æ ä¸ä¸ºç©ºï¼ä¸æ é¡¶å
ç´ çäºå¼¹åºåºå
while(!s.empty() &&s.peek() == popA[popIndex]){
//åºæ
s.pop();
//å¼¹åºåºåååä¸ä½
popIndex++;
}
}
return s.empty();
}
}
```
## 3.4 æä½ç³»ç»
å¤§å®¶å¥½ï¼ææ¯ Guide å¥ï¼å¾å¤è¯»è
æ±æ¨è®¡ç®æä½ç³»ç»çç¥è¯ç¹æ¯è¾ç¹æï¼èªå·±ä¹æ²¡æå¤å°èå¿å»çï¼ä½æ¯é¢è¯çæ¶ååç»å¸¸ä¼éå°ãæä»¥ï¼æå¸¦çææ´ç好çæä½ç³»ç»ç常è§é®é¢æ¥å¦ï¼è¿ç¯æç« æ»ç»äºä¸äºæè§å¾æ¯è¾éè¦çæä½ç³»ç»ç¸å
³çé®é¢æ¯å¦**è¿ç¨ç®¡ç**ã**å
å管ç**ã**èæå
å**ççã
æç« å½¢å¼éè¿å¤§é¨åæ¯è¾å欢çé¢è¯å®åæ±èè
ä¹é´ç对è¯å½¢å¼å±å¼ãå¦å¤ï¼Guide å¥ä¹åªæ¯å¨å¤§å¦çæ¶åå¦ä¹ è¿æä½ç³»ç»ï¼ä¸è¿åºæ¬é½å¿äºï¼ä¸ºäºåè¿ç¯æç« è¿æ®µæ¶é´çäºå¾å¤ç¸å
³ç书ç±åå客ã妿æä¸æä»»ä½éè¦è¡¥å
åå®åçå°æ¹ï¼ä½ é½å¯ä»¥å¨è¯è®ºåºæåºã妿è§å¾å
容ä¸éçè¯ï¼ä¸è¦å¿è®°ç¹ä¸ªå¨çå¦ï¼
æä¸ªäººè§å¾å¦å¥½æä½ç³»ç»è¿æ¯é常æç¨çï¼å
·ä½å¯ä»¥çææ¨å¤©å¨æçå享ç䏿®µè¯ï¼
è¿ç¯æç« åªæ¯å¯¹ä¸äºæä½ç³»ç»æ¯è¾éè¦æ¦å¿µçä¸ä¸ªæ¦è§ï¼æ·±å
¥å¦ä¹ çè¯ï¼å»ºè®®å¤§å®¶è¿æ¯èèå®å®å°å»ç书ãå¦å¤ï¼ è¿ç¯æç« çå¾å¤å
容åèäºãç°ä»£æä½ç³»ç»ã第ä¸çè¿æ¬ä¹¦ï¼é常æè°¢ã
### ä¸ æä½ç³»ç»åºç¡
é¢è¯å®é¡¶çè¬æ¾çåååæèµ°æ¥ï¼åªè§ä»ä¸ææ¿çåéç Thinkpad ï¼ä¸ææçä»é£æ·¡é»çé¿è£ã
#### 1.1 ä»ä¹æ¯æä½ç³»ç»ï¼
ð¨âð»**é¢è¯å®** ï¼ å
æ¥ä¸ªç®åé®é¢å§ï¼**ä»ä¹æ¯æä½ç³»ç»ï¼**
ð **æ** ï¼æéè¿ä»¥ä¸åç¹åæ¨ä»ç»ä¸ä¸ä»ä¹æ¯æä½ç³»ç»å§ï¼
1. **æä½ç³»ç»ï¼Operating Systemï¼ç®ç§° OSï¼æ¯ç®¡çè®¡ç®æºç¡¬ä»¶ä¸è½¯ä»¶èµæºçç¨åºï¼æ¯è®¡ç®æºç³»ç»çå
æ ¸ä¸åºç³ï¼**
2. **æä½ç³»ç»æ¬è´¨ä¸æ¯è¿è¡å¨è®¡ç®æºä¸ç软件ç¨åº ï¼**
3. **æä½ç³»ç»ä¸ºç¨æ·æä¾ä¸ä¸ªä¸ç³»ç»äº¤äºçæä½çé¢ ï¼**
4. **æä½ç³»ç»åå
æ ¸ä¸å¤å£³ï¼æä»¬å¯ä»¥æå¤å£³çè§£æå´ç»çå
æ ¸çåºç¨ç¨åºï¼èå
æ ¸å°±æ¯è½æä½ç¡¬ä»¶çç¨åºï¼ã**
> å
³äºå
æ ¸å¤æä¸å´ï¼å
æ ¸è´è´£ç®¡çç³»ç»çè¿ç¨ãå
åã设å¤é©±å¨ç¨åºãæä»¶åç½ç»ç³»ç»ççï¼å³å®çç³»ç»çæ§è½åç¨³å®æ§ãæ¯è¿æ¥åºç¨ç¨åºåç¡¬ä»¶çæ¡¥æ¢ã
> å
æ ¸å°±æ¯æä½ç³»ç»èåé»ççæ ¸å¿ã

#### 1.2 ç³»ç»è°ç¨
ð¨âð»**é¢è¯å®** ï¼**ä»ä¹æ¯ç³»ç»è°ç¨å¢ï¼** è½ä¸è½è¯¦ç»ä»ç»ä¸ä¸ã
ð **æ** ï¼ä»ç»ç³»ç»è°ç¨ä¹åï¼æä»¬å
æ¥äºè§£ä¸ä¸ç¨æ·æåç³»ç»æã
æ ¹æ®è¿ç¨è®¿é®èµæºçç¹ç¹ï¼æä»¬å¯ä»¥æè¿ç¨å¨ç³»ç»ä¸çè¿è¡å为两个级å«ï¼
1. ç¨æ·æ(user mode) : ç¨æ·æè¿è¡çè¿ç¨æå¯ä»¥ç´æ¥è¯»åç¨æ·ç¨åºçæ°æ®ã
2. ç³»ç»æ(kernel mode):å¯ä»¥ç®åççè§£ç³»ç»æè¿è¡çè¿ç¨æç¨åºå ä¹å¯ä»¥è®¿é®è®¡ç®æºçä»»ä½èµæºï¼ä¸åéå¶ã
说äºç¨æ·æåç³»ç»æä¹åï¼é£ä¹ä»ä¹æ¯ç³»ç»è°ç¨å¢ï¼
æä»¬è¿è¡çç¨åºåºæ¬é½æ¯è¿è¡å¨ç¨æ·æï¼å¦ææä»¬è°ç¨æä½ç³»ç»æä¾çç³»ç»æçº§å«çååè½ååå¢ï¼é£å°±éè¦ç³»ç»è°ç¨äºï¼
ä¹å°±æ¯è¯´å¨æä»¬è¿è¡çç¨æ·ç¨åºä¸ï¼å¡æ¯ä¸ç³»ç»æçº§å«çèµæºæå
³çæä½ï¼å¦æä»¶ç®¡çãè¿ç¨æ§å¶ãå
å管çç)ï¼é½å¿
é¡»éè¿ç³»ç»è°ç¨æ¹å¼åæä½ç³»ç»æåºæå¡è¯·æ±ï¼å¹¶ç±æä½ç³»ç»ä»£ä¸ºå®æã
è¿äºç³»ç»è°ç¨æåè½å¤§è´å¯å为å¦ä¸å ç±»ï¼
- 设å¤ç®¡çãå®æè®¾å¤çè¯·æ±æéæ¾ï¼ä»¥å设å¤å¯å¨çåè½ã
- æä»¶ç®¡çã宿æä»¶ç读ãåãå建åå é¤çåè½ã
- è¿ç¨æ§å¶ã宿è¿ç¨çåå»ºãæ¤éãé»å¡åå¤éçåè½ã
- è¿ç¨éä¿¡ã宿è¿ç¨ä¹é´çæ¶æ¯ä¼ éæä¿¡å·ä¼ éçåè½ã
- å
å管çã宿å
åçåé
ã忶以åè·åä½ä¸å ç¨å
ååºå¤§å°åå°åçåè½ã
### äº è¿ç¨å线ç¨
#### 2.1 è¿ç¨å线ç¨çåºå«
ð¨âð»**é¢è¯å®**: 好çï¼ææç½äºï¼é£ä½ å说ä¸ä¸ï¼ **è¿ç¨å线ç¨çåºå«**ã
ð **æï¼** 好çï¼ ä¸å¾æ¯ Java å
ååºåï¼æä»¬ä» JVM çè§åº¦æ¥è¯´ä¸ä¸çº¿ç¨åè¿ç¨ä¹é´çå
³ç³»å§ï¼
> å¦æä½ å¯¹ Java å
ååºå (è¿è¡æ¶æ°æ®åº) è¿é¨åç¥è¯ä¸å¤ªäºè§£çè¯å¯ä»¥é
读ä¸ä¸è¿ç¯æç« ï¼[ãå¯è½æ¯æ Java å
ååºåè®²çææ¸
æ¥çä¸ç¯æç« ã](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/jvm/Java%E5%86%85%E5%AD%98%E5%8C%BA%E5%9F%9F.md)

ä»ä¸å¾å¯ä»¥çåºï¼ä¸ä¸ªè¿ç¨ä¸å¯ä»¥æå¤ä¸ªçº¿ç¨ï¼å¤ä¸ªçº¿ç¨å
±äº«è¿ç¨ç**å **å**æ¹æ³åº (JDK1.8 ä¹åçå
空é´)**èµæºï¼ä½æ¯æ¯ä¸ªçº¿ç¨æèªå·±ç**ç¨åºè®¡æ°å¨**ã**èææºæ ** å **æ¬å°æ¹æ³æ **ã
**æ»ç»ï¼** çº¿ç¨æ¯è¿ç¨ååæçæ´å°çè¿è¡åä½,ä¸ä¸ªè¿ç¨å¨å
¶æ§è¡çè¿ç¨ä¸å¯ä»¥äº§çå¤ä¸ªçº¿ç¨ã线ç¨åè¿ç¨æå¤§çä¸åå¨äºåºæ¬ä¸åè¿ç¨æ¯ç¬ç«çï¼èå线ç¨åä¸ä¸å®ï¼å 为åä¸è¿ç¨ä¸ççº¿ç¨ææå¯è½ä¼ç¸äºå½±åãçº¿ç¨æ§è¡å¼éå°ï¼ä½ä¸å©äºèµæºç管çåä¿æ¤ï¼èè¿ç¨æ£ç¸åã
#### 2.2 è¿ç¨æåªå ç§ç¶æ?
ð¨âð»**é¢è¯å®** ï¼ é£ä½ å说说**è¿ç¨æåªå ç§ç¶æ?**
ð **æ** ï¼æä»¬ä¸è¬æè¿ç¨å¤§è´å为 5 ç§ç¶æï¼è¿ä¸ç¹å[线ç¨](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/Multithread/JavaConcurrencyBasicsCommonInterviewQuestionsSummary.md#6-%E8%AF%B4%E8%AF%B4%E7%BA%BF%E7%A8%8B%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E5%92%8C%E7%8A%B6%E6%80%81)å¾åï¼
- **åå»ºç¶æ(new)** ï¼è¿ç¨æ£å¨è¢«å建ï¼å°æªå°å°±ç»ªç¶æã
- **å°±ç»ªç¶æ(ready)** ï¼è¿ç¨å·²å¤äºåå¤è¿è¡ç¶æï¼å³è¿ç¨è·å¾äºé¤äºå¤çå¨ä¹å¤çä¸åæéèµæºï¼ä¸æ¦å¾å°å¤çå¨èµæº(å¤çå¨åé
çæ¶é´ç)å³å¯è¿è¡ã
- **è¿è¡ç¶æ(running)** ï¼è¿ç¨æ£å¨å¤çå¨ä¸ä¸è¿è¡(åæ ¸ CPU ä¸ä»»ææ¶å»åªæä¸ä¸ªè¿ç¨å¤äºè¿è¡ç¶æ)ã
- **é»å¡ç¶æ(waiting)** ï¼å称为çå¾
ç¶æï¼è¿ç¨æ£å¨çå¾
æä¸äºä»¶èæåè¿è¡å¦çå¾
æèµæºä¸ºå¯ç¨æçå¾
IO æä½å®æãå³ä½¿å¤çå¨ç©ºé²ï¼è¯¥è¿ç¨ä¹ä¸è½è¿è¡ã
- **ç»æç¶æ(terminated)** ï¼è¿ç¨æ£å¨ä»ç³»ç»ä¸æ¶å¤±ãå¯è½æ¯è¿ç¨æ£å¸¸ç»ææå
¶ä»åå 䏿éåºè¿è¡ã

#### 2.3 è¿ç¨é´çéä¿¡æ¹å¼
ð¨âð»**é¢è¯å®** ï¼**è¿ç¨é´çé信常è§ççæåªå ç§æ¹å¼å¢?**
ð **æ** ï¼å¤§æ¦æ 7 ç§å¸¸è§çè¿ç¨é´çéä¿¡æ¹å¼ã
> ä¸é¢è¿é¨åæ»ç»åèäº:[ãè¿ç¨é´éä¿¡ IPC (InterProcess Communication)ã](https://www.jianshu.com/p/c1015f5ffa74) è¿ç¯æç« ï¼æ¨èé
è¯»ï¼æ»ç»çé常ä¸éã
1. **管é/å¿å管é(Pipes)** ï¼ç¨äºå
·æäº²ç¼å
³ç³»çç¶åè¿ç¨é´æè
å
å¼è¿ç¨ä¹é´çéä¿¡ã
1. **æå管é(Names Pipes)** : å¿å管éç±äºæ²¡æååï¼åªè½ç¨äºäº²ç¼å
³ç³»çè¿ç¨é´éä¿¡ã为äºå
æè¿ä¸ªç¼ºç¹ï¼æåºäºæå管éãæå管éä¸¥æ ¼éµå¾ª**å
è¿å
åº(first in first out)**ãæå管é以ç£çæä»¶çæ¹å¼åå¨ï¼å¯ä»¥å®ç°æ¬æºä»»æä¸¤ä¸ªè¿ç¨éä¿¡ã
1. **ä¿¡å·(Signal)** ï¼ä¿¡å·æ¯ä¸ç§æ¯è¾å¤æçéä¿¡æ¹å¼ï¼ç¨äºéç¥æ¥æ¶è¿ç¨æä¸ªäºä»¶å·²ç»åçï¼
1. **æ¶æ¯éå(Message Queuing)** ï¼æ¶æ¯éåæ¯æ¶æ¯çé¾è¡¨,å
·æç¹å®çæ ¼å¼,åæ¾å¨å
åä¸å¹¶ç±æ¶æ¯éåæ è¯ç¬¦æ è¯ã管éåæ¶æ¯éåçéä¿¡æ°æ®é½æ¯å
è¿å
åºçååãä¸ç®¡éï¼æ å管éï¼åªåå¨äºå
åä¸çæä»¶ï¼å½å管éï¼åå¨äºå®é
çç£çä»è´¨æè
æä»¶ç³»ç»ï¼ä¸åçæ¯æ¶æ¯éååæ¾å¨å
æ ¸ä¸ï¼åªæå¨å
æ ¸éå¯(å³ï¼æä½ç³»ç»éå¯)æè
æ¾ç¤ºå°å é¤ä¸ä¸ªæ¶æ¯éåæ¶ï¼è¯¥æ¶æ¯éåæä¼è¢«çæ£çå é¤ãæ¶æ¯éåå¯ä»¥å®ç°æ¶æ¯çéæºæ¥è¯¢,æ¶æ¯ä¸ä¸å®è¦ä»¥å
è¿å
åºç次åºè¯»å,ä¹å¯ä»¥ææ¶æ¯çç±»å读å.æ¯ FIFO æ´æä¼å¿ã**æ¶æ¯éåå
æäºä¿¡å·æ¿è½½ä¿¡æ¯éå°ï¼ç®¡éåªè½æ¿è½½æ æ ¼å¼å èæµä»¥åç¼å²åºå¤§å°åéç缺ã**
1. **ä¿¡å·é(Semaphores)** ï¼ä¿¡å·éæ¯ä¸ä¸ªè®¡æ°å¨ï¼ç¨äºå¤è¿ç¨å¯¹å
±äº«æ°æ®ç访é®ï¼ä¿¡å·éçæå¾å¨äºè¿ç¨é´åæ¥ãè¿ç§éä¿¡æ¹å¼ä¸»è¦ç¨äºè§£å³ä¸åæ¥ç¸å
³çé®é¢å¹¶é¿å
ç«äºæ¡ä»¶ã
1. **å
±äº«å
å(Shared memory)** ï¼ä½¿å¾å¤ä¸ªè¿ç¨å¯ä»¥è®¿é®åä¸åå
å空é´ï¼ä¸åè¿ç¨å¯ä»¥åæ¶çå°å¯¹æ¹è¿ç¨ä¸å¯¹å
±äº«å
å䏿°æ®çæ´æ°ãè¿ç§æ¹å¼éè¦ä¾é æç§åæ¥æä½ï¼å¦äºæ¥éåä¿¡å·éçãå¯ä»¥è¯´è¿æ¯ææç¨çè¿ç¨é´éä¿¡æ¹å¼ã
1. **奿¥å(Sockets)** : æ¤æ¹æ³ä¸»è¦ç¨äºå¨å®¢æ·ç«¯åæå¡å¨ä¹é´éè¿ç½ç»è¿è¡éä¿¡ã奿¥åæ¯æ¯æ TCP/IP çç½ç»éä¿¡çåºæ¬æä½åå
ï¼å¯ä»¥ç忝ä¸å主æºä¹é´çè¿ç¨è¿è¡ååéä¿¡ç端ç¹ï¼ç®åç说就æ¯éä¿¡ç两æ¹çä¸ç§çº¦å®ï¼ç¨å¥æ¥åä¸çç¸å
³å½æ°æ¥å®æéä¿¡è¿ç¨ã
#### 2.4 线ç¨é´çåæ¥çæ¹å¼
ð¨âð»**é¢è¯å®** ï¼**é£çº¿ç¨é´çåæ¥çæ¹å¼æåªäºå¢?**
ð **æ** ï¼çº¿ç¨åæ¥æ¯ä¸¤ä¸ªæå¤ä¸ªå
±äº«å
³é®èµæºç线ç¨çå¹¶åæ§è¡ãåºè¯¥åæ¥çº¿ç¨ä»¥é¿å
å
³é®çèµæºä½¿ç¨å²çªãæä½ç³»ç»ä¸è¬æä¸é¢ä¸ç§çº¿ç¨åæ¥çæ¹å¼ï¼
1. **äºæ¥é(Mutex)**ï¼éç¨äºæ¥å¯¹è±¡æºå¶ï¼åªææ¥æäºæ¥å¯¹è±¡ççº¿ç¨ææè®¿é®å
Œ
±èµæºçæéãå ä¸ºäºæ¥å¯¹è±¡åªæä¸ä¸ªï¼æä»¥å¯ä»¥ä¿è¯å
Œ
±èµæºä¸ä¼è¢«å¤ä¸ªçº¿ç¨åæ¶è®¿é®ãæ¯å¦ Java ä¸ç synchronized å
³é®è¯ååç§ Lock 齿¯è¿ç§æºå¶ã
1. **ä¿¡å·é(Semphares)** ï¼å®å
许å䏿¶å»å¤ä¸ªçº¿ç¨è®¿é®åä¸èµæºï¼ä½æ¯éè¦æ§å¶å䏿¶å»è®¿é®æ¤èµæºçæå¤§çº¿ç¨æ°é
1. **äºä»¶(Event)** :Wait/Notifyï¼éè¿éç¥æä½çæ¹å¼æ¥ä¿æå¤çº¿ç¨åæ¥ï¼è¿å¯ä»¥æ¹ä¾¿çå®ç°å¤çº¿ç¨ä¼å
çº§çæ¯è¾æ
#### 2.5 è¿ç¨çè°åº¦ç®æ³
ð¨âð»**é¢è¯å®** ï¼**ä½ ç¥éæä½ç³»ç»ä¸è¿ç¨çè°åº¦ç®æ³æåªäºå?**
ð **æ** ï¼å¯å¯ï¼è¿ä¸ªæä»¬å¤§å¦çæ¶åå¦è¿ï¼æ¯ä¸ä¸ªå¾éè¦çç¥è¯ç¹ï¼
为äºç¡®å®é¦å
æ§è¡åªä¸ªè¿ç¨ä»¥åæåæ§è¡åªä¸ªè¿ç¨ä»¥å®ç°æå¤§ CPU å©ç¨çï¼è®¡ç®æºç§å¦å®¶å·²ç»å®ä¹äºä¸äºç®æ³ï¼å®ä»¬æ¯ï¼
- **å
å°å
æå¡(FCFS)è°åº¦ç®æ³** : ä»å°±ç»ªéåä¸éæ©ä¸ä¸ªæå
è¿å
¥è¯¥éåçè¿ç¨ä¸ºä¹åé
èµæºï¼ä½¿å®ç«å³æ§è¡å¹¶ä¸ç´æ§è¡å°å®ææåçæäºä»¶è被é»å¡æ¾å¼å ç¨ CPU æ¶åéæ°è°åº¦ã
- **çä½ä¸ä¼å
(SJF)çè°åº¦ç®æ³** : ä»å°±ç»ªéåä¸éåºä¸ä¸ªä¼°è®¡è¿è¡æ¶é´æççè¿ç¨ä¸ºä¹åé
èµæºï¼ä½¿å®ç«å³æ§è¡å¹¶ä¸ç´æ§è¡å°å®ææåçæäºä»¶è被é»å¡æ¾å¼å ç¨ CPU æ¶åéæ°è°åº¦ã
- **æ¶é´ç轮转è°åº¦ç®æ³** : æ¶é´ç轮转è°åº¦æ¯ä¸ç§æå¤èï¼æç®åï¼æå
¬å¹³ä¸ä½¿ç¨æå¹¿çç®æ³ï¼åç§° RR(Round robin)è°åº¦ãæ¯ä¸ªè¿ç¨è¢«åé
ä¸ä¸ªæ¶é´æ®µï¼ç§°ä½å®çæ¶é´çï¼å³è¯¥è¿ç¨å
许è¿è¡çæ¶é´ã
- **å¤çº§åé¦éåè°åº¦ç®æ³** ï¼åé¢ä»ç»çå ç§è¿ç¨è°åº¦çç®æ³é½æä¸å®çå±éæ§ãå¦**çè¿ç¨ä¼å
çè°åº¦ç®æ³ï¼ä»
ç
§é¡¾äºçè¿ç¨è忽ç¥äºé¿è¿ç¨** ãå¤çº§åé¦éåè°åº¦ç®æ³æ¢è½ä½¿é«ä¼å
级çä½ä¸å¾å°ååºåè½ä½¿çä½ä¸ï¼è¿ç¨ï¼è¿
é宿ãï¼å è宿¯ç®å**被å
¬è®¤çä¸ç§è¾å¥½çè¿ç¨è°åº¦ç®æ³**ï¼UNIX æä½ç³»ç»éåç便æ¯è¿ç§è°åº¦ç®æ³ã
- **ä¼å
级è°åº¦** ï¼ ä¸ºæ¯ä¸ªæµç¨åé
ä¼å
级ï¼é¦å
æ§è¡å
·ææé«ä¼å
级çè¿ç¨ï¼ä¾æ¤ç±»æ¨ãå
·æç¸åä¼å
级çè¿ç¨ä»¥ FCFS æ¹å¼æ§è¡ãå¯ä»¥æ ¹æ®å
åè¦æ±ï¼æ¶é´è¦æ±æä»»ä½å
¶ä»èµæºè¦æ±æ¥ç¡®å®ä¼å
级ã
### ä¸ æä½ç³»ç»å
å管çåºç¡
#### 3.1 å
å管çä»ç»
ð¨âð» **é¢è¯å®**: **æä½ç³»ç»çå
å管çä¸»è¦æ¯åä»ä¹ï¼**
ð **æï¼** æä½ç³»ç»çå
å管ç主è¦è´è´£å
åçåé
ä¸åæ¶ï¼malloc 彿°ï¼ç³è¯·å
åï¼free 彿°ï¼éæ¾å
åï¼ï¼å¦å¤å°å转æ¢ä¹å°±æ¯å°é»è¾å°åè½¬æ¢æç¸åºçç©çå°åçåè½ä¹æ¯æä½ç³»ç»å
å管çåçäºæ
ã
#### 3.2 常è§çå ç§å
åç®¡çæºå¶
ð¨âð» **é¢è¯å®**: **æä½ç³»ç»çå
åç®¡çæºå¶äºè§£åï¼å
å管çæåªå ç§æ¹å¼?**
ð **æï¼** è¿ä¸ªå¨å¦ä¹ æä½ç³»ç»çæ¶åæäºè§£è¿ã
ç®åå为**è¿ç»åé
ç®¡çæ¹å¼**å**éè¿ç»åé
ç®¡çæ¹å¼**è¿ä¸¤ç§ãè¿ç»åé
ç®¡çæ¹å¼æ¯æä¸ºä¸ä¸ªç¨æ·ç¨åºåé
ä¸ä¸ªè¿ç»çå
å空é´ï¼å¸¸è§çå¦ **åå¼ç®¡ç** ãåæ ·å°ï¼éè¿ç»åé
ç®¡çæ¹å¼å
许ä¸ä¸ªç¨åºä½¿ç¨çå
ååå¸å¨ç¦»æ£æè
说ä¸ç¸é»çå
åä¸ï¼å¸¸è§çå¦**页å¼ç®¡ç** å **段å¼ç®¡ç**ã
1. **åå¼ç®¡ç** ï¼ è¿å¤æ¶ä»£çè®¡ç®æºæç³»ç»çå
åç®¡çæ¹å¼ãå°å
åå为å 个åºå®å¤§å°çåï¼æ¯ä¸ªåä¸åªå
å«ä¸ä¸ªè¿ç¨ã妿ç¨åºè¿è¡éè¦å
åçè¯ï¼æä½ç³»ç»å°±åé
ç»å®ä¸åï¼å¦æç¨åºè¿è¡åªéè¦å¾å°ç空é´çè¯ï¼åé
çè¿åå
åå¾å¤§ä¸é¨åå ä¹è¢«æµªè´¹äºãè¿äºå¨æ¯ä¸ªå䏿ªè¢«å©ç¨ç空é´ï¼æä»¬ç§°ä¹ä¸ºç¢çã
2. **页å¼ç®¡ç** ï¼æä¸»åå为大å°ç¸çä¸åºå®çä¸é¡µä¸é¡µçå½¢å¼ï¼é¡µè¾å°ï¼ç¸å¯¹ç¸æ¯äºåå¼ç®¡ççååå度æ´å¤§ï¼æé«äºå
åå©ç¨çï¼åå°äºç¢çã页å¼ç®¡çéè¿é¡µè¡¨å¯¹åºé»è¾å°ååç©çå°åã
3. **段å¼ç®¡ç** ï¼ é¡µå¼ç®¡çè½ç¶æé«äºå
åå©ç¨çï¼ä½æ¯é¡µå¼ç®¡çå
¶ä¸ç页å®é
å¹¶æ ä»»ä½å®é
æä¹ã 段å¼ç®¡çæä¸»ååä¸ºä¸æ®µæ®µçï¼æ¯ä¸æ®µç空é´åè¦æ¯ä¸é¡µç空é´å°å¾å¤ ã使¯ï¼æéè¦çæ¯æ®µæ¯æå®é
æä¹çï¼æ¯ä¸ªæ®µå®ä¹äºä¸ç»é»è¾ä¿¡æ¯ï¼ä¾å¦,æä¸»ç¨åºæ®µ MAINãåç¨åºæ®µ Xãæ°æ®æ®µ D åæ æ®µ S çã æ®µå¼ç®¡çéè¿æ®µè¡¨å¯¹åºé»è¾å°ååç©çå°åã
ð¨âð»**é¢è¯å®** ï¼ åççè¿ä¸éï¼ä¸è¿æ¼æäºä¸ä¸ªå¾éè¦ç **段页å¼ç®¡çæºå¶** ãæ®µé¡µå¼ç®¡çæºå¶ç»åäºæ®µå¼ç®¡çå页å¼ç®¡ççä¼ç¹ãç®åæ¥è¯´æ®µé¡µå¼ç®¡çæºå¶å°±æ¯æä¸»åå
åæè¥å¹²æ®µï¼æ¯ä¸ªæ®µååæè¥å¹²é¡µï¼ä¹å°±æ¯è¯´ **段页å¼ç®¡çæºå¶** 䏿®µä¸æ®µä¹é´ä»¥å段çå
é¨ç齿¯ç¦»æ£çã
ð **æ** ï¼è°¢è°¢é¢è¯å®ï¼ååæè¿ä¸ªç»å¿è®°äºï½
#### 3.3 快表åå¤çº§é¡µè¡¨
ð¨âð»**é¢è¯å®** ï¼ é¡µè¡¨ç®¡çæºå¶ä¸æä¸¤ä¸ªå¾éè¦çæ¦å¿µï¼å¿«è¡¨åå¤çº§é¡µè¡¨ï¼è¿ä¸¤ä¸ªä¸è¥¿åå«è§£å³äºé¡µè¡¨ç®¡çä¸å¾éè¦ç两个é®é¢ãä½ ç»æç®åä»ç»ä¸ä¸å§ï¼
ð **æ** ï¼å¨å页å
å管çä¸ï¼å¾éè¦çä¸¤ç¹æ¯ï¼
1. èæå°åå°ç©çå°åç转æ¢è¦å¿«ã
2. è§£å³èæå°å空é´å¤§ï¼é¡µè¡¨ä¹ä¼å¾å¤§çé®é¢ã
##### 快表
为äºè§£å³èæå°åå°ç©çå°åç转æ¢éåº¦ï¼æä½ç³»ç»å¨ **é¡µè¡¨æ¹æ¡** åºç¡ä¹ä¸å¼å
¥äº **快表** æ¥å éèæå°åå°ç©çå°åç转æ¢ãæä»¬å¯ä»¥æå表ç解为ä¸ç§ç¹æ®çé«éç¼å²åå¨å¨ï¼Cacheï¼ï¼å
¶ä¸çå
容æ¯é¡µè¡¨çä¸é¨åæè
å
¨é¨å
容ãä½ä¸ºé¡µè¡¨ç Cacheï¼å®çä½ç¨ä¸é¡µè¡¨ç¸ä¼¼ï¼ä½æ¯æé«äºè®¿é®éçãç±äºéç¨é¡µè¡¨åå°å转æ¢ï¼è¯»åå
åæ°æ®æ¶ CPU è¦è®¿é®ä¸¤æ¬¡ä¸»åãæäºå¿«è¡¨ï¼ææ¶åªè¦è®¿é®ä¸æ¬¡é«éç¼å²åå¨å¨ï¼ä¸æ¬¡ä¸»åï¼è¿æ ·å¯å 鿥æ¾å¹¶æé«æä»¤æ§è¡é度ã
使ç¨å¿«è¡¨ä¹åçå°åè½¬æ¢æµç¨æ¯è¿æ ·çï¼
1. æ ¹æ®èæå°åä¸ç页巿¥å¿«è¡¨ï¼
2. å¦æè¯¥é¡µå¨å¿«è¡¨ä¸ï¼ç´æ¥ä»å¿«è¡¨ä¸è¯»åç¸åºçç©çå°åï¼
3. å¦æè¯¥é¡µä¸å¨å¿«è¡¨ä¸ï¼å°±è®¿é®å
åä¸ç页表ï¼åä»é¡µè¡¨ä¸å¾å°ç©çå°åï¼åæ¶å°é¡µè¡¨ä¸ç该æ å°è¡¨é¡¹æ·»å å°å¿«è¡¨ä¸ï¼
4. å½å¿«è¡¨å¡«æ»¡åï¼åè¦ç»è®°æ°é¡µæ¶ï¼å°±æç
§ä¸å®çæ·æ±°çç¥æ·æ±°æå¿«è¡¨ä¸çä¸ä¸ªé¡µã
çå®äºä¹åä½ ä¼åç°å¿«è¡¨åæä»¬å¹³æ¶ç»å¸¸å¨æä»¬å¼åçç³»ç»ä½¿ç¨çç¼åï¼æ¯å¦ Redisï¼å¾åï¼çç¡®æ¯è¿æ ·çï¼æä½ç³»ç»ä¸çå¾å¤ææ³ãå¾å¤ç»å
¸çç®æ³ï¼ä½ é½å¯ä»¥å¨æä»¬æ¥å¸¸å¼å使ç¨çåç§å·¥å
·æè
æ¡æ¶ä¸æ¾å°å®ä»¬çå½±åã
##### å¤çº§é¡µè¡¨
å¼å
¥å¤çº§é¡µè¡¨ç主è¦ç®çæ¯ä¸ºäºé¿å
æå
¨é¨é¡µè¡¨ä¸ç´æ¾å¨å
åä¸å ç¨è¿å¤ç©ºé´ï¼ç¹å«æ¯é£äºæ ¹æ¬å°±ä¸éè¦ç页表就ä¸éè¦ä¿çå¨å
åä¸ãå¤çº§é¡µè¡¨å±äºæ¶é´æ¢ç©ºé´çå
¸ååºæ¯ï¼å
·ä½å¯ä»¥æ¥çä¸é¢è¿ç¯æç«
- å¤çº§é¡µè¡¨å¦ä½è约å
åï¼[https://www.polarxiong.com/archives/å¤çº§é¡µè¡¨å¦ä½è约å
å.html](https://www.polarxiong.com/archives/å¤çº§é¡µè¡¨å¦ä½è约å
å.html)
##### æ»ç»
ä¸ºäºæé«å
åçç©ºé´æ§è½ï¼æåºäºå¤çº§é¡µè¡¨çæ¦å¿µï¼ä½æ¯æå°ç©ºé´æ§è½æ¯ä»¥æµªè´¹æ¶é´æ§è½ä¸ºåºç¡çï¼å æ¤ä¸ºäºè¡¥å
æå¤±çæ¶é´æ§è½ï¼æåºäºå¿«è¡¨ï¼å³ TLBï¼çæ¦å¿µã ä¸è®ºæ¯å¿«è¡¨è¿æ¯å¤çº§é¡µè¡¨å®é
ä¸é½å©ç¨å°äºç¨åºçå±é¨æ§åçï¼å±é¨æ§åçå¨åé¢çèæå
åè¿é¨åä¼ä»ç»å°ã
#### 3.4 å页æºå¶ååæ®µæºå¶çå
±åç¹ååºå«
ð¨âð»**é¢è¯å®** ï¼ **å页æºå¶ååæ®µæºå¶æåªäºå
±åç¹ååºå«å¢ï¼**
ð **æ** ï¼
1. **å
±åç¹** ï¼
- å页æºå¶ååæ®µæºå¶é½æ¯ä¸ºäºæé«å
åå©ç¨çï¼è¾å°å
åç¢çã
- 页忮µé½æ¯ç¦»æ£åå¨çï¼æä»¥ä¸¤è
齿¯ç¦»æ£åé
å
åçæ¹å¼ã使¯ï¼æ¯ä¸ªé¡µå段ä¸çå
忝è¿ç»çã
2. **åºå«** ï¼
- 页ç大尿¯åºå®çï¼ç±æä½ç³»ç»å³å®ï¼è段ç大å°ä¸åºå®ï¼åå³äºæä»¬å½åè¿è¡çç¨åºã
- å页ä»
ä»
æ¯ä¸ºäºæ»¡è¶³æä½ç³»ç»å
å管ççéæ±ï¼è段æ¯é»è¾ä¿¡æ¯çåä½ï¼å¨ç¨åºä¸å¯ä»¥ä½ç°ä¸ºä»£ç æ®µï¼æ°æ®æ®µï¼è½å¤æ´å¥½æ»¡è¶³ç¨æ·çéè¦ã
#### 3.5 é»è¾(èæ)å°ååç©çå°å
ð¨âð»**é¢è¯å®** ï¼ä½ ååè¿æå°äº**é»è¾å°ååç©çå°å**è¿ä¸¤ä¸ªæ¦å¿µï¼æä¸å¤ªæ¸
æ¥ï¼ä½ è½ä¸ºæè§£éä¸ä¸ä¸ï¼
ð **æï¼** em...好çåï¼æä»¬ç¼ç¨ä¸è¬åªæå¯è½åé»è¾å°åæäº¤éï¼æ¯å¦å¨ C è¯è¨ä¸ï¼æééé¢åå¨çæ°å¼å°±å¯ä»¥çè§£æä¸ºå
åéçä¸ä¸ªå°åï¼è¿ä¸ªå°åä¹å°±æ¯æä»¬è¯´çé»è¾å°åï¼é»è¾å°åç±æä½ç³»ç»å³å®ãç©çå°åæçæ¯çå®ç©çå
åä¸å°åï¼æ´å
·ä½ä¸ç¹æ¥è¯´å°±æ¯å
åå°åå¯åå¨ä¸çå°åãç©çå°åæ¯å
ååå
çæ£çå°åã
#### 3.6 CPU 寻åäºè§£å?为ä»ä¹éè¦èæå°å空é´?
ð¨âð»**é¢è¯å®** ï¼**CPU 寻åäºè§£å?为ä»ä¹éè¦èæå°å空é´?**
ð **æ** ï¼è¿é¨åæç䏿¸
æ¥ï¼
äºæ¯é¢è¯å®ä¹åæé»é»å»æ¥é
äºç¸å
³ææ¡£ï¼çä¸äºæ²¡æææ¯ç泪水ããã
> è¿é¨åå
容åèäº Microsoft å®ç½çä»ç»ï¼å°åï¼
ç°ä»£å¤çå¨ä½¿ç¨çæ¯ä¸ç§ç§°ä¸º **èæå¯»å(Virtual Addressing)** ç坻忹å¼ã**使ç¨èæå¯»åï¼CPU éè¦å°èæå°åç¿»è¯æç©çå°åï¼è¿æ ·æè½è®¿é®å°çå®çç©çå
åã** å®é
ä¸å®æèæå°å转æ¢ä¸ºç©çå°å转æ¢çç¡¬ä»¶æ¯ CPU ä¸å«æä¸ä¸ªè¢«ç§°ä¸º **å
å管çåå
ï¼Memory Management Unit, MMUï¼** ç硬件ãå¦ä¸å¾æç¤ºï¼

**为ä»ä¹è¦æèæå°å空é´å¢ï¼**
å
仿²¡æèæå°å空é´çæ¶å说起å§ï¼æ²¡æèæå°å空é´çæ¶åï¼**ç¨åºé½æ¯ç´æ¥è®¿é®åæä½ç齿¯ç©çå
å** ã使¯è¿æ ·æä»ä¹é®é¢å¢ï¼
1. ç¨æ·ç¨åºå¯ä»¥è®¿é®ä»»æå
åï¼å¯»åå
åçæ¯ä¸ªåèï¼è¿æ ·å°±å¾å®¹æï¼æææè
æ æï¼ç ´åæä½ç³»ç»ï¼é ææä½ç³»ç»å´©æºã
2. æ³è¦åæ¶è¿è¡å¤ä¸ªç¨åºç¹å«å°é¾ï¼æ¯å¦ä½ æ³åæ¶è¿è¡ä¸ä¸ªå¾®ä¿¡åä¸ä¸ª QQ é³ä¹é½ä¸è¡ã为ä»ä¹å¢ï¼ä¸¾ä¸ªç®åçä¾åï¼å¾®ä¿¡å¨è¿è¡çæ¶åç»å
åå°å 1xxx èµå¼åï¼QQ é³ä¹ä¹åæ ·ç»å
åå°å 1xxx èµå¼ï¼é£ä¹ QQ é³ä¹å¯¹å
åçèµå¼å°±ä¼è¦ç微信ä¹åæèµçå¼ï¼è¿å°±é æäºå¾®ä¿¡è¿ä¸ªç¨åºå°±ä¼å´©æºã
**æ»ç»æ¥è¯´ï¼å¦æç´æ¥æç©çå°åæ´é²åºæ¥çè¯ä¼å¸¦æ¥ä¸¥éé®é¢ï¼æ¯å¦å¯è½å¯¹æä½ç³»ç»é æä¼¤å®³ä»¥åç»åæ¶è¿è¡å¤ä¸ªç¨åºé æå°é¾ã**
éè¿èæå°å访é®å
åæä»¥ä¸ä¼å¿ï¼
- ç¨åºå¯ä»¥ä½¿ç¨ä¸ç³»åç¸é»çèæå°åæ¥è®¿é®ç©çå
åä¸ä¸ç¸é»ç大å
åç¼å²åºã
- ç¨åºå¯ä»¥ä½¿ç¨ä¸ç³»åèæå°åæ¥è®¿é®å¤§äºå¯ç¨ç©çå
åçå
åç¼å²åºãå½ç©çå
åçä¾åºéåå°æ¶ï¼å
å管çå¨ä¼å°ç©çå
å页ï¼é常大å°ä¸º 4 KBï¼ä¿åå°ç£çæä»¶ãæ°æ®æä»£ç 页伿 ¹æ®éè¦å¨ç©çå
åä¸ç£çä¹é´ç§»å¨ã
- ä¸åè¿ç¨ä½¿ç¨çèæå°åå½¼æ¤é离ãä¸ä¸ªè¿ç¨ä¸çä»£ç æ æ³æ´æ¹æ£å¨ç±å¦ä¸è¿ç¨ææä½ç³»ç»ä½¿ç¨çç©çå
åã
### å èæå
å
#### 4.1 ä»ä¹æ¯èæå
å(Virtual Memory)?
ð¨âð»**é¢è¯å®** ï¼åé®ä½ ä¸ä¸ªå¸¸è¯æ§çé®é¢ï¼**ä»ä¹æ¯èæå
å(Virtual Memory)?**
ð **æ** ï¼è¿ä¸ªå¨æä»¬å¹³æ¶ä½¿ç¨çµèç¹å«æ¯ Windows ç³»ç»çæ¶å太常è§äºãå¾å¤æ¶åæä»¬ä½¿ç¨ç¹å¼äºå¾å¤å å
åç软件ï¼è¿äºè½¯ä»¶å ç¨çå
åå¯è½å·²ç»è¿è¿è¶
åºäºæä»¬çµèæ¬èº«å
·æçç©çå
åã**为ä»ä¹å¯ä»¥è¿æ ·å¢ï¼** æ£æ¯å 为 **èæå
å** çåå¨ï¼éè¿ **èæå
å** å¯ä»¥è®©ç¨åºå¯ä»¥æ¥æè¶
è¿ç³»ç»ç©çå
å大å°çå¯ç¨å
å空é´ãå¦å¤ï¼**èæå
å为æ¯ä¸ªè¿ç¨æä¾äºä¸ä¸ªä¸è´çãç§æçå°å空é´ï¼å®è®©æ¯ä¸ªè¿ç¨äº§çäºä¸ç§èªå·±å¨ç¬äº«ä¸»åçéè§ï¼æ¯ä¸ªè¿ç¨æ¥æä¸çè¿ç»å®æ´çå
å空é´ï¼**ãè¿æ ·ä¼æ´å ææå°ç®¡çå
åå¹¶åå°åºéã
**èæå
å**æ¯è®¡ç®æºç³»ç»å
å管ççä¸ç§ææ¯ï¼æä»¬å¯ä»¥æå¨è®¾ç½®èªå·±çµèçèæå
åãä¸è¦å纯认为èæå
ååªæ¯â使ç¨ç¡¬çç©ºé´æ¥æ©å±å
åâçææ¯ã**èæå
åçéè¦æä¹æ¯å®å®ä¹äºä¸ä¸ªè¿ç»çèæå°å空é´**ï¼å¹¶ä¸ **æå
åæ©å±å°ç¡¬ç空é´**ãæ¨èé
读ï¼[ãèæå
åçé£ç¹äºå¿ã](https://juejin.im/post/59f8691b51882534af254317)
ç»´åºç¾ç§ä¸æå å¥è¯æ¯è¿æ ·ä»ç»èæå
åçã
> **èæå
å** 使å¾åºç¨ç¨åºè®¤ä¸ºå®æ¥æè¿ç»çå¯ç¨çå
åï¼ä¸ä¸ªè¿ç»å®æ´çå°å空é´ï¼ï¼èå®é
ä¸ï¼å®é常æ¯è¢«åéæå¤ä¸ªç©çå
åç¢çï¼è¿æé¨åææ¶åå¨å¨å¤é¨ç£çåå¨å¨ä¸ï¼å¨éè¦æ¶è¿è¡æ°æ®äº¤æ¢ã䏿²¡æä½¿ç¨èæå
åææ¯çç³»ç»ç¸æ¯ï¼ä½¿ç¨è¿ç§ææ¯çç³»ç»ä½¿å¾å¤§åç¨åºçç¼åå徿´å®¹æï¼å¯¹çæ£çç©çå
åï¼ä¾å¦ RAMï¼ç使ç¨ä¹æ´ææçãç®åï¼å¤§å¤æ°æä½ç³»ç»é½ä½¿ç¨äºèæå
åï¼å¦ Windows å®¶æçâèæå
åâï¼Linux çâ交æ¢ç©ºé´âçãFrom:
#### 4.2 å±é¨æ§åç
ð¨âð»**é¢è¯å®** ï¼è¦æ³æ´å¥½å°çè§£èæå
åææ¯ï¼å¿
é¡»è¦ç¥éè®¡ç®æºä¸èåç**å±é¨æ§åç**ãå¦å¤ï¼å±é¨æ§åçæ¢éç¨äºç¨åºç»æï¼ä¹éç¨äºæ°æ®ç»æï¼æ¯é常éè¦çä¸ä¸ªæ¦å¿µã
ð **æ** ï¼å±é¨æ§åçæ¯èæå
åææ¯çåºç¡ï¼æ£æ¯å 为ç¨åºè¿è¡å
·æå±é¨æ§åçï¼æå¯ä»¥åªè£
å
¥é¨åç¨åºå°å
åå°±å¼å§è¿è¡ã
> 以ä¸å
容æèªãè®¡ç®æºæä½ç³»ç»æç¨ã 第 4 ç« åå¨å¨ç®¡çã
æ©å¨ 1968 å¹´çæ¶åï¼å°±æäººæåºæä»¬çç¨åºå¨æ§è¡çæ¶åå¾å¾åç°å±é¨æ§è§å¾ï¼ä¹å°±æ¯è¯´å¨æä¸ªè¾ççæ¶é´æ®µå
ï¼ç¨åºæ§è¡å±éäºæä¸å°é¨åï¼ç¨åºè®¿é®çåå¨ç©ºé´ä¹å±éäºæä¸ªåºåã
å±é¨æ§åç表ç°å¨ä»¥ä¸ä¸¤ä¸ªæ¹é¢ï¼
1. **æ¶é´å±é¨æ§** ï¼å¦æç¨åºä¸çææ¡æä»¤ä¸æ¦æ§è¡ï¼ä¸ä¹
以å该æä»¤å¯è½å次æ§è¡ï¼å¦æææ°æ®è¢«è®¿é®è¿ï¼ä¸ä¹
以åè¯¥æ°æ®å¯è½å次被访é®ãäº§çæ¶é´å±é¨æ§çå
¸ååå ï¼æ¯ç±äºå¨ç¨åºä¸åå¨ç大éçå¾ªç¯æä½ã
2. **空é´å±é¨æ§** ï¼ä¸æ¦ç¨åºè®¿é®äºæä¸ªåå¨åå
ï¼å¨ä¸ä¹
ä¹åï¼å
¶éè¿çåå¨åå
ä¹å°è¢«è®¿é®ï¼å³ç¨åºå¨ä¸æ®µæ¶é´å
æè®¿é®çå°åï¼å¯è½éä¸å¨ä¸å®çèå´ä¹å
ï¼è¿æ¯å 为æä»¤é常æ¯é¡ºåºåæ¾ãé¡ºåºæ§è¡çï¼æ°æ®ä¹ä¸è¬æ¯ä»¥åéãæ°ç»ã表çå½¢å¼ç°èåå¨çã
æ¶é´å±é¨æ§æ¯éè¿å°è¿æ¥ä½¿ç¨çæä»¤åæ°æ®ä¿åå°é«éç¼ååå¨å¨ä¸ï¼å¹¶ä½¿ç¨é«éç¼åç屿¬¡ç»æå®ç°ã空é´å±é¨æ§é常æ¯ä½¿ç¨è¾å¤§çé«éç¼åï¼å¹¶å°é¢åæºå¶éæå°é«éç¼åæ§å¶é»è¾ä¸å®ç°ãèæå
åææ¯å®é
ä¸å°±æ¯å»ºç«äº âå
åä¸å¤åâç两级åå¨å¨çç»æï¼å©ç¨å±é¨æ§åçå®ç°é«éç¼åã
#### 4.3 èæåå¨å¨
ð¨âð»**é¢è¯å®** ï¼é½è¯´äºèæå
åäºãä½ å讲讲**èæåå¨å¨**æï¼
ð **æ** ï¼
> è¿é¨åå
容æ¥èªï¼[çéèç æä½ç³»ç»ç¥è¯ç¹æ´ç](https://wizardforcel.gitbooks.io/wangdaokaoyan-os/content/13.html)ã
åºäºå±é¨æ§åçï¼å¨ç¨åºè£
å
¥æ¶ï¼å¯ä»¥å°ç¨åºçä¸é¨åè£
å
¥å
åï¼èå°å
¶ä»é¨åçå¨å¤åï¼å°±å¯ä»¥å¯å¨ç¨åºæ§è¡ãç±äºå¤åå¾å¾æ¯å
å大å¾å¤ï¼æä»¥æä»¬è¿è¡ç软件çå
å大å°å®é
䏿¯å¯ä»¥æ¯è®¡ç®æºç³»ç»å®é
çå
å大å°å¤§çãå¨ç¨åºæ§è¡è¿ç¨ä¸ï¼å½æè®¿é®çä¿¡æ¯ä¸å¨å
åæ¶ï¼ç±æä½ç³»ç»å°æéè¦çé¨åè°å
¥å
åï¼ç¶åç»§ç»æ§è¡ç¨åºãå¦ä¸æ¹é¢ï¼æä½ç³»ç»å°å
å䏿æ¶ä¸ä½¿ç¨çå
容æ¢å°å¤åä¸ï¼ä»èè
¾åºç©ºé´åæ¾å°è¦è°å
¥å
åçä¿¡æ¯ãè¿æ ·ï¼è®¡ç®æºå¥½åä¸ºç¨æ·æä¾äºä¸ä¸ªæ¯å®é
å
å大çå¤çåå¨å¨ââ**èæåå¨å¨**ã
å®é
ä¸ï¼æè§å¾èæå
ååæ ·æ¯ä¸ç§æ¶é´æ¢ç©ºé´ççç¥ï¼ä½ ç¨ CPU çè®¡ç®æ¶é´ï¼é¡µçè°å
¥è°åºè±è´¹çæ¶é´ï¼æ¢æ¥äºä¸ä¸ªèæçæ´å¤§çç©ºé´æ¥æ¯æç¨åºçè¿è¡ãä¸å¾ä¸æå¹ï¼ç¨åºä¸çå ä¹ä¸æ¯æ¶é´æ¢ç©ºé´å°±æ¯ç©ºé´æ¢æ¶é´ã
#### 4.4 èæå
åçææ¯å®ç°
ð¨âð»**é¢è¯å®** ï¼**èæå
åææ¯çå®ç°å¢ï¼**
ð **æ** ï¼**èæå
åçå®ç°éè¦å»ºç«å¨ç¦»æ£åé
çå
åç®¡çæ¹å¼çåºç¡ä¸ã** èæå
åçå®ç°æä»¥ä¸ä¸ç§æ¹å¼ï¼
1. **请æ±å页åå¨ç®¡ç** ï¼å»ºç«å¨å页管çä¹ä¸ï¼ä¸ºäºæ¯æèæåå¨å¨åè½èå¢å äºè¯·æ±è°é¡µåè½å页é¢ç½®æ¢åè½ã请æ±å页æ¯ç®åæå¸¸ç¨çä¸ç§å®ç°èæåå¨å¨çæ¹æ³ã请æ±å页åå¨ç®¡çç³»ç»ä¸ï¼å¨ä½ä¸å¼å§è¿è¡ä¹åï¼ä»
è£
å
¥å½åè¦æ§è¡çé¨å段å³å¯è¿è¡ãåå¦å¨ä½ä¸è¿è¡çè¿ç¨ä¸åç°è¦è®¿é®ç页é¢ä¸å¨å
åï¼åç±å¤çå¨éç¥æä½ç³»ç»æç
§å¯¹åºç页é¢ç½®æ¢ç®æ³å°ç¸åºç页é¢è°å
¥å°ä¸»åï¼åæ¶æä½ç³»ç»ä¹å¯ä»¥å°ææ¶ä¸ç¨ç页é¢ç½®æ¢å°å¤åä¸ã
2. **请æ±å段åå¨ç®¡ç** ï¼å»ºç«å¨å段åå¨ç®¡çä¹ä¸ï¼å¢å äºè¯·æ±è°æ®µåè½ãåæ®µç½®æ¢åè½ã请æ±å段å¨åç®¡çæ¹å¼å°±å¦å请æ±å页å¨åç®¡çæ¹å¼ä¸æ ·ï¼å¨ä½ä¸å¼å§è¿è¡ä¹åï¼ä»
è£
å
¥å½åè¦æ§è¡çé¨å段å³å¯è¿è¡ï¼å¨æ§è¡è¿ç¨ä¸ï¼å¯ä½¿ç¨è¯·æ±è°å
¥ä¸æå¨æè£
å
¥è¦è®¿é®ä½åä¸å¨å
åçç¨åºæ®µï¼å½å
å空é´å·²æ»¡ï¼èåéè¦è£
å
¥æ°ç段æ¶ï¼æ ¹æ®ç½®æ¢åè½éå½è°åºæä¸ªæ®µï¼ä»¥ä¾¿è
¾åºç©ºé´èè£
å
¥æ°ç段ã
3. **è¯·æ±æ®µé¡µå¼åå¨ç®¡ç**
**è¿éå¤è¯´ä¸ä¸ï¼å¾å¤äººå®¹æææ··è¯·æ±å页ä¸å页åå¨ç®¡çï¼ä¸¤è
æä½ä¸åå¢ï¼**
请æ±å页åå¨ç®¡ç建ç«å¨å页管çä¹ä¸ãä»ä»¬çæ ¹æ¬åºå«æ¯æ¯å¦å°ç¨åºå
¨é¨æéçå
¨é¨å°å空é´é½è£
å
¥ä¸»åï¼è¿ä¹æ¯è¯·æ±å页åå¨ç®¡çå¯ä»¥æä¾èæå
åçåå ï¼æä»¬å¨ä¸é¢å·²ç»åæè¿äºã
å®ä»¬ä¹é´çæ ¹æ¬åºå«å¨äºæ¯å¦å°ä¸ä½ä¸çå
¨é¨å°å空é´åæ¶è£
å
¥ä¸»åã请æ±å页åå¨ç®¡çä¸è¦æ±å°ä½ä¸å
¨é¨å°å空é´åæ¶è£
å
¥ä¸»åãåºäºè¿ä¸ç¹ï¼è¯·æ±å页åå¨ç®¡çå¯ä»¥æä¾èåï¼èå页åå¨ç®¡çå´ä¸è½æä¾èåã
ä¸ç®¡æ¯ä¸é¢é£ç§å®ç°æ¹å¼ï¼æä»¬ä¸è¬é½éè¦ï¼
1. ä¸å®å®¹éçå
ååå¤åï¼å¨è½½å
¥ç¨åºçæ¶åï¼åªéè¦å°ç¨åºçä¸é¨åè£
å
¥å
åï¼èå°å
¶ä»é¨åçå¨å¤åï¼ç¶åç¨åºå°±å¯ä»¥æ§è¡äºï¼
2. **ç¼ºé¡µä¸æ**ï¼å¦æ**éæ§è¡çæä»¤æè®¿é®çæ°æ®å°æªå¨å
å**ï¼ç§°ä¸ºç¼ºé¡µæç¼ºæ®µï¼ï¼åç±å¤çå¨éç¥æä½ç³»ç»å°ç¸åºçé¡µé¢ææ®µ**è°å
¥å°å
å**ï¼ç¶åç»§ç»æ§è¡ç¨åºï¼
3. **èæå°å空é´** ï¼é»è¾å°åå°ç©çå°åç忢ã
#### 4.5 页é¢ç½®æ¢ç®æ³
ð¨âð»**é¢è¯å®** ï¼èæå
å管çå¾éè¦çä¸ä¸ªæ¦å¿µå°±æ¯é¡µé¢ç½®æ¢ç®æ³ãé£ä½ 说ä¸ä¸ **页é¢ç½®æ¢ç®æ³çä½ç¨?常è§ç页é¢ç½®æ¢ç®æ³æåªäº?**
ð **æ** ï¼
> è¿ä¸ªé¢ç®ç»å¸¸ä½ä¸ºç¬è¯é¢åºç°ï¼ç½ä¸å·²ç»ç»åºäºå¾ä¸éçåçï¼æè¿éåªæ¯æ»ç»æ´çäºä¸ä¸ã
å°åæ å°è¿ç¨ä¸ï¼è¥å¨é¡µé¢ä¸åç°æè¦è®¿é®ç页é¢ä¸å¨å
åä¸ï¼ååçç¼ºé¡µä¸æ ã
> **ç¼ºé¡µä¸æ** å°±æ¯è¦è®¿é®ç**页**ä¸å¨ä¸»åï¼éè¦æä½ç³»ç»å°å
¶è°å
¥ä¸»åååè¿è¡è®¿é®ã å¨è¿ä¸ªæ¶åï¼è¢«å
åæ å°çæä»¶å®é
䏿äºä¸ä¸ªåé¡µäº¤æ¢æä»¶ã
å½åçç¼ºé¡µä¸ææ¶ï¼å¦æå½åå
åä¸å¹¶æ²¡æç©ºé²ç页é¢ï¼æä½ç³»ç»å°±å¿
é¡»å¨å
åéæ©ä¸ä¸ªé¡µé¢å°å
¶ç§»åºå
åï¼ä»¥ä¾¿ä¸ºå³å°è°å
¥ç页é¢è®©åºç©ºé´ãç¨æ¥éæ©æ·æ±°åªä¸é¡µçè§åå«å页é¢ç½®æ¢ç®æ³ï¼æä»¬å¯ä»¥æé¡µé¢ç½®æ¢ç®æ³çææ¯æ·æ±°é¡µé¢çè§åã
- **OPT 页é¢ç½®æ¢ç®æ³ï¼æä½³é¡µé¢ç½®æ¢ç®æ³ï¼** ï¼æä½³(Optimal, OPT)ç½®æ¢ç®æ³æéæ©çè¢«æ·æ±°é¡µé¢å°æ¯ä»¥åæ°¸ä¸ä½¿ç¨çï¼æè
æ¯å¨æé¿æ¶é´å
ä¸å被访é®ç页é¢,è¿æ ·å¯ä»¥ä¿è¯è·å¾æä½ç缺页çãä½ç±äºäººä»¬ç®åæ æ³é¢ç¥è¿ç¨å¨å
åä¸çè¥å页é¢ä¸åªä¸ªæ¯æªæ¥æé¿æ¶é´å
ä¸å被访é®çï¼å èè¯¥ç®æ³æ æ³å®ç°ãä¸è¬ä½ä¸ºè¡¡éå
¶ä»ç½®æ¢ç®æ³çæ¹æ³ã
- **FIFOï¼First In First Outï¼ é¡µé¢ç½®æ¢ç®æ³ï¼å
è¿å
åºé¡µé¢ç½®æ¢ç®æ³ï¼** : æ»æ¯æ·æ±°æå
è¿å
¥å
åç页é¢ï¼å³éæ©å¨å
åä¸é©»çæ¶é´æä¹
ç页é¢è¿è¡æ·æ±°ã
- **LRU ï¼Least Currently Usedï¼é¡µé¢ç½®æ¢ç®æ³ï¼æè¿æä¹
æªä½¿ç¨é¡µé¢ç½®æ¢ç®æ³ï¼** ï¼LRUç®æ³èµäºæ¯ä¸ªé¡µé¢ä¸ä¸ªè®¿é®å段ï¼ç¨æ¥è®°å½ä¸ä¸ªé¡µé¢èªä¸æ¬¡è¢«è®¿é®ä»¥æ¥æç»åçæ¶é´ Tï¼å½é¡»æ·æ±°ä¸ä¸ªé¡µé¢æ¶ï¼éæ©ç°æé¡µé¢ä¸å
¶ T 弿大çï¼å³æè¿æä¹
æªä½¿ç¨ç页é¢äºä»¥æ·æ±°ã
- **LFU ï¼Least Frequently Usedï¼é¡µé¢ç½®æ¢ç®æ³ï¼æå°ä½¿ç¨é¡µé¢ç½®æ¢ç®æ³ï¼** : 该置æ¢ç®æ³éæ©å¨ä¹åæ¶æä½¿ç¨æå°ç页é¢ä½ä¸ºæ·æ±°é¡µã
### Reference
- ãè®¡ç®æºæä½ç³»ç»â汤å°ä¸¹ã第åç
- [ãæ·±å
¥çè§£è®¡ç®æºç³»ç»ã](https://book.douban.com/subject/1230413/)
- [https://zh.wikipedia.org/wiki/è¾å
¥è¾åºå
å管çåå
](https://zh.wikipedia.org/wiki/è¾å
¥è¾åºå
å管çåå
)
- [https://baike.baidu.com/item/快表/19781679](https://baike.baidu.com/item/快表/19781679)
- https://www.jianshu.com/p/1d47ed0b46d5
-
-
-
- çéèç æä½ç³»ç»ç¥è¯ç¹æ´çï¼ https://wizardforcel.gitbooks.io/wangdaokaoyan-os/content/13.html
------
# å æ°æ®åºé¢è¯é¢æ»ç»
## 4.1 MySQL
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
### 4.1.1 ç²¾åæ¨è
#### ä¹¦ç±æ¨è
- ãSQLåºç¡æç¨ï¼ç¬¬2çï¼ã ï¼å
¥é¨çº§ï¼
- ã髿§è½MySQL : 第3çã (è¿é¶)
#### æåæç¨æ¨è
- [SQL Tutorial](https://www.w3schools.com/sql/default.asp) ï¼SQLè¯å¥å¦ä¹ ,è±æï¼ã[SQL Tutorial](https://www.w3school.com.cn/sql/index.asp)ï¼SQLè¯å¥å¦ä¹ ,䏿ï¼ã[SQLè¯å¥å¨çº¿ç»ä¹ ](https://www.w3schools.com/sql/exercise.asp) ï¼é常ä¸éï¼
- [Github-MySQLå
¥é¨æç¨ï¼MySQL tutorial bookï¼](https://github.com/jaywcjlove/mysql-tutorial) ï¼ä»é¶å¼å§å¦ä¹ MySQLï¼ä¸»è¦æ¯é¢åMySQLæ°æ®åºç®¡çç³»ç»åå¦è
ï¼
- [宿¹æç¨](https://dev.mysql.com/doc/refman/5.7/)
- [MySQL æç¨ï¼è鏿ç¨ï¼](http://www.runoob.com/MySQL/MySQL-tutorial.html)
#### ç¸å
³èµæºæ¨è
- [ä¸å½5çº§è¡æ¿åºåmysqlåº](https://github.com/kakuilan/china_area_mysql)
#### è§é¢æç¨æ¨è
**åºç¡å
¥é¨ï¼** [ä¸MySQLçé¶è·ç¦»æ¥è§¦-æ
课ç½](https://www.imooc.com/learn/122)
**MySQLå¼åæå·§ï¼** [MySQLå¼åæå·§ï¼ä¸ï¼](https://www.imooc.com/learn/398)ãã[MySQLå¼åæå·§ï¼äºï¼](https://www.imooc.com/learn/427)ãã[MySQLå¼åæå·§ï¼ä¸ï¼](https://www.imooc.com/learn/449)
**MySQL5.7æ°ç¹æ§åç¸å
³ä¼åæå·§ï¼** [MySQL5.7çæ¬æ°ç¹æ§](https://www.imooc.com/learn/533)ãã[æ§è½ä¼åä¹MySQLä¼å](https://www.imooc.com/learn/194)
[MySQLé群ï¼PXCï¼å
¥é¨](https://www.imooc.com/learn/993)ãã[MyCATå
¥é¨ååºç¨](https://www.imooc.com/learn/951)
#### 常è§é®é¢æ»ç»
### 4.1.2 ä»ä¹æ¯MySQL?
MySQL æ¯ä¸ç§å
³ç³»åæ°æ®åºï¼å¨Javaä¼ä¸çº§å¼åä¸é常常ç¨ï¼å 为 MySQL æ¯å¼æºå
è´¹çï¼å¹¶ä¸æ¹ä¾¿æ©å±ãé¿éå·´å·´æ°æ®åºç³»ç»ä¹å¤§éç¨å°äº MySQLï¼å æ¤å®çç¨³å®æ§æ¯æä¿éçãMySQLæ¯å¼æ¾æºä»£ç çï¼å æ¤ä»»ä½äººé½å¯ä»¥å¨ GPL(General Public License) ç许å¯ä¸ä¸è½½å¹¶æ ¹æ®ä¸ªæ§åçéè¦å¯¹å
¶è¿è¡ä¿®æ¹ãMySQLçé»è®¤ç«¯å£å·æ¯**3306**ã
### 4.1.3 åå¨å¼æ
#### ä¸äºå¸¸ç¨å½ä»¤
**æ¥çMySQLæä¾çææåå¨å¼æ**
```sql
mysql> show engines;
```

ä»ä¸å¾æä»¬å¯ä»¥æ¥çåº MySQL å½åé»è®¤çåå¨å¼ææ¯InnoDB,å¹¶ä¸å¨5.7çæ¬ææçåå¨å¼æä¸åªæ InnoDB æ¯äºå¡æ§åå¨å¼æï¼ä¹å°±æ¯è¯´åªæ InnoDB æ¯æäºå¡ã
**æ¥çMySQLå½åé»è®¤çåå¨å¼æ**
æä»¬ä¹å¯ä»¥éè¿ä¸é¢çå½ä»¤æ¥çé»è®¤çåå¨å¼æã
```sql
mysql> show variables like '%storage_engine%';
```
**æ¥ç表çåå¨å¼æ**
```sql
show table status like "table_name" ;
```

#### MyISAMåInnoDBåºå«
MyISAMæ¯MySQLçé»è®¤æ°æ®åºå¼æï¼5.5çä¹åï¼ãè½ç¶æ§è½æä½³ï¼è䏿ä¾äºå¤§éçç¹æ§ï¼å
æ¬å
¨æç´¢å¼ãå缩ã空é´å½æ°çï¼ä½MyISAM䏿¯æäºå¡åè¡çº§éï¼è䏿大ç缺é·å°±æ¯å´©æºåæ æ³å®å
¨æ¢å¤ãä¸è¿ï¼5.5çæ¬ä¹åï¼MySQLå¼å
¥äºInnoDBï¼äºå¡æ§æ°æ®åºå¼æï¼ï¼MySQL 5.5çæ¬åé»è®¤çåå¨å¼æä¸ºInnoDBã
大夿°æ¶åæä»¬ä½¿ç¨ç齿¯ InnoDB åå¨å¼æï¼ä½æ¯å¨æäºæ
åµä¸ä½¿ç¨ MyISAM 乿¯åéçæ¯å¦è¯»å¯éçæ
åµä¸ãï¼å¦æä½ ä¸ä»æ MyISAM å´©æºæ¢å¤é®é¢çè¯ï¼ã
**两è
ç对æ¯ï¼**
1. **æ¯å¦æ¯æè¡çº§é** : MyISAM åªæè¡¨çº§é(table-level locking)ï¼èInnoDB æ¯æè¡çº§é(row-level locking)å表级é,é»è®¤ä¸ºè¡çº§éã
2. **æ¯å¦æ¯æäºå¡åå´©æºåçå®å
¨æ¢å¤ï¼ MyISAM** 强è°çæ¯æ§è½ï¼æ¯æ¬¡æ¥è¯¢å
·æååæ§,å
¶æ§è¡é度æ¯InnoDBç±»åæ´å¿«ï¼ä½æ¯ä¸æä¾äºå¡æ¯æã使¯**InnoDB** æä¾äºå¡æ¯æäºå¡ï¼å¤é¨é®çé«çº§æ°æ®åºåè½ã å
·æäºå¡(commit)ãåæ»(rollback)åå´©æºä¿®å¤è½å(crash recovery capabilities)çäºå¡å®å
¨(transaction-safe (ACID compliant))å表ã
3. **æ¯å¦æ¯æå¤é®ï¼** MyISAM䏿¯æï¼èInnoDBæ¯æã
4. **æ¯å¦æ¯æMVCC** ï¼ä»
InnoDB æ¯æãåºå¯¹é«å¹¶åäºå¡, MVCCæ¯å纯çå 鿴髿;MVCCåªå¨ `READ COMMITTED` å `REPEATABLE READ` 两个é离级å«ä¸å·¥ä½;MVCCå¯ä»¥ä½¿ç¨ ä¹è§(optimistic)é å æ²è§(pessimistic)鿥å®ç°;åæ°æ®åºä¸MVCCå®ç°å¹¶ä¸ç»ä¸ãæ¨èé
读ï¼[MySQL-InnoDB-MVCCå¤çæ¬å¹¶åæ§å¶](https://segmentfault.com/a/1190000012650596)
5. ......
ãMySQL髿§è½ãä¸é¢æä¸å¥è¯è¿æ ·åå°:
> ä¸è¦è½»æç¸ä¿¡âMyISAMæ¯InnoDBå¿«âä¹ç±»çç»éªä¹è°ï¼è¿ä¸ªç»è®ºå¾å¾ä¸æ¯ç»å¯¹çãå¨å¾å¤æä»¬å·²ç¥åºæ¯ä¸ï¼InnoDBçé度é½å¯ä»¥è®©MyISAMæå°è«åï¼å°¤å
¶æ¯ç¨å°äºèç°ç´¢å¼ï¼æè
éè¦è®¿é®çæ°æ®é½å¯ä»¥æ¾å
¥å
åçåºç¨ã
ä¸è¬æ
åµä¸æä»¬éæ© InnoDB 齿¯æ²¡æé®é¢çï¼ä½æ¯æäºæ
åµä¸ä½ å¹¶ä¸å¨ä¹å¯æ©å±è½ååå¹¶åè½åï¼ä¹ä¸éè¦äºå¡æ¯æï¼ä¹ä¸å¨ä¹å´©æºåçå®å
¨æ¢å¤é®é¢çè¯ï¼éæ©MyISAM乿¯ä¸ä¸ªä¸éçéæ©ã使¯ä¸è¬æ
åµä¸ï¼æä»¬é½æ¯éè¦èèå°è¿äºé®é¢çã
### 4.1.4 å符éåæ ¡å¯¹è§å
å符éæçæ¯ä¸ç§ä»äºè¿å¶ç¼ç å°æç±»å符符å·çæ å°ãæ ¡å¯¹è§å忝ææç§å符éä¸çæåºè§åãMySQL䏿¯ä¸ç§å符éé½ä¼å¯¹åºä¸ç³»åçæ ¡å¯¹è§åã
MySQLéç¨çæ¯ç±»ä¼¼ç»§æ¿çæ¹å¼æå®å符éçé»è®¤å¼ï¼æ¯ä¸ªæ°æ®åºä»¥åæ¯å¼ æ°æ®è¡¨é½æèªå·±çé»è®¤å¼ï¼ä»ä»¬éå±ç»§æ¿ãæ¯å¦ï¼æä¸ªåºä¸ææè¡¨çé»è®¤å符éå°æ¯è¯¥æ°æ®åºææå®çå符éï¼è¿äºè¡¨å¨æ²¡ææå®å符éçæ
åµä¸ï¼æä¼éç¨é»è®¤å符éï¼ PSï¼æ´çèªãJavaå·¥ç¨å¸ä¿®ç¼ä¹éã
详ç»å
容å¯ä»¥åèï¼ [MySQLå符éåæ ¡å¯¹è§åççè§£](https://www.cnblogs.com/geaozhang/p/6724393.html#MySQLyuzifuji)
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
### 4.1.5 ç´¢å¼
MySQLç´¢å¼ä½¿ç¨çæ°æ®ç»æä¸»è¦æ**BTreeç´¢å¼** å **åå¸ç´¢å¼** ã对äºåå¸ç´¢å¼æ¥è¯´ï¼åºå±çæ°æ®ç»æå°±æ¯åå¸è¡¨ï¼å æ¤å¨ç»å¤§å¤æ°éæ±ä¸ºåæ¡è®°å½æ¥è¯¢çæ¶åï¼å¯ä»¥éæ©åå¸ç´¢å¼ï¼æ¥è¯¢æ§è½æå¿«ï¼å
¶ä½å¤§é¨ååºæ¯ï¼å»ºè®®éæ©BTreeç´¢å¼ã
MySQLçBTreeç´¢å¼ä½¿ç¨çæ¯Bæ ä¸çB+Treeï¼ä½å¯¹äºä¸»è¦ç两ç§åå¨å¼æçå®ç°æ¹å¼æ¯ä¸åçã
- **MyISAM:** B+Treeå¶èç¹çdataååæ¾çæ¯æ°æ®è®°å½çå°åãå¨ç´¢å¼æ£ç´¢çæ¶åï¼é¦å
æç
§B+Treeæç´¢ç®æ³æç´¢ç´¢å¼ï¼å¦ææå®çKeyåå¨ï¼åååºå
¶ data åçå¼ï¼ç¶å以 data åçå¼ä¸ºå°å读åç¸åºçæ°æ®è®°å½ãè¿è¢«ç§°ä¸ºâéèç°ç´¢å¼âã
- **InnoDB:** å
¶æ°æ®æä»¶æ¬èº«å°±æ¯ç´¢å¼æä»¶ãç¸æ¯MyISAMï¼ç´¢å¼æä»¶åæ°æ®æä»¶æ¯å离çï¼å
¶è¡¨æ°æ®æä»¶æ¬èº«å°±æ¯æB+Treeç»ç»çä¸ä¸ªç´¢å¼ç»æï¼æ çå¶èç¹dataåä¿åäºå®æ´çæ°æ®è®°å½ãè¿ä¸ªç´¢å¼çkeyæ¯æ°æ®è¡¨ç主é®ï¼å æ¤InnoDBè¡¨æ°æ®æä»¶æ¬èº«å°±æ¯ä¸»ç´¢å¼ãè¿è¢«ç§°ä¸ºâèç°ç´¢å¼ï¼æèéç´¢å¼ï¼âãèå
¶ä½çç´¢å¼é½ä½ä¸ºè¾
å©ç´¢å¼ï¼è¾
å©ç´¢å¼çdataååå¨ç¸åºè®°å½ä¸»é®çå¼è䏿¯å°åï¼è¿ä¹æ¯åMyISAMä¸åçå°æ¹ã**卿 ¹æ®ä¸»ç´¢å¼æç´¢æ¶ï¼ç´æ¥æ¾å°keyæå¨çèç¹å³å¯ååºæ°æ®ï¼å¨æ ¹æ®è¾
å©ç´¢å¼æ¥æ¾æ¶ï¼åéè¦å
ååºä¸»é®çå¼ï¼åèµ°ä¸é主索å¼ã** **å æ¤ï¼å¨è®¾è®¡è¡¨çæ¶åï¼ä¸å»ºè®®ä½¿ç¨è¿é¿çåæ®µä½ä¸ºä¸»é®ï¼ä¹ä¸å»ºè®®ä½¿ç¨éåè°çåæ®µä½ä¸ºä¸»é®ï¼è¿æ ·ä¼é æä¸»ç´¢å¼é¢ç¹åè£ã** PSï¼æ´çèªãJavaå·¥ç¨å¸ä¿®ç¼ä¹éã
**æ´å¤å
³äºç´¢å¼çå
容å¯ä»¥æ¥çææ¡£é¦é¡µMySQLç®å½ä¸å
³äºç´¢å¼çè¯¦ç»æ»ç»ã**
### 4.1.6 æ¥è¯¢ç¼åç使ç¨
> æ§è¡æ¥è¯¢è¯å¥çæ¶åï¼ä¼å
æ¥è¯¢ç¼åãä¸è¿ï¼MySQL 8.0 çæ¬åç§»é¤ï¼å 为è¿ä¸ªåè½ä¸å¤ªå®ç¨
my.cnfå å
¥ä»¥ä¸é
ç½®ï¼éå¯MySQLå¼å¯æ¥è¯¢ç¼å
```properties
query_cache_type=1
query_cache_size=600000
```
MySQLæ§è¡ä»¥ä¸å½ä»¤ä¹å¯ä»¥å¼å¯æ¥è¯¢ç¼å
```properties
set global query_cache_type=1;
set global query_cache_size=600000;
```
å¦ä¸ï¼**å¼å¯æ¥è¯¢ç¼ååå¨åæ ·çæ¥è¯¢æ¡ä»¶ä»¥åæ°æ®æ
åµä¸ï¼ä¼ç´æ¥å¨ç¼åä¸è¿åç»æ**ãè¿éçæ¥è¯¢æ¡ä»¶å
æ¬æ¥è¯¢æ¬èº«ãå½åè¦æ¥è¯¢çæ°æ®åºã客æ·ç«¯åè®®çæ¬å·çä¸äºå¯è½å½±åç»æçä¿¡æ¯ãå æ¤ä»»ä½ä¸¤ä¸ªæ¥è¯¢å¨ä»»ä½å符ä¸çä¸åé½ä¼å¯¼è´ç¼åä¸å½ä¸ãæ¤å¤ï¼å¦ææ¥è¯¢ä¸å
å«ä»»ä½ç¨æ·èªå®ä¹å½æ°ãåå¨å½æ°ãç¨æ·åéã临æ¶è¡¨ãMySQLåºä¸çç³»ç»è¡¨ï¼å
¶æ¥è¯¢ç»æä¹ä¸ä¼è¢«ç¼åã
ç¼å建ç«ä¹åï¼MySQLçæ¥è¯¢ç¼åç³»ç»ä¼è·è¸ªæ¥è¯¢ä¸æ¶åçæ¯å¼ è¡¨ï¼å¦æè¿äºè¡¨ï¼æ°æ®æç»æï¼åçååï¼é£ä¹åè¿å¼ 表ç¸å
³çææç¼åæ°æ®é½å°å¤±æã
**ç¼åè½ç¶è½å¤æåæ°æ®åºçæ¥è¯¢æ§è½ï¼ä½æ¯ç¼ååæ¶ä¹å¸¦æ¥äºé¢å¤çå¼éï¼æ¯æ¬¡æ¥è¯¢åé½è¦å䏿¬¡ç¼åæä½ï¼å¤±æåè¿è¦éæ¯ã** å æ¤ï¼å¼å¯ç¼åæ¥è¯¢è¦è°¨æ
ï¼å°¤å
¶å¯¹äºåå¯éçåºç¨æ¥è¯´æ´æ¯å¦æ¤ã妿å¼å¯ï¼è¦æ³¨æåçæ§å¶ç¼å空é´å¤§å°ï¼ä¸è¬æ¥è¯´å
¶å¤§å°è®¾ç½®ä¸ºå åMBæ¯è¾åéãæ¤å¤ï¼**è¿å¯ä»¥éè¿sql_cacheåsql_no_cacheæ¥æ§å¶æä¸ªæ¥è¯¢è¯å¥æ¯å¦éè¦ç¼åï¼**
```sql
select sql_no_cache count(*) from usr;
```
### 4.1.7 ä»ä¹æ¯äºå¡?
**äºå¡æ¯é»è¾ä¸çä¸ç»æä½ï¼è¦ä¹é½æ§è¡ï¼è¦ä¹é½ä¸æ§è¡ã**
äºå¡æç»å
¸ä¹ç»å¸¸è¢«æ¿åºæ¥è¯´ä¾åå°±æ¯è½¬è´¦äºãåå¦å°æè¦ç»å°çº¢è½¬è´¦1000å
ï¼è¿ä¸ªè½¬è´¦ä¼æ¶åå°ä¸¤ä¸ªå
³é®æä½å°±æ¯ï¼å°å°æçä½é¢åå°1000å
ï¼å°å°çº¢çä½é¢å¢å 1000å
ãä¸ä¸å¨è¿ä¸¤ä¸ªæä½ä¹é´çªç¶åºç°é误æ¯å¦é¶è¡ç³»ç»å´©æºï¼å¯¼è´å°æä½é¢åå°èå°çº¢çä½é¢æ²¡æå¢å ï¼è¿æ ·å°±ä¸å¯¹äºãäºå¡å°±æ¯ä¿è¯è¿ä¸¤ä¸ªå
³é®æä½è¦ä¹é½æåï¼è¦ä¹é½è¦å¤±è´¥ã
### 4.1.8 äºç©çåå¤§ç¹æ§(ACID)

1. **ååæ§ï¼Atomicityï¼ï¼** äºå¡æ¯æå°çæ§è¡åä½ï¼ä¸å
许åå²ãäºå¡çååæ§ç¡®ä¿å¨ä½è¦ä¹å
¨é¨å®æï¼è¦ä¹å®å
¨ä¸èµ·ä½ç¨ï¼
2. **ä¸è´æ§ï¼Consistencyï¼ï¼** æ§è¡äºå¡ååï¼æ°æ®ä¿æä¸è´ï¼å¤ä¸ªäºå¡å¯¹åä¸ä¸ªæ°æ®è¯»åçç»ææ¯ç¸åçï¼
3. **é离æ§ï¼Isolationï¼ï¼** å¹¶åè®¿é®æ°æ®åºæ¶ï¼ä¸ä¸ªç¨æ·çäºå¡ä¸è¢«å
¶ä»äºå¡æå¹²æ°ï¼åå¹¶åäºå¡ä¹é´æ°æ®åºæ¯ç¬ç«çï¼
4. **æä¹
æ§ï¼Durabilityï¼ï¼** ä¸ä¸ªäºå¡è¢«æäº¤ä¹åãå®å¯¹æ°æ®åºä¸æ°æ®çæ¹åæ¯æä¹
çï¼å³ä½¿æ°æ®åºåçæ
éä¹ä¸åºè¯¥å¯¹å
¶æä»»ä½å½±åã
### 4.1.9 å¹¶åäºå¡å¸¦æ¥åªäºé®é¢?
å¨å
¸åçåºç¨ç¨åºä¸ï¼å¤ä¸ªäºå¡å¹¶åè¿è¡ï¼ç»å¸¸ä¼æä½ç¸åçæ°æ®æ¥å®æåèªçä»»å¡ï¼å¤ä¸ªç¨æ·å¯¹å䏿°æ®è¿è¡æä½ï¼ãå¹¶åè½ç¶æ¯å¿
é¡»çï¼ä½å¯è½ä¼å¯¼è´ä»¥ä¸çé®é¢ã
- **è读ï¼Dirty readï¼:** å½ä¸ä¸ªäºå¡æ£å¨è®¿é®æ°æ®å¹¶ä¸å¯¹æ°æ®è¿è¡äºä¿®æ¹ï¼èè¿ç§ä¿®æ¹è¿æ²¡ææäº¤å°æ°æ®åºä¸ï¼è¿æ¶å¦å¤ä¸ä¸ªäºå¡ä¹è®¿é®äºè¿ä¸ªæ°æ®ï¼ç¶å使ç¨äºè¿ä¸ªæ°æ®ãå 为è¿ä¸ªæ°æ®æ¯è¿æ²¡ææäº¤çæ°æ®ï¼é£ä¹å¦å¤ä¸ä¸ªäºå¡è¯»å°çè¿ä¸ªæ°æ®æ¯âèæ°æ®âï¼ä¾æ®âèæ°æ®âæåçæä½å¯è½æ¯ä¸æ£ç¡®çã
- **丢失修æ¹ï¼Lost to modifyï¼:** æå¨ä¸ä¸ªäºå¡è¯»åä¸ä¸ªæ°æ®æ¶ï¼å¦å¤ä¸ä¸ªäºå¡ä¹è®¿é®äºè¯¥æ°æ®ï¼é£ä¹å¨ç¬¬ä¸ä¸ªäºå¡ä¸ä¿®æ¹äºè¿ä¸ªæ°æ®åï¼ç¬¬äºä¸ªäºå¡ä¹ä¿®æ¹äºè¿ä¸ªæ°æ®ãè¿æ ·ç¬¬ä¸ä¸ªäºå¡å
çä¿®æ¹ç»æå°±è¢«ä¸¢å¤±ï¼å æ¤ç§°ä¸ºä¸¢å¤±ä¿®æ¹ã ä¾å¦ï¼äºå¡1读åæè¡¨ä¸çæ°æ®A=20ï¼äºå¡2ä¹è¯»åA=20ï¼äºå¡1ä¿®æ¹A=A-1ï¼äºå¡2ä¹ä¿®æ¹A=A-1ï¼æç»ç»æA=19ï¼äºå¡1çä¿®æ¹è¢«ä¸¢å¤±ã
- **ä¸å¯éå¤è¯»ï¼Unrepeatablereadï¼:** æå¨ä¸ä¸ªäºå¡å
夿¬¡è¯»å䏿°æ®ãå¨è¿ä¸ªäºå¡è¿æ²¡æç»ææ¶ï¼å¦ä¸ä¸ªäºå¡ä¹è®¿é®è¯¥æ°æ®ãé£ä¹ï¼å¨ç¬¬ä¸ä¸ªäºå¡ä¸çä¸¤æ¬¡è¯»æ°æ®ä¹é´ï¼ç±äºç¬¬äºä¸ªäºå¡çä¿®æ¹å¯¼è´ç¬¬ä¸ä¸ªäºå¡ä¸¤æ¬¡è¯»åçæ°æ®å¯è½ä¸å¤ªä¸æ ·ãè¿å°±åçäºå¨ä¸ä¸ªäºå¡å
两次读å°çæ°æ®æ¯ä¸ä¸æ ·çæ
åµï¼å æ¤ç§°ä¸ºä¸å¯éå¤è¯»ã
- **幻读ï¼Phantom readï¼:** 幻读ä¸ä¸å¯éå¤è¯»ç±»ä¼¼ãå®åçå¨ä¸ä¸ªäºå¡ï¼T1ï¼è¯»åäºå è¡æ°æ®ï¼æ¥çå¦ä¸ä¸ªå¹¶åäºå¡ï¼T2ï¼æå
¥äºä¸äºæ°æ®æ¶ãå¨éåçæ¥è¯¢ä¸ï¼ç¬¬ä¸ä¸ªäºå¡ï¼T1ï¼å°±ä¼åç°å¤äºä¸äºåæ¬ä¸åå¨çè®°å½ï¼å°±å¥½ååçäºå¹»è§ä¸æ ·ï¼æä»¥ç§°ä¸ºå¹»è¯»ã
**ä¸å¯éå¤è¯»å幻读åºå«ï¼**
ä¸å¯éå¤è¯»çéç¹æ¯ä¿®æ¹æ¯å¦å¤æ¬¡è¯»å䏿¡è®°å½åç°å
¶ä¸æäºåçå¼è¢«ä¿®æ¹ï¼å¹»è¯»çéç¹å¨äºæ°å¢æè
å 餿¯å¦å¤æ¬¡è¯»å䏿¡è®°å½åç°è®°å½å¢å¤æåå°äºã
### 4.1.10 äºå¡éç¦»çº§å«æåªäº?MySQLçé»è®¤éç¦»çº§å«æ¯?
**SQL æ åå®ä¹äºå个é离级å«ï¼**
- **READ-UNCOMMITTED(è¯»åæªæäº¤)ï¼** æä½çé离级å«ï¼å
许读åå°æªæäº¤çæ°æ®åæ´ï¼**å¯è½ä¼å¯¼è´è读ã幻读æä¸å¯éå¤è¯»**ã
- **READ-COMMITTED(读åå·²æäº¤)ï¼** å
许读åå¹¶åäºå¡å·²ç»æäº¤çæ°æ®ï¼**å¯ä»¥é»æ¢è读ï¼ä½æ¯å¹»è¯»æä¸å¯éå¤è¯»ä»æå¯è½åç**ã
- **REPEATABLE-READ(å¯éå¤è¯»)ï¼** 对åä¸å段ç夿¬¡è¯»åç»æé½æ¯ä¸è´çï¼é¤éæ°æ®æ¯è¢«æ¬èº«äºå¡èªå·±æä¿®æ¹ï¼**å¯ä»¥é»æ¢è读åä¸å¯éå¤è¯»ï¼ä½å¹»è¯»ä»æå¯è½åç**ã
- **SERIALIZABLE(å¯ä¸²è¡å)ï¼** æé«çé离级å«ï¼å®å
¨æä»ACIDçé离级å«ãææçäºå¡ä¾æ¬¡é个æ§è¡ï¼è¿æ ·äºå¡ä¹é´å°±å®å
¨ä¸å¯è½äº§çå¹²æ°ï¼ä¹å°±æ¯è¯´ï¼**该级å«å¯ä»¥é²æ¢è读ãä¸å¯éå¤è¯»ä»¥å幻读**ã
------
| éç¦»çº§å« | è读 | ä¸å¯éå¤è¯» | 幻影读 |
| :--------------: | :--: | :--------: | :----: |
| READ-UNCOMMITTED | â | â | â |
| READ-COMMITTED | Ã | â | â |
| REPEATABLE-READ | Ã | Ã | â |
| SERIALIZABLE | Ã | Ã | Ã |
MySQL InnoDB åå¨å¼æçé»è®¤æ¯æçéç¦»çº§å«æ¯ **REPEATABLE-READï¼å¯é读ï¼**ãæä»¬å¯ä»¥éè¿`SELECT @@tx_isolation;`å½ä»¤æ¥æ¥ç
```sql
mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
```
è¿ééè¦æ³¨æçæ¯ï¼ä¸ SQL æ åä¸åçå°æ¹å¨äº InnoDB åå¨å¼æå¨ **REPEATABLE-READï¼å¯é读ï¼**
äºå¡é离级å«ä¸ä½¿ç¨çæ¯Next-Key Lock éç®æ³ï¼å æ¤å¯ä»¥é¿å
幻读ç产çï¼è¿ä¸å
¶ä»æ°æ®åºç³»ç»(å¦ SQL Server)
æ¯ä¸åçãæä»¥è¯´InnoDB åå¨å¼æçé»è®¤æ¯æçéç¦»çº§å«æ¯ **REPEATABLE-READï¼å¯é读ï¼** å·²ç»å¯ä»¥å®å
¨ä¿è¯äºå¡çé离æ§è¦æ±ï¼å³è¾¾å°äº
SQLæ åç **SERIALIZABLE(å¯ä¸²è¡å)** é离级å«ãå 为é离级å«è¶ä½ï¼äºå¡è¯·æ±çéè¶å°ï¼æä»¥å¤§é¨åæ°æ®åºç³»ç»çé离级å«é½æ¯ **READ-COMMITTED(读åæäº¤å
容)** ï¼ä½æ¯ä½ è¦ç¥éçæ¯InnoDB åå¨å¼æé»è®¤ä½¿ç¨ **REPEAaTABLE-READï¼å¯é读ï¼** å¹¶ä¸ä¼æä»»ä½æ§è½æå¤±ã
InnoDB åå¨å¼æå¨ **åå¸å¼äºå¡** çæ
åµä¸ä¸è¬ä¼ç¨å° **SERIALIZABLE(å¯ä¸²è¡å)** é离级å«ã
### 4.1.11 éæºå¶ä¸InnoDBéç®æ³
**MyISAMåInnoDBåå¨å¼æä½¿ç¨çéï¼**
- MyISAMéç¨è¡¨çº§é(table-level locking)ã
- InnoDBæ¯æè¡çº§é(row-level locking)å表级é,é»è®¤ä¸ºè¡çº§é
**表级éåè¡çº§é对æ¯ï¼**
- **表级éï¼** MySQLä¸éå® **ç²åº¦æå¤§** çä¸ç§éï¼å¯¹å½åæä½çæ´å¼ 表å éï¼å®ç°ç®åï¼èµæºæ¶è乿¯è¾å°ï¼å éå¿«ï¼ä¸ä¼åºç°æ»éãå
¶éå®ç²åº¦æå¤§ï¼è§¦åéå²çªçæ¦çæé«ï¼å¹¶å度æä½ï¼MyISAMå InnoDB弿齿¯æè¡¨çº§éã
- **è¡çº§éï¼** MySQLä¸éå® **ç²åº¦æå°** çä¸ç§éï¼åªé对å½åæä½çè¡è¿è¡å éã è¡çº§éè½å¤§å¤§åå°æ°æ®åºæä½çå²çªãå
¶å éç²åº¦æå°ï¼å¹¶å度é«ï¼ä½å éçå¼é乿大ï¼å éæ
¢ï¼ä¼åºç°æ»éã
详ç»å
容å¯ä»¥åèï¼ MySQLéæºå¶ç®åäºè§£ä¸ä¸ï¼[https://blog.csdn.net/qq_34337272/article/details/80611486](https://blog.csdn.net/qq_34337272/article/details/80611486)
**InnoDBåå¨å¼æçéçç®æ³æä¸ç§ï¼**
- Record lockï¼å个è¡è®°å½ä¸çé
- Gap lockï¼é´ééï¼éå®ä¸ä¸ªèå´ï¼ä¸å
æ¬è®°å½æ¬èº«
- Next-key lockï¼record+gap éå®ä¸ä¸ªèå´ï¼å
å«è®°å½æ¬èº«
**ç¸å
³ç¥è¯ç¹ï¼**
1. innodb对äºè¡çæ¥è¯¢ä½¿ç¨next-key lock
2. Next-locking keying为äºè§£å³Phantom Problem幻读é®é¢
3. 彿¥è¯¢çç´¢å¼å«æå¯ä¸å±æ§æ¶ï¼å°next-key locké级为record key
4. Gapé设计çç®çæ¯ä¸ºäºé»æ¢å¤ä¸ªäºå¡å°è®°å½æå
¥å°åä¸èå´å
ï¼èè¿ä¼å¯¼è´å¹»è¯»é®é¢ç产ç
5. æä¸¤ç§æ¹å¼æ¾å¼å
³égapéï¼ï¼é¤äºå¤é®çº¦æåå¯ä¸æ§æ£æ¥å¤ï¼å
¶ä½æ
åµä»
使ç¨record lockï¼ A. å°äºå¡é离级å«è®¾ç½®ä¸ºRC B. å°åæ°innodb_locks_unsafe_for_binlog设置为1
### 4.1.12 大表ä¼å
å½MySQLåè¡¨è®°å½æ°è¿å¤§æ¶ï¼æ°æ®åºçCRUDæ§è½ä¼ææ¾ä¸éï¼ä¸äºå¸¸è§çä¼åæªæ½å¦ä¸ï¼
#### é宿°æ®çèå´
å¡å¿
ç¦æ¢ä¸å¸¦ä»»ä½éå¶æ°æ®èå´æ¡ä»¶çæ¥è¯¢è¯å¥ãæ¯å¦ï¼æä»¬å½ç¨æ·å¨æ¥è¯¢è®¢ååå²çæ¶åï¼æä»¬å¯ä»¥æ§å¶å¨ä¸ä¸ªæçèå´å
ï¼
#### 读/åå离
ç»å
¸çæ°æ®åºæåæ¹æ¡ï¼ä¸»åºè´è´£åï¼ä»åºè´è´£è¯»ï¼
#### åç´ååº
**æ ¹æ®æ°æ®åºé颿°æ®è¡¨çç¸å
³æ§è¿è¡æåã** ä¾å¦ï¼ç¨æ·è¡¨ä¸æ¢æç¨æ·çç»å½ä¿¡æ¯åæç¨æ·çåºæ¬ä¿¡æ¯ï¼å¯ä»¥å°ç¨æ·è¡¨æåæä¸¤ä¸ªåç¬ç表ï¼çè³æ¾å°åç¬çåºåååºã
**ç®åæ¥è¯´åç´æåæ¯ææ°æ®è¡¨åçæåï¼æä¸å¼ 忝è¾å¤ç表æå为å¤å¼ 表ã** å¦ä¸å¾æç¤ºï¼è¿æ ·æ¥è¯´å¤§å®¶åºè¯¥å°±æ´å®¹æçè§£äºã

- **åç´æåçä¼ç¹ï¼** å¯ä»¥ä½¿å¾åæ°æ®åå°ï¼å¨æ¥è¯¢æ¶åå°è¯»åçBlockæ°ï¼åå°I/O次æ°ãæ¤å¤ï¼åç´ååºå¯ä»¥ç®å表çç»æï¼æäºç»´æ¤ã
- **åç´æåç缺ç¹ï¼** 主é®ä¼åºç°åä½ï¼éè¦ç®¡çåä½åï¼å¹¶ä¼å¼èµ·Joinæä½ï¼å¯ä»¥éè¿å¨åºç¨å±è¿è¡Joinæ¥è§£å³ãæ¤å¤ï¼åç´ååºä¼è®©äºå¡å徿´å 夿ï¼
#### æ°´å¹³ååº
**ä¿ææ°æ®è¡¨ç»æä¸åï¼éè¿æç§çç¥å卿°æ®åçãè¿æ ·æ¯ä¸çæ°æ®åæ£å°ä¸åç表æè
åºä¸ï¼è¾¾å°äºåå¸å¼çç®çã æ°´å¹³æåå¯ä»¥æ¯æéå¸¸å¤§çæ°æ®éã**
æ°´å¹³æåæ¯ææ°æ®è¡¨è¡çæåï¼è¡¨çè¡æ°è¶
è¿200ä¸è¡æ¶ï¼å°±ä¼åæ
¢ï¼è¿æ¶å¯ä»¥æä¸å¼ çè¡¨çæ°æ®ææå¤å¼ 表æ¥åæ¾ã举个ä¾åï¼æä»¬å¯ä»¥å°ç¨æ·ä¿¡æ¯è¡¨æåæå¤ä¸ªç¨æ·ä¿¡æ¯è¡¨ï¼è¿æ ·å°±å¯ä»¥é¿å
åä¸è¡¨æ°æ®éè¿å¤§å¯¹æ§è½é æå½±åã

æ°´å¹³æåå¯ä»¥æ¯æéå¸¸å¤§çæ°æ®éãéè¦æ³¨æçä¸ç¹æ¯ï¼å表ä»
ä»
æ¯è§£å³äºåä¸è¡¨æ°æ®è¿å¤§çé®é¢ï¼ä½ç±äºè¡¨çæ°æ®è¿æ¯å¨åä¸å°æºå¨ä¸ï¼å
¶å®å¯¹äºæåMySQLå¹¶åè½å没æä»ä¹æä¹ï¼æä»¥ **æ°´å¹³æåæå¥½ååº** ã
æ°´å¹³æåè½å¤ **æ¯æéå¸¸å¤§çæ°æ®éåå¨ï¼åºç¨ç«¯æ¹é ä¹å°**ï¼ä½ **åçäºå¡é¾ä»¥è§£å³** ï¼è·¨èç¹Joinæ§è½è¾å·®ï¼é»è¾å¤æããJavaå·¥ç¨å¸ä¿®ç¼ä¹éãçä½è
æ¨è **å°½éä¸è¦å¯¹æ°æ®è¿è¡åçï¼å 为æåä¼å¸¦æ¥é»è¾ãé¨ç½²ãè¿ç»´çåç§å¤æåº¦** ï¼ä¸è¬çæ°æ®è¡¨å¨ä¼åå¾å½çæ
åµä¸æ¯æåä¸ä»¥ä¸çæ°æ®éæ¯æ²¡æå¤ªå¤§é®é¢çã妿å®å¨è¦åçï¼å°½é鿩客æ·ç«¯åçæ¶æï¼è¿æ ·å¯ä»¥åå°ä¸æ¬¡åä¸é´ä»¶çç½ç»I/Oã
**ä¸é¢è¡¥å
ä¸ä¸æ°æ®åºåçç两ç§å¸¸è§æ¹æ¡ï¼**
- **客æ·ç«¯ä»£çï¼** **åçé»è¾å¨åºç¨ç«¯ï¼å°è£
å¨jarå
ä¸ï¼éè¿ä¿®æ¹æè
å°è£
JDBC屿¥å®ç°ã** å½å½ç½ç **Sharding-JDBC** ãé¿éçTDDLæ¯ä¸¤ç§æ¯è¾å¸¸ç¨çå®ç°ã
- **ä¸é´ä»¶ä»£çï¼** **å¨åºç¨åæ°æ®ä¸é´å äºä¸ä¸ªä»£çå±ãåçé»è¾ç»ä¸ç»´æ¤å¨ä¸é´ä»¶æå¡ä¸ã** æä»¬ç°å¨è°ç **Mycat** ã360çAtlasãç½æçDDBçç齿¯è¿ç§æ¶æçå®ç°ã
详ç»å
容å¯ä»¥åèï¼ MySQL大表ä¼åæ¹æ¡: [https://segmentfault.com/a/1190000006158186](https://segmentfault.com/a/1190000006158186)
### 4.1.13 è§£éä¸ä¸ä»ä¹æ¯æ± åè®¾è®¡ææ³ãä»ä¹æ¯æ°æ®åºè¿æ¥æ± ?为ä»ä¹éè¦æ°æ®åºè¿æ¥æ± ?
æ± å设计åºè¯¥ä¸æ¯ä¸ä¸ªæ°åè¯ãæä»¬å¸¸è§çå¦javaçº¿ç¨æ± ãjdbcè¿æ¥æ± ãredisè¿æ¥æ± çå°±æ¯è¿ç±»è®¾è®¡ç代表å®ç°ãè¿ç§è®¾è®¡ä¼åå§é¢è®¾èµæºï¼è§£å³çé®é¢å°±æ¯æµæ¶æ¯æ¬¡è·åèµæºçæ¶èï¼å¦å建线ç¨çå¼éï¼è·åè¿ç¨è¿æ¥çå¼éçã就好æ¯ä½ å»é£å æé¥ï¼æé¥ç大å¦ä¼å
æé¥ç好å 份æ¾é£éï¼ä½ æ¥äºå°±ç´æ¥æ¿çé¥çå èå³å¯ï¼ä¸ç¨å临æ¶åçé¥åæèï¼æçå°±é«äºãé¤äºåå§åèµæºï¼æ± å设计è¿å
æ¬å¦ä¸è¿äºç¹å¾ï¼æ± åçåå§å¼ãæ± åçæ´»è·å¼ãæ± åçæå¤§å¼çï¼è¿äºç¹å¾å¯ä»¥ç´æ¥æ å°å°javaçº¿ç¨æ± åæ°æ®åºè¿æ¥æ± çæå屿§ä¸ãè¿ç¯æç« 对[æ± åè®¾è®¡ææ³](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485679&idx=1&sn=57dbca8c9ad49e1f3968ecff04a4f735&chksm=cea24724f9d5ce3212292fac291234a760c99c0960b5430d714269efe33554730b5f71208582&token=1141994790&lang=zh_CN#rd)ä»ç»çè¿ä¸éï¼ç´æ¥å¤å¶è¿æ¥ï¼é¿å
éå¤é è½®åäºã
æ°æ®åºè¿æ¥æ¬è´¨å°±æ¯ä¸ä¸ª socket çè¿æ¥ãæ°æ®åºæå¡ç«¯è¿è¦ç»´æ¤ä¸äºç¼ååç¨æ·æéä¿¡æ¯ä¹ç±»ç æä»¥å ç¨äºä¸äºå
åãæä»¬å¯ä»¥ææ°æ®åºè¿æ¥æ± æ¯çåæ¯ç»´æ¤çæ°æ®åºè¿æ¥çç¼åï¼ä»¥ä¾¿å°æ¥éè¦å¯¹æ°æ®åºçè¯·æ±æ¶å¯ä»¥éç¨è¿äºè¿æ¥ã为æ¯ä¸ªç¨æ·æå¼åç»´æ¤æ°æ®åºè¿æ¥ï¼å°¤å
¶æ¯å¯¹å¨ææ°æ®åºé©±å¨çç½ç«åºç¨ç¨åºç请æ±ï¼æ¢æè´µåæµªè´¹èµæºã**å¨è¿æ¥æ± ä¸ï¼åå»ºè¿æ¥åï¼å°å
¶æ¾ç½®å¨æ± ä¸ï¼å¹¶å次使ç¨å®ï¼å æ¤ä¸å¿
å»ºç«æ°çè¿æ¥ãå¦æä½¿ç¨äºææè¿æ¥ï¼åä¼å»ºç«ä¸ä¸ªæ°è¿æ¥å¹¶å°å
¶æ·»å å°æ± ä¸ã **è¿æ¥æ± è¿åå°äºç¨æ·å¿
é¡»çå¾
建ç«ä¸æ°æ®åºçè¿æ¥çæ¶é´ã
### 4.1.14 ååºå表ä¹å,id 主é®å¦ä½å¤çï¼
å ä¸ºè¦æ¯åæå¤ä¸ªè¡¨ä¹åï¼æ¯ä¸ªè¡¨é½æ¯ä» 1 å¼å§ç´¯å ï¼è¿æ ·æ¯ä¸å¯¹çï¼æä»¬éè¦ä¸ä¸ªå
¨å±å¯ä¸ç id æ¥æ¯æã
çæå
¨å± id æä¸é¢è¿å ç§æ¹å¼ï¼
- **UUID**ï¼ä¸éåä½ä¸ºä¸»é®ï¼å 为太é¿äºï¼å¹¶ä¸æ åºä¸å¯è¯»ï¼æ¥è¯¢æçä½ãæ¯è¾éåç¨äºçæå¯ä¸çååçæ ç¤ºæ¯å¦æä»¶çååã
- **æ°æ®åºèªå¢ id** : 䏤尿°æ®åºåå«è®¾ç½®ä¸åæ¥é¿ï¼çæä¸éå¤IDççç¥æ¥å®ç°é«å¯ç¨ãè¿ç§æ¹å¼çæç id æåºï¼ä½æ¯éè¦ç¬ç«é¨ç½²æ°æ®åºå®ä¾ï¼ææ¬é«ï¼è¿ä¼ææ§è½ç¶é¢ã
- **å©ç¨ redis çæ id :** æ§è½æ¯è¾å¥½ï¼çµæ´»æ¹ä¾¿ï¼ä¸ä¾èµäºæ°æ®åºã使¯ï¼å¼å
¥äºæ°çç»ä»¶é æç³»ç»æ´å 夿ï¼å¯ç¨æ§éä½ï¼ç¼ç æ´å 夿ï¼å¢å äºç³»ç»ææ¬ã
- **Twitterçsnowflakeç®æ³** ï¼Github å°åï¼https://github.com/twitter-archive/snowflakeã
- **ç¾å¢ç[Leaf](https://tech.meituan.com/2017/04/21/mt-leaf.html)åå¸å¼IDçæç³»ç»** ï¼Leaf æ¯ç¾å¢å¼æºçåå¸å¼IDçæå¨ï¼è½ä¿è¯å
¨å±å¯ä¸æ§ãè¶å¿éå¢ãåè°éå¢ãä¿¡æ¯å®å
¨ï¼éé¢ä¹æå°äºå ç§åå¸å¼æ¹æ¡ç对æ¯ï¼ä½ä¹éè¦ä¾èµå
³ç³»æ°æ®åºãZookeeperçä¸é´ä»¶ãæè§è¿ä¸éãç¾å¢ææ¯å¢éçä¸ç¯æç« ï¼https://tech.meituan.com/2017/04/21/mt-leaf.html ã
- ......
### 4.1.15 䏿¡SQLè¯å¥å¨MySQLä¸å¦ä½æ§è¡ç
[䏿¡SQLè¯å¥å¨MySQLä¸å¦ä½æ§è¡ç]()
### 4.1.16 MySQL髿§è½ä¼åè§è建议
[MySQL髿§è½ä¼åè§è建议]()
### 4.1.17䏿¡SQLè¯å¥æ§è¡å¾å¾æ
¢çåå æåªäºï¼
[è
¾è®¯é¢è¯ï¼ä¸æ¡SQLè¯å¥æ§è¡å¾å¾æ
¢çåå æåªäºï¼---ä¸çåæç³»å](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485185&idx=1&sn=66ef08b4ab6af5757792223a83fc0d45&chksm=cea248caf9d5c1dc72ec8a281ec16aa3ec3e8066dbb252e27362438a26c33fbe842b0e0adf47&token=79317275&lang=zh_CN#rd)
### 4.1.19 å端ç¨åºåå¿
å¤ï¼ä¹¦åé«è´¨éSQLç30æ¡å»ºè®®
[å端ç¨åºåå¿
å¤ï¼ä¹¦åé«è´¨éSQLç30æ¡å»ºè®®](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486461&idx=1&sn=60a22279196d084cc398936fe3b37772&chksm=cea24436f9d5cd20a4fa0e907590f3e700d7378b3f608d7b33bb52cfb96f503b7ccb65a1deed&token=1987003517&lang=zh_CN#rd)
## 4.2 Redis
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
### 4.2.1 redis ç®ä»
ç®åæ¥è¯´ redis å°±æ¯ä¸ä¸ªæ°æ®åºï¼ä¸è¿ä¸ä¼ ç»æ°æ®åºä¸åçæ¯ redis çæ°æ®æ¯åå¨å
åä¸çï¼æä»¥è¯»åé度é常快ï¼å æ¤ redis 被广æ³åºç¨äºç¼åæ¹åãå¦å¤ï¼redis ä¹ç»å¸¸ç¨æ¥ååå¸å¼éãredis æä¾äºå¤ç§æ°æ®ç±»åæ¥æ¯æä¸åçä¸å¡åºæ¯ã餿¤ä¹å¤ï¼redis æ¯æäºå¡ ãæä¹
åãLUAèæ¬ãLRU驱å¨äºä»¶ãå¤ç§éç¾¤æ¹æ¡ã
#### 为ä»ä¹è¦ç¨ redis/为ä»ä¹è¦ç¨ç¼å
主è¦ä»â髿§è½âåâé«å¹¶åâè¿ä¸¤ç¹æ¥çå¾
è¿ä¸ªé®é¢ã
**髿§è½ï¼**
åå¦ç¨æ·ç¬¬ä¸æ¬¡è®¿é®æ°æ®åºä¸çæäºæ°æ®ãè¿ä¸ªè¿ç¨ä¼æ¯è¾æ
¢ï¼å 为æ¯ä»ç¡¬çä¸è¯»åçãå°è¯¥ç¨æ·è®¿é®çæ°æ®åå¨ç¼åä¸ï¼è¿æ ·ä¸ä¸æ¬¡å访é®è¿äºæ°æ®çæ¶åå°±å¯ä»¥ç´æ¥ä»ç¼åä¸è·åäºãæä½ç¼åå°±æ¯ç´æ¥æä½å
åï¼æä»¥é度ç¸å½å¿«ãå¦ææ°æ®åºä¸çå¯¹åºæ°æ®æ¹åçä¹åï¼åæ¥æ¹åç¼åä¸ç¸åºçæ°æ®å³å¯ï¼

**é«å¹¶åï¼**
ç´æ¥æä½ç¼åè½å¤æ¿åçè¯·æ±æ¯è¿è¿å¤§äºç´æ¥è®¿é®æ°æ®åºçï¼æä»¥æä»¬å¯ä»¥èèææ°æ®åºä¸çé¨åæ°æ®è½¬ç§»å°ç¼åä¸å»ï¼è¿æ ·ç¨æ·çä¸é¨å请æ±ä¼ç´æ¥å°ç¼åè¿éèä¸ç¨ç»è¿æ°æ®åºã

#### 为ä»ä¹è¦ç¨ redis èä¸ç¨ map/guava åç¼å?
>ä¸é¢çå
容æ¥èª segmentfault ä¸ä½ç½åçæé®ï¼å°åï¼https://segmentfault.com/q/1010000009106416
ç¼åå为æ¬å°ç¼åååå¸å¼ç¼åã以 Java 为ä¾ï¼ä½¿ç¨èªå¸¦ç map æè
guava å®ç°çæ¯æ¬å°ç¼åï¼æä¸»è¦çç¹ç¹æ¯è½»é以åå¿«éï¼çå½å¨æéç jvm ç鿝èç»æï¼å¹¶ä¸å¨å¤å®ä¾çæ
åµä¸ï¼æ¯ä¸ªå®ä¾é½éè¦åèªä¿åä¸ä»½ç¼åï¼ç¼åä¸å
·æä¸è´æ§ã
ä½¿ç¨ redis æ memcached ä¹ç±»ç称为åå¸å¼ç¼åï¼å¨å¤å®ä¾çæ
åµä¸ï¼åå®ä¾å
±ç¨ä¸ä»½ç¼åæ°æ®ï¼ç¼åå
·æä¸è´æ§ãç¼ºç¹æ¯éè¦ä¿æ redis æ memcachedæå¡çé«å¯ç¨ï¼æ´ä¸ªç¨åºæ¶æä¸è¾ä¸ºå¤æã
### 4.2.2 redis ççº¿ç¨æ¨¡å
> åèå°å:https://www.javazhiyin.com/22943.html
redis å
é¨ä½¿ç¨æä»¶äºä»¶å¤çå¨ `file event handler`ï¼è¿ä¸ªæä»¶äºä»¶å¤ç卿¯å线ç¨çï¼æä»¥ redis æå«åå线ç¨ç模åãå®éç¨ IO å¤è·¯å¤ç¨æºå¶åæ¶çå¬å¤ä¸ª socketï¼æ ¹æ® socket ä¸çäºä»¶æ¥éæ©å¯¹åºçäºä»¶å¤çå¨è¿è¡å¤çã
æä»¶äºä»¶å¤çå¨çç»æå
å« 4 个é¨åï¼
- å¤ä¸ª socket
- IO å¤è·¯å¤ç¨ç¨åº
- æä»¶äºä»¶åæ´¾å¨
- äºä»¶å¤çå¨ï¼è¿æ¥åºçå¤çå¨ãå½ä»¤è¯·æ±å¤çå¨ãå½ä»¤åå¤å¤çå¨ï¼
å¤ä¸ª socket å¯è½ä¼å¹¶å产çä¸åçæä½ï¼æ¯ä¸ªæä½å¯¹åºä¸åçæä»¶äºä»¶ï¼ä½æ¯ IO å¤è·¯å¤ç¨ç¨åºä¼çå¬å¤ä¸ª socketï¼ä¼å° socket 产ççäºä»¶æ¾å
¥éå䏿éï¼äºä»¶åæ´¾å¨æ¯æ¬¡ä»éåä¸ååºä¸ä¸ªäºä»¶ï¼æè¯¥äºä»¶äº¤ç»å¯¹åºçäºä»¶å¤çå¨è¿è¡å¤çã
### 4.2.3 redis å memcached çåºå«
å¯¹äº redis å memcached ææ»ç»äºä¸é¢åç¹ãç°å¨å
¬å¸ä¸è¬é½æ¯ç¨ redis æ¥å®ç°ç¼åï¼èä¸ redis èªèº«ä¹è¶æ¥è¶å¼ºå¤§äºï¼
1. **redisæ¯ææ´ä¸°å¯çæ°æ®ç±»åï¼æ¯ææ´å¤æçåºç¨åºæ¯ï¼**ï¼Redisä¸ä»
ä»
æ¯æç®åçk/vç±»åçæ°æ®ï¼åæ¶è¿æä¾listï¼setï¼zsetï¼hashçæ°æ®ç»æçåå¨ãmemcacheæ¯æç®åçæ°æ®ç±»åï¼Stringã
2. **Redisæ¯ææ°æ®çæä¹
åï¼å¯ä»¥å°å
åä¸çæ°æ®ä¿æå¨ç£çä¸ï¼éå¯çæ¶åå¯ä»¥å次å è½½è¿è¡ä½¿ç¨,èMemecacheææ°æ®å
¨é¨åå¨å
åä¹ä¸ã**
3. **é群模å¼**ï¼memcached没æåççé群模å¼ï¼éè¦ä¾é 客æ·ç«¯æ¥å®ç°å¾é群ä¸åçåå
¥æ°æ®ï¼ä½æ¯ redis ç®åæ¯åçæ¯æ cluster 模å¼ç.
4. **Memcachedæ¯å¤çº¿ç¨ï¼éé»å¡IOå¤ç¨çç½ç»æ¨¡åï¼Redis使ç¨å线ç¨çå¤è·¯ IO å¤ç¨æ¨¡åã**
> æ¥èªç½ç»ä¸çä¸å¼ å¾ï¼è¿éå享ç»å¤§å®¶ï¼

### 4.2.4 redis å¸¸è§æ°æ®ç»æä»¥å使ç¨åºæ¯åæ
#### String
> **常ç¨å½ä»¤:** set,get,decr,incr,mget çã
Stringæ°æ®ç»ææ¯ç®åçkey-valueç±»åï¼valueå
¶å®ä¸ä»
å¯ä»¥æ¯Stringï¼ä¹å¯ä»¥æ¯æ°åã
常è§key-valueç¼ååºç¨ï¼
常è§è®¡æ°ï¼å¾®åæ°ï¼ç²ä¸æ°çã
#### Hash
> **常ç¨å½ä»¤ï¼** hget,hset,hgetall çã
hash æ¯ä¸ä¸ª string ç±»åç field å value çæ å°è¡¨ï¼hash ç¹å«éåç¨äºåå¨å¯¹è±¡ï¼åç»æä½çæ¶åï¼ä½ å¯ä»¥ç´æ¥ä»
ä»
ä¿®æ¹è¿ä¸ªå¯¹è±¡ä¸çæä¸ªå段çå¼ã æ¯å¦æä»¬å¯ä»¥ hash æ°æ®ç»ææ¥åå¨ç¨æ·ä¿¡æ¯ï¼ååä¿¡æ¯ççãæ¯å¦ä¸é¢æå°±ç¨ hash ç±»ååæ¾äºææ¬äººçä¸äºä¿¡æ¯ï¼
```
key=JavaUser293847
value={
âidâ: 1,
ânameâ: âSnailClimbâ,
âageâ: 22,
âlocationâ: âWuhan, Hubeiâ
}
```
#### List
> **常ç¨å½ä»¤:** lpush,rpush,lpop,rpop,lrangeç
list å°±æ¯é¾è¡¨ï¼Redis list çåºç¨åºæ¯é常å¤ï¼ä¹æ¯Redisæéè¦çæ°æ®ç»æä¹ä¸ï¼æ¯å¦å¾®åçå
³æ³¨å表ï¼ç²ä¸åè¡¨ï¼æ¶æ¯å表çåè½é½å¯ä»¥ç¨Redisç list ç»ææ¥å®ç°ã
Redis list çå®ç°ä¸ºä¸ä¸ªååé¾è¡¨ï¼å³å¯ä»¥æ¯æå忥æ¾åéåï¼æ´æ¹ä¾¿æä½ï¼ä¸è¿å¸¦æ¥äºé¨åé¢å¤çå
åå¼éã
å¦å¤å¯ä»¥éè¿ lrange å½ä»¤ï¼å°±æ¯ä»æä¸ªå
ç´ å¼å§è¯»åå¤å°ä¸ªå
ç´ ï¼å¯ä»¥åºäº list å®ç°å页æ¥è¯¢ï¼è¿ä¸ªå¾æ£çä¸ä¸ªåè½ï¼åºäº redis å®ç°ç®åç髿§è½å页ï¼å¯ä»¥å类似微åé£ç§ä¸æä¸æå页çä¸è¥¿ï¼ä¸é¡µä¸é¡µçå¾ä¸èµ°ï¼ï¼æ§è½é«ã
#### Set
> **常ç¨å½ä»¤ï¼**
> sadd,spop,smembers,sunion ç
set 坹夿ä¾çåè½ä¸list类似æ¯ä¸ä¸ªå表çåè½ï¼ç¹æ®ä¹å¤å¨äº set æ¯å¯ä»¥èªå¨æéçã
å½ä½ éè¦åå¨ä¸ä¸ªåè¡¨æ°æ®ï¼åä¸å¸æåºç°é夿°æ®æ¶ï¼setæ¯ä¸ä¸ªå¾å¥½çéæ©ï¼å¹¶ä¸setæä¾äºå¤ææä¸ªæåæ¯å¦å¨ä¸ä¸ªsetéåå
çéè¦æ¥å£ï¼è¿ä¸ªä¹æ¯listæä¸è½æä¾çãå¯ä»¥åºäº set è½»æå®ç°äº¤éãå¹¶éãå·®éçæä½ã
æ¯å¦ï¼å¨å¾®ååºç¨ä¸ï¼å¯ä»¥å°ä¸ä¸ªç¨æ·ææçå
³æ³¨äººåå¨ä¸ä¸ªéåä¸ï¼å°å
¶ææç²ä¸åå¨ä¸ä¸ªéåãRediså¯ä»¥é常æ¹ä¾¿çå®ç°å¦å
±åå
³æ³¨ãå
±åç²ä¸ãå
±åå好çåè½ãè¿ä¸ªè¿ç¨ä¹å°±æ¯æ±äº¤éçè¿ç¨ï¼å
·ä½å½ä»¤å¦ä¸ï¼
```
sinterstore key1 key2 key3 å°äº¤éåå¨key1å
```
#### Sorted Set
> **常ç¨å½ä»¤ï¼** zadd,zrange,zrem,zcardç
åsetç¸æ¯ï¼sorted setå¢å äºä¸ä¸ªæéåæ°scoreï¼ä½¿å¾éåä¸çå
ç´ è½å¤æscoreè¿è¡æåºæåã
**举ä¾ï¼** å¨ç´æç³»ç»ä¸ï¼å®æ¶æè¡ä¿¡æ¯å
å«ç´æé´å¨çº¿ç¨æ·å表ï¼åç§ç¤¼ç©æè¡æ¦ï¼å¼¹å¹æ¶æ¯ï¼å¯ä»¥çè§£ä¸ºææ¶æ¯ç»´åº¦çæ¶æ¯æè¡æ¦ï¼çä¿¡æ¯ï¼éåä½¿ç¨ Redis ä¸ç Sorted Set ç»æè¿è¡åå¨ã
### 4.2.5 redis è®¾ç½®è¿ææ¶é´
Redisä¸æä¸ªè®¾ç½®æ¶é´è¿æçåè½ï¼å³å¯¹åå¨å¨ redis æ°æ®åºä¸çå¼å¯ä»¥è®¾ç½®ä¸ä¸ªè¿ææ¶é´ãä½ä¸ºä¸ä¸ªç¼åæ°æ®åºï¼è¿æ¯é常å®ç¨çã妿们ä¸è¬é¡¹ç®ä¸ç token æè
ä¸äºç»å½ä¿¡æ¯ï¼å°¤å
¶æ¯çä¿¡éªè¯ç 齿¯ææ¶é´éå¶çï¼æç
§ä¼ ç»çæ°æ®åºå¤çæ¹å¼ï¼ä¸è¬é½æ¯èªå·±å¤æè¿æï¼è¿æ ·æ çä¼ä¸¥éå½±åé¡¹ç®æ§è½ã
æä»¬ set key çæ¶åï¼é½å¯ä»¥ç»ä¸ä¸ª expire timeï¼å°±æ¯è¿ææ¶é´ï¼éè¿è¿ææ¶é´æä»¬å¯ä»¥æå®è¿ä¸ª key å¯ä»¥åæ´»çæ¶é´ã
妿åè®¾ä½ è®¾ç½®äºä¸æ¹ key åªè½åæ´»1ä¸ªå°æ¶ï¼é£ä¹æ¥ä¸æ¥1å°æ¶åï¼redisæ¯æä¹å¯¹è¿æ¹keyè¿è¡å é¤çï¼
**宿å é¤+æ°æ§å é¤ã**
éè¿åå大æ¦å°±è½çåºè¿ä¸¤ä¸ªå 餿¹å¼çææäºã
- **宿å é¤**ï¼redisé»è®¤æ¯æ¯é 100ms å°±**éæºæ½å**ä¸äºè®¾ç½®äºè¿ææ¶é´çkeyï¼æ£æ¥å
¶æ¯å¦è¿æï¼å¦æè¿æå°±å é¤ã注æè¿éæ¯éæºæ½åçã为ä»ä¹è¦éæºå¢ï¼ä½ æ³ä¸æ³åå¦ redis åäºå åä¸ä¸ª key ï¼æ¯é100mså°±éåææçè®¾ç½®è¿ææ¶é´ç key çè¯ï¼å°±ä¼ç» CPU 带æ¥å¾å¤§çè´è½½ï¼
- **æ°æ§å é¤** ï¼å®æå é¤å¯è½ä¼å¯¼è´å¾å¤è¿æ key å°äºæ¶é´å¹¶æ²¡æè¢«å 餿ãæä»¥å°±æäºæ°æ§å é¤ãåå¦ä½ çè¿æ keyï¼é 宿å 餿²¡æè¢«å 餿ï¼è¿åçå¨å
åéï¼é¤éä½ çç³»ç»å»æ¥ä¸ä¸é£ä¸ª keyï¼æä¼è¢«redisç»å 餿ãè¿å°±æ¯æè°çæ°æ§å é¤ï¼ä¹æ¯å¤æçåï¼
使¯ä»
ä»
éè¿è®¾ç½®è¿ææ¶é´è¿æ¯æé®é¢çãæä»¬æ³ä¸ä¸ï¼å¦æå®æå 餿¼æäºå¾å¤è¿æ keyï¼ç¶åä½ ä¹æ²¡åæ¶å»æ¥ï¼ä¹å°±æ²¡èµ°æ°æ§å é¤ï¼æ¤æ¶ä¼æä¹æ ·ï¼å¦æå¤§éè¿ækeyå 积å¨å
åéï¼å¯¼è´rediså
ååèå°½äºãæä¹è§£å³è¿ä¸ªé®é¢å¢ï¼ **redis å
åæ·æ±°æºå¶ã**
### 4.2.6 redis å
åæ·æ±°æºå¶(MySQLéæ2000wæ°æ®ï¼Redisä¸åªå20wçæ°æ®ï¼å¦ä½ä¿è¯Redisä¸çæ°æ®é½æ¯çç¹æ°æ®?)
redis é
ç½®æä»¶ redis.conf 䏿ç¸å
³æ³¨éï¼æè¿éå°±ä¸è´´äºï¼å¤§å®¶å¯ä»¥èªè¡æ¥é
æè
éè¿è¿ä¸ªç½åæ¥çï¼ [http://download.redis.io/redis-stable/redis.conf](http://download.redis.io/redis-stable/redis.conf)
**redis æä¾ 6ç§æ°æ®æ·æ±°çç¥ï¼**
1. **volatile-lru**ï¼ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸æéæè¿æå°ä½¿ç¨çæ°æ®æ·æ±°
2. **volatile-ttl**ï¼ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸æéå°è¦è¿æçæ°æ®æ·æ±°
3. **volatile-random**ï¼ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®éï¼server.db[i].expiresï¼ä¸ä»»æéæ©æ°æ®æ·æ±°
4. **allkeys-lru**ï¼å½å
åä¸è¶³ä»¥å®¹çº³æ°åå
¥æ°æ®æ¶ï¼å¨é®ç©ºé´ä¸ï¼ç§»é¤æè¿æå°ä½¿ç¨çkeyï¼è¿ä¸ªæ¯æå¸¸ç¨çï¼
5. **allkeys-random**ï¼ä»æ°æ®éï¼server.db[i].dictï¼ä¸ä»»æéæ©æ°æ®æ·æ±°
6. **no-eviction**ï¼ç¦æ¢é©±éæ°æ®ï¼ä¹å°±æ¯è¯´å½å
åä¸è¶³ä»¥å®¹çº³æ°åå
¥æ°æ®æ¶ï¼æ°åå
¥æä½ä¼æ¥éãè¿ä¸ªåºè¯¥æ²¡äººä½¿ç¨å§ï¼
4.0çæ¬åå¢å 以ä¸ä¸¤ç§ï¼
7. **volatile-lfu**ï¼ä»å·²è®¾ç½®è¿ææ¶é´çæ°æ®é(server.db[i].expires)䏿éæä¸ç»å¸¸ä½¿ç¨çæ°æ®æ·æ±°
8. **allkeys-lfu**ï¼å½å
åä¸è¶³ä»¥å®¹çº³æ°åå
¥æ°æ®æ¶ï¼å¨é®ç©ºé´ä¸ï¼ç§»é¤æä¸ç»å¸¸ä½¿ç¨çkey
**夿³¨ï¼ å
³äº redis è®¾ç½®è¿ææ¶é´ä»¥åå
åæ·æ±°æºå¶ï¼æè¿éåªæ¯ç®åçæ»ç»ä¸ä¸ï¼åé¢ä¼ä¸é¨åä¸ç¯æç« æ¥æ»ç»ï¼**
### 4.2.7 redis æä¹
åæºå¶(æä¹ä¿è¯ redis ææä¹ååé坿°æ®å¯ä»¥è¿è¡æ¢å¤)
å¾å¤æ¶åæä»¬éè¦æä¹
åæ°æ®ä¹å°±æ¯å°å
åä¸çæ°æ®åå
¥å°ç¡¬çéé¢ï¼å¤§é¨ååå æ¯ä¸ºäºä¹åéç¨æ°æ®ï¼æ¯å¦é坿ºå¨ãæºå¨æ
éä¹åæ¢å¤æ°æ®ï¼ï¼æè
æ¯ä¸ºäºé²æ¢ç³»ç»æ
éèå°æ°æ®å¤ä»½å°ä¸ä¸ªè¿ç¨ä½ç½®ã
Redisä¸åäºMemcachedçå¾éä¸ç¹å°±æ¯ï¼Redisæ¯ææä¹
åï¼è䏿¯æä¸¤ç§ä¸åçæä¹
åæä½ã**Redisçä¸ç§æä¹
åæ¹å¼å«å¿«ç
§ï¼snapshottingï¼RDBï¼ï¼å¦ä¸ç§æ¹å¼æ¯åªè¿½å æä»¶ï¼append-only file,AOFï¼**ãè¿ä¸¤ç§æ¹æ³åæåç§ï¼ä¸é¢æä¼è¯¦ç»è¿ä¸¤ç§æä¹
åæ¹æ³æ¯ä»ä¹ï¼æä¹ç¨ï¼å¦ä½éæ©éåèªå·±çæä¹
åæ¹æ³ã
**å¿«ç
§ï¼snapshottingï¼æä¹
åï¼RDBï¼**
Rediså¯ä»¥éè¿å建快ç
§æ¥è·å¾åå¨å¨å
åéé¢çæ°æ®å¨æä¸ªæ¶é´ç¹ä¸ç坿¬ãRediså建快ç
§ä¹åï¼å¯ä»¥å¯¹å¿«ç
§è¿è¡å¤ä»½ï¼å¯ä»¥å°å¿«ç
§å¤å¶å°å
¶ä»æå¡å¨ä»èå建å
·æç¸åæ°æ®çæå¡å¨å¯æ¬ï¼Redis主ä»ç»æï¼ä¸»è¦ç¨æ¥æé«Redisæ§è½ï¼ï¼è¿å¯ä»¥å°å¿«ç
§çå¨åå°ä»¥ä¾¿é坿å¡å¨çæ¶å使ç¨ã
å¿«ç
§æä¹
忝Redisé»è®¤éç¨çæä¹
åæ¹å¼ï¼å¨redis.confé
ç½®æä»¶ä¸é»è®¤ææ¤ä¸é
ç½®ï¼
```conf
save 900 1 #å¨900ç§(15åé)ä¹åï¼å¦æè³å°æ1个keyåçååï¼Rediså°±ä¼èªå¨è§¦åBGSAVEå½ä»¤å建快ç
§ã
save 300 10 #å¨300ç§(5åé)ä¹åï¼å¦æè³å°æ10个keyåçååï¼Rediså°±ä¼èªå¨è§¦åBGSAVEå½ä»¤å建快ç
§ã
save 60 10000 #å¨60ç§(1åé)ä¹åï¼å¦æè³å°æ10000个keyåçååï¼Rediså°±ä¼èªå¨è§¦åBGSAVEå½ä»¤å建快ç
§ã
```
**AOFï¼append-only fileï¼æä¹
å**
ä¸å¿«ç
§æä¹
åç¸æ¯ï¼AOFæä¹
å ç宿¶æ§æ´å¥½ï¼å æ¤å·²æä¸ºä¸»æµçæä¹
åæ¹æ¡ãé»è®¤æ
åµä¸Redis没æå¼å¯AOFï¼append only fileï¼æ¹å¼çæä¹
åï¼å¯ä»¥éè¿appendonlyåæ°å¼å¯ï¼
```conf
appendonly yes
```
å¼å¯AOFæä¹
å忝æ§è¡ä¸æ¡ä¼æ´æ¹Redisä¸çæ°æ®çå½ä»¤ï¼Rediså°±ä¼å°è¯¥å½ä»¤åå
¥ç¡¬çä¸çAOFæä»¶ãAOFæä»¶çä¿åä½ç½®åRDBæä»¶çä½ç½®ç¸åï¼é½æ¯éè¿diråæ°è®¾ç½®çï¼é»è®¤çæä»¶åæ¯appendonly.aofã
å¨Redisçé
ç½®æä»¶ä¸åå¨ä¸ç§ä¸åç AOF æä¹
åæ¹å¼ï¼å®ä»¬å嫿¯ï¼
```conf
appendfsync always #æ¯æ¬¡ææ°æ®ä¿®æ¹åçæ¶é½ä¼åå
¥AOFæä»¶,è¿æ ·ä¼ä¸¥ééä½Redisçé度
appendfsync everysec #æ¯ç§é忥䏿¬¡ï¼æ¾ç¤ºå°å°å¤ä¸ªåå½ä»¤åæ¥å°ç¡¬ç
appendfsync no #让æä½ç³»ç»å³å®ä½æ¶è¿è¡åæ¥
```
为äºå
¼é¡¾æ°æ®ååå
¥æ§è½ï¼ç¨æ·å¯ä»¥èè appendfsync everysecé项 ï¼è®©Redisæ¯ç§åæ¥ä¸æ¬¡AOFæä»¶ï¼Redisæ§è½å 乿²¡åå°ä»»ä½å½±åãèä¸è¿æ ·å³ä½¿åºç°ç³»ç»å´©æºï¼ç¨æ·æå¤åªä¼ä¸¢å¤±ä¸ç§ä¹å
产ççæ°æ®ãå½ç¡¬çå¿äºæ§è¡åå
¥æä½çæ¶åï¼Redisè¿ä¼ä¼é
çæ¾æ
¢èªå·±çé度以便éåºç¡¬ççæå¤§åå
¥é度ã
**Redis 4.0 å¯¹äºæä¹
åæºå¶çä¼å**
Redis 4.0 å¼å§æ¯æ RDB å AOF çæ··åæä¹
åï¼é»è®¤å
³éï¼å¯ä»¥éè¿é
置项 `aof-use-rdb-preamble` å¼å¯ï¼ã
å¦æææ··åæä¹
åæå¼ï¼AOF éåçæ¶åå°±ç´æ¥æ RDB çå
容åå° AOF æä»¶å¼å¤´ãè¿æ ·åç好夿¯å¯ä»¥ç»å RDB å AOF çä¼ç¹, å¿«éå è½½åæ¶é¿å
丢失è¿å¤çæ°æ®ãå½ç¶ç¼ºç¹ä¹æ¯æçï¼ AOF éé¢ç RDB é¨åæ¯åç¼©æ ¼å¼ä¸åæ¯ AOF æ ¼å¼ï¼å¯è¯»æ§è¾å·®ã
**è¡¥å
å
容ï¼AOF éå**
AOFéåå¯ä»¥äº§çä¸ä¸ªæ°çAOFæä»¶ï¼è¿ä¸ªæ°çAOFæä»¶ååæçAOFæä»¶æä¿åçæ°æ®åºç¶æä¸æ ·ï¼ä½ä½ç§¯æ´å°ã
AOFé忝ä¸ä¸ªææ§ä¹çååï¼è¯¥åè½æ¯éè¿è¯»åæ°æ®åºä¸çé®å¼å¯¹æ¥å®ç°çï¼ç¨åºæ é¡»å¯¹ç°æAOFæä»¶è¿è¡ä»»ä½è¯»å
¥ãåææè
åå
¥æä½ã
卿§è¡ BGREWRITEAOF å½ä»¤æ¶ï¼Redis æå¡å¨ä¼ç»´æ¤ä¸ä¸ª AOF éåç¼å²åºï¼è¯¥ç¼å²åºä¼å¨åè¿ç¨å建æ°AOFæä»¶æé´ï¼è®°å½æå¡å¨æ§è¡çææåå½ä»¤ãå½åè¿ç¨å®æå建æ°AOFæä»¶çå·¥ä½ä¹åï¼æå¡å¨ä¼å°éåç¼å²åºä¸çææå
容追å å°æ°AOFæä»¶çæ«å°¾ï¼ä½¿å¾æ°æ§ä¸¤ä¸ªAOFæä»¶æä¿åçæ°æ®åºç¶æä¸è´ãæåï¼æå¡å¨ç¨æ°çAOFæä»¶æ¿æ¢æ§çAOFæä»¶ï¼ä»¥æ¤æ¥å®æAOFæä»¶éåæä½
**æ´å¤å
容å¯ä»¥æ¥çæçè¿ç¯æç« ï¼**
- [Redisæä¹
å](Redisæä¹
å.md)
### 4.2.8 redis äºå¡
Redis éè¿ MULTIãEXECãWATCH çå½ä»¤æ¥å®ç°äºå¡(transaction)åè½ãäºå¡æä¾äºä¸ç§å°å¤ä¸ªå½ä»¤è¯·æ±æå
ï¼ç¶å䏿¬¡æ§ãæé¡ºåºå°æ§è¡å¤ä¸ªå½ä»¤çæºå¶ï¼å¹¶ä¸å¨äºå¡æ§è¡æé´ï¼æå¡å¨ä¸ä¼ä¸æäºå¡èæ¹å»æ§è¡å
¶ä»å®¢æ·ç«¯çå½ä»¤è¯·æ±ï¼å®ä¼å°äºå¡ä¸çææå½ä»¤é½æ§è¡å®æ¯ï¼ç¶åæå»å¤çå
¶ä»å®¢æ·ç«¯çå½ä»¤è¯·æ±ã
å¨ä¼ ç»çå
³ç³»å¼æ°æ®åºä¸ï¼å¸¸å¸¸ç¨ ACID æ§è´¨æ¥æ£éªäºå¡åè½çå¯é æ§åå®å
¨æ§ãå¨ Redis ä¸ï¼äºå¡æ»æ¯å
·æååæ§ï¼Atomicityï¼ãä¸è´æ§ï¼Consistencyï¼åé离æ§ï¼Isolationï¼ï¼å¹¶ä¸å½ Redis è¿è¡å¨æç§ç¹å®çæä¹
忍¡å¼ä¸æ¶ï¼äºå¡ä¹å
·ææä¹
æ§ï¼Durabilityï¼ã
è¡¥å
å
容ï¼
> 1. redisåä¸ä¸ªäºå¡ä¸å¦ææä¸æ¡å½ä»¤æ§è¡å¤±è´¥ï¼å
¶åçå½ä»¤ä»ç¶ä¼è¢«æ§è¡ï¼æ²¡æåæ»ãï¼æ¥èª[issue:å
³äºRedisäºå¡ä¸æ¯ååæ§é®é¢](https://github.com/Snailclimb/JavaGuide/issues/452) ï¼
### 4.2.9 ç¼åéªå´©åç¼åç©¿éé®é¢è§£å³æ¹æ¡
#### **ç¼åéªå´©**
**ä»ä¹æ¯ç¼åéªå´©ï¼**
ç®ä»ï¼ç¼åå䏿¶é´å¤§é¢ç§¯ç失æï¼æä»¥ï¼åé¢ç请æ±é½ä¼è½å°æ°æ®åºä¸ï¼é ææ°æ®åºçæ¶é´å
æ¿å大é请æ±èå´©æã
**æåªäºè§£å³åæ³ï¼**
ï¼ä¸åç³æèå¸å¨ä»çè§é¢ä¸æå°è¿ï¼è§é¢å°å卿åä¸ä¸ªé®é¢ä¸ææå°ï¼ï¼
- äºåï¼å°½éä¿è¯æ´ä¸ª redis é群çé«å¯ç¨æ§ï¼åç°æºå¨å®æºå°½å¿«è¡¥ä¸ãéæ©åéçå
åæ·æ±°çç¥ã
- äºä¸ï¼æ¬å°ehcacheç¼å + hystrixéæµ&é级ï¼é¿å
MySQLå´©æ
- äºåï¼å©ç¨ redis æä¹
åæºå¶ä¿åçæ°æ®å°½å¿«æ¢å¤ç¼å

#### **ç¼åç©¿é**
**ä»ä¹æ¯ç¼åç©¿éï¼**
ç¼åç©¿é说ç®åç¹å°±æ¯å¤§é请æ±ç key æ ¹æ¬ä¸åå¨äºç¼åä¸ï¼å¯¼è´è¯·æ±ç´æ¥å°äºæ°æ®åºä¸ï¼æ ¹æ¬æ²¡æç»è¿ç¼åè¿ä¸å±ã举个ä¾åï¼æä¸ªé»å®¢æ
æå¶é æä»¬ç¼åä¸ä¸åå¨ç key å起大é请æ±ï¼å¯¼è´å¤§é请æ±è½å°æ°æ®åºãä¸é¢ç¨å¾çå±ç¤ºä¸ä¸(è¿ä¸¤å¼ å¾ç䏿¯æç»çï¼ä¸ºäºçäºç´æ¥å¨ç½ä¸æ¾çï¼è¿é说æä¸ä¸)ï¼
**æ£å¸¸ç¼åå¤çæµç¨ï¼**
**ç¼åç©¿éæ
åµå¤çæµç¨ï¼**
ä¸è¬MySQL é»è®¤çæå¤§è¿æ¥æ°å¨ 150 å·¦å³ï¼è¿ä¸ªå¯ä»¥éè¿ `show variables like '%max_connections%'; `å½ä»¤æ¥æ¥çãæå¤§è¿æ¥æ°ä¸ä¸ªè¿åªæ¯ä¸ä¸ªææ ï¼cpuï¼å
åï¼ç£çï¼ç½ç»çæ 忡件齿¯å
¶è¿è¡ææ ï¼è¿äºææ é½ä¼éå¶å
¶å¹¶åè½åï¼æä»¥ï¼ä¸è¬ 3000 个并å请æ±å°±è½ææ»å¤§é¨åæ°æ®åºäºã
**æåªäºè§£å³åæ³ï¼**
æåºæ¬çå°±æ¯é¦å
åå¥½åæ°æ ¡éªï¼ä¸äºä¸åæ³çåæ°è¯·æ±ç´æ¥æåºå¼å¸¸ä¿¡æ¯è¿åç»å®¢æ·ç«¯ãæ¯å¦æ¥è¯¢çæ°æ®åº id ä¸è½å°äº 0ãä¼ å
¥çé®ç®±æ ¼å¼ä¸å¯¹çæ¶åç´æ¥è¿åéè¯¯æ¶æ¯ç»å®¢æ·ç«¯ççã
**1ï¼ç¼åæ æ key** : 妿ç¼ååæ°æ®åºé½æ¥ä¸å°æä¸ª key çæ°æ®å°±åä¸ä¸ªå° redis ä¸å»å¹¶è®¾ç½®è¿ææ¶é´ï¼å
·ä½å½ä»¤å¦ä¸ï¼`SET key value EX 10086`ãè¿ç§æ¹å¼å¯ä»¥è§£å³è¯·æ±ç key ååä¸é¢ç¹çæ
åµï¼å¦æé»å®¢æ¶ææ»å»ï¼æ¯æ¬¡æå»ºä¸åç请æ±keyï¼ä¼å¯¼è´ redis ä¸ç¼åå¤§éæ æç key ã徿æ¾ï¼è¿ç§æ¹æ¡å¹¶ä¸è½ä»æ ¹æ¬ä¸è§£å³æ¤é®é¢ã妿éè¦ç¨è¿ç§æ¹å¼æ¥è§£å³ç©¿éé®é¢çè¯ï¼å°½éå°æ æç key çè¿ææ¶é´è®¾ç½®çä¸ç¹æ¯å¦ 1 åéã
å¦å¤ï¼è¿éå¤è¯´ä¸å´ï¼ä¸è¬æ
åµä¸æä»¬æ¯è¿æ ·è®¾è®¡ key çï¼ `表å:åå:主é®å:主é®å¼`ã
å¦æç¨ Java 代ç å±ç¤ºçè¯ï¼å·®ä¸å¤æ¯ä¸é¢è¿æ ·çï¼
```java
public Object getObjectInclNullById(Integer id) {
// ä»ç¼åä¸è·åæ°æ®
Object cacheValue = cache.get(id);
// ç¼å为空
if (cacheValue == null) {
// 仿°æ®åºä¸è·å
Object storageValue = storage.get(key);
// ç¼å空对象
cache.set(key, storageValue);
// 妿å卿°æ®ä¸ºç©ºï¼éè¦è®¾ç½®ä¸ä¸ªè¿ææ¶é´(300ç§)
if (storageValue == null) {
// å¿
é¡»è®¾ç½®è¿ææ¶é´ï¼å¦åæè¢«æ»å»çé£é©
cache.expire(key, 60 * 5);
}
return storageValue;
}
return cacheValue;
}
```
**2ï¼å¸éè¿æ»¤å¨ï¼**å¸éè¿æ»¤å¨æ¯ä¸ä¸ªé常ç¥å¥çæ°æ®ç»æï¼éè¿å®æä»¬å¯ä»¥é常æ¹ä¾¿å°å¤æä¸ä¸ªç»å®æ°æ®æ¯å¦åå¨ä¸æµ·éæ°æ®ä¸ãæä»¬éè¦çå°±æ¯å¤æ key æ¯å¦åæ³ï¼ææ²¡ææè§å¸éè¿æ»¤å¨å°±æ¯æä»¬æ³è¦æ¾çé£ä¸ªâ人âãå
·ä½æ¯è¿æ ·åçï¼æææå¯è½åå¨ç请æ±çå¼é½åæ¾å¨å¸éè¿æ»¤å¨ä¸ï¼å½ç¨æ·è¯·æ±è¿æ¥ï¼æä¼å
å¤æç¨æ·åæ¥ç请æ±ç弿¯å¦åå¨äºå¸éè¿æ»¤å¨ä¸ãä¸åå¨çè¯ï¼ç´æ¥è¿å请æ±åæ°é误信æ¯ç»å®¢æ·ç«¯ï¼åå¨çè¯æä¼èµ°ä¸é¢çæµç¨ãæ»ç»ä¸ä¸å°±æ¯ä¸é¢è¿å¼ å¾(è¿å¼ å¾ç䏿¯æç»çï¼ä¸ºäºçäºç´æ¥å¨ç½ä¸æ¾ç)ï¼
æ´å¤å
³äºå¸éè¿æ»¤å¨çå
容å¯ä»¥çæçè¿ç¯ååï¼[ãä¸äºè§£å¸éè¿æ»¤å¨ï¼ä¸æç»ä½ æ´çææç½ç½ï¼ã](https://github.com/Snailclimb/JavaGuide/blob/master/docs/dataStructures-algorithms/data-structure/bloom-filter.md) ï¼å¼ºçæ¨èï¼ä¸ªäººæè§ç½ä¸åºè¯¥æ¾ä¸å°æ»ç»çè¿ä¹ææç½ç½çæç« äºã
### 4.2.10 å¦ä½è§£å³ Redis çå¹¶åç«äº Key é®é¢
æè° Redis çå¹¶åç«äº Key çé®é¢ä¹å°±æ¯å¤ä¸ªç³»ç»åæ¶å¯¹ä¸ä¸ª key è¿è¡æä½ï¼ä½æ¯æåæ§è¡ç顺åºåæä»¬ææç顺åºä¸åï¼è¿æ ·ä¹å°±å¯¼è´äºç»æçä¸åï¼
æ¨èä¸ç§æ¹æ¡ï¼åå¸å¼éï¼zookeeper å redis é½å¯ä»¥å®ç°åå¸å¼éï¼ãï¼å¦æä¸åå¨ Redis çå¹¶åç«äº Key é®é¢ï¼ä¸è¦ä½¿ç¨åå¸å¼éï¼è¿æ ·ä¼å½±åæ§è½ï¼
åºäºzookeeperä¸´æ¶æåºèç¹å¯ä»¥å®ç°çåå¸å¼éãå¤§è´ææ³ä¸ºï¼æ¯ä¸ªå®¢æ·ç«¯å¯¹æä¸ªæ¹æ³å éæ¶ï¼å¨zookeeperä¸çä¸è¯¥æ¹æ³å¯¹åºçæå®èç¹çç®å½ä¸ï¼çæä¸ä¸ªå¯ä¸çç¬æ¶æåºèç¹ã 夿æ¯å¦è·åéçæ¹å¼å¾ç®åï¼åªéè¦å¤ææåºèç¹ä¸åºå·æå°çä¸ä¸ªã å½éæ¾éçæ¶åï¼åªéå°è¿ä¸ªç¬æ¶èç¹å é¤å³å¯ãåæ¶ï¼å
¶å¯ä»¥é¿å
æå¡å®æºå¯¼è´çéæ æ³éæ¾ï¼è产ççæ»éé®é¢ã宿ä¸å¡æµç¨åï¼å é¤å¯¹åºçåèç¹éæ¾éã
å¨å®è·µä¸ï¼å½ç¶æ¯ä»ä»¥å¯é æ§ä¸ºä¸»ãæä»¥é¦æ¨Zookeeperã
åèï¼
- https://www.jianshu.com/p/8bddd381de06
### 4.2.11 å¦ä½ä¿è¯ç¼å䏿°æ®åºååæ¶çæ°æ®ä¸è´æ§?
> ä¸è¬æ
åµä¸æä»¬é½æ¯è¿æ ·ä½¿ç¨ç¼åçï¼å
读ç¼åï¼ç¼å没æçè¯ï¼å°±è¯»æ°æ®åºï¼ç¶åååºæ°æ®åæ¾å
¥ç¼åï¼åæ¶è¿åååºãè¿ç§æ¹å¼å¾ææ¾ä¼åå¨ç¼ååæ°æ®åºçæ°æ®ä¸ä¸è´çæ
åµã
ä½ åªè¦ç¨ç¼åï¼å°±å¯è½ä¼æ¶åå°ç¼å䏿°æ®åºååå¨ååï¼ä½ åªè¦æ¯ååï¼å°±ä¸å®ä¼ææ°æ®ä¸è´æ§çé®é¢ï¼é£ä¹ä½ å¦ä½è§£å³ä¸è´æ§é®é¢ï¼
ä¸è¬æ¥è¯´ï¼å°±æ¯å¦æä½ çç³»ç»ä¸æ¯ä¸¥æ ¼è¦æ±ç¼å+æ°æ®åºå¿
é¡»ä¸è´æ§çè¯ï¼ç¼åå¯ä»¥ç¨å¾®çè·æ°æ®åºå¶å°æä¸ä¸è´çæ
åµï¼æå¥½ä¸è¦åè¿ä¸ªæ¹æ¡ï¼è¯»è¯·æ±åå请æ±ä¸²è¡åï¼ä¸²å°ä¸ä¸ªå
åéåéå»ï¼è¿æ ·å°±å¯ä»¥ä¿è¯ä¸å®ä¸ä¼åºç°ä¸ä¸è´çæ
åµ
串è¡åä¹åï¼å°±ä¼å¯¼è´ç³»ç»çååéä¼å¤§å¹
度çéä½ï¼ç¨æ¯æ£å¸¸æ
åµä¸å¤å åçæºå¨å»æ¯æçº¿ä¸çä¸ä¸ªè¯·æ±ã
æ´å¤å
容å¯ä»¥æ¥çï¼https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-consistence.md
**åèï¼** Javaå·¥ç¨å¸é¢è¯çªå»ç¬¬1å£ï¼å¯è½æ¯å²ä¸æå¥½çJavaé¢è¯çªå»è¯¾ç¨ï¼-ä¸åç³æèå¸ï¼å
¬ä¼å·åå°åå¤å
³é®åâ1âå³å¯è·å该è§é¢å
容ã
### åè
- ãRediså¼åä¸è¿ç»´ã
- Redis å½ä»¤æ»ç»ï¼http://redisdoc.com/string/set.html
------
# äº å¸¸ç¨æ¡æ¶é¢è¯é¢æ»ç»
## 5.1 Springé¢è¯é¢æ»ç»
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
è¿ç¯æç« ä¸»è¦æ¯æ³éè¿ä¸äºé®é¢ï¼å æ·±å¤§å®¶å¯¹äº Spring ççè§£ï¼æä»¥ä¸ä¼æ¶å太å¤ç代ç ï¼è¿ç¯æç« æ´çäºæºé¿æ¶é´ï¼ä¸é¢çå¾å¤é®é¢æèªå·±å¨ä½¿ç¨ Spring çè¿ç¨ä¸ä¹å¹¶æ²¡ææ³¨æï¼èªå·±ä¹æ¯ä¸´æ¶æ¥é
äºå¾å¤èµæå书ç±è¡¥ä¸çãç½ä¸ä¹æä¸äºå¾å¤å
³äº Spring 常è§é®é¢/é¢è¯é¢æ´ççæç« ï¼ææè§å¤§é¨å齿¯äºç¸ copyï¼èä¸å¾å¤é®é¢ä¹ä¸æ¯å¾å¥½ï¼æäºåçä¹åå¨é®é¢ãæä»¥ï¼èªå·±è±äºä¸å¨çä¸ä½æ¶é´æ´çäºä¸ä¸ï¼å¸æå¯¹å¤§å®¶æå¸®å©ã
### 5.1.1. ä»ä¹æ¯ Spring æ¡æ¶?
Spring æ¯ä¸ç§è½»é级å¼åæ¡æ¶ï¼æ¨å¨æé«å¼å人åçå¼åæç以åç³»ç»çå¯ç»´æ¤æ§ãSpring å®ç½ï¼ã
æä»¬ä¸è¬è¯´ Spring æ¡æ¶æç齿¯ Spring Frameworkï¼å®æ¯å¾å¤æ¨¡åçéåï¼ä½¿ç¨è¿äºæ¨¡åå¯ä»¥å¾æ¹ä¾¿å°å婿们è¿è¡å¼åãè¿äºæ¨¡åæ¯ï¼æ ¸å¿å®¹å¨ãæ°æ®è®¿é®/éæ,ãWebãAOPï¼é¢ååé¢ç¼ç¨ï¼ãå·¥å
·ãæ¶æ¯åæµè¯æ¨¡åãæ¯å¦ï¼Core Container ä¸ç Core ç»ä»¶æ¯Spring ææç»ä»¶çæ ¸å¿ï¼Beans ç»ä»¶å Context ç»ä»¶æ¯å®ç°IOCåä¾èµæ³¨å
¥çåºç¡ï¼AOPç»ä»¶ç¨æ¥å®ç°é¢ååé¢ç¼ç¨ã
Spring å®ç½ååºç Spring ç 6 个ç¹å¾:
- **æ ¸å¿ææ¯** ï¼ä¾èµæ³¨å
¥(DI)ï¼AOPï¼äºä»¶(events)ï¼èµæºï¼i18nï¼éªè¯ï¼æ°æ®ç»å®ï¼ç±»å转æ¢ï¼SpELã
- **æµè¯** ï¼æ¨¡æå¯¹è±¡ï¼TestContextæ¡æ¶ï¼Spring MVC æµè¯ï¼WebTestClientã
- **æ°æ®è®¿é®** ï¼äºå¡ï¼DAOæ¯æï¼JDBCï¼ORMï¼ç¼ç»XMLã
- **Webæ¯æ** : Spring MVCåSpring WebFlux Webæ¡æ¶ã
- **éæ** ï¼è¿ç¨å¤çï¼JMSï¼JCAï¼JMXï¼çµåé®ä»¶ï¼ä»»å¡ï¼è°åº¦ï¼ç¼åã
- **è¯è¨** ï¼Kotlinï¼Groovyï¼å¨æè¯è¨ã
### 5.1.2 å举ä¸äºéè¦çSpring模åï¼
ä¸å¾å¯¹åºçæ¯ Spring4.x çæ¬ãç®åææ°ç5.xçæ¬ä¸ Web 模åç Portlet ç»ä»¶å·²ç»è¢«åºå¼æï¼åæ¶å¢å äºç¨äºå¼æ¥ååºå¼å¤çç WebFlux ç»ä»¶ã

- **Spring Coreï¼** åºç¡,å¯ä»¥è¯´ Spring å
¶ä»ææçåè½é½éè¦ä¾èµäºè¯¥ç±»åºãä¸»è¦æä¾ IoC ä¾èµæ³¨å
¥åè½ã
- **Spring Aspects** ï¼ è¯¥æ¨¡å为ä¸AspectJç鿿便¯æã
- **Spring AOP** ï¼æä¾äºé¢ååé¢çç¼ç¨å®ç°ã
- **Spring JDBC** : Javaæ°æ®åºè¿æ¥ã
- **Spring JMS** ï¼Javaæ¶æ¯æå¡ã
- **Spring ORM** : ç¨äºæ¯æHibernateçORMå·¥å
·ã
- **Spring Web** : 为å建Webåºç¨ç¨åºæä¾æ¯æã
- **Spring Test** : æä¾äºå¯¹ JUnit å TestNG æµè¯çæ¯æã
### 5.1.3 @RestController vs @Controller
**`Controller` è¿åä¸ä¸ªé¡µé¢**
åç¬ä½¿ç¨ `@Controller` ä¸å `@ResponseBody`çè¯ä¸è¬ä½¿ç¨å¨è¦è¿åä¸ä¸ªè§å¾çæ
åµï¼è¿ç§æ
åµå±äºæ¯è¾ä¼ ç»çSpring MVC çåºç¨ï¼å¯¹åºäºåå端ä¸å离çæ
åµã

**`@RestController` è¿åJSON æ XML 形弿°æ®**
ä½`@RestController`åªè¿å对象ï¼å¯¹è±¡æ°æ®ç´æ¥ä»¥ JSON æ XML å½¢å¼åå
¥ HTTP ååº(Response)ä¸ï¼è¿ç§æ
åµå±äº RESTful Webæå¡ï¼è¿ä¹æ¯ç®åæ¥å¸¸å¼åææ¥è§¦çæå¸¸ç¨çæ
åµï¼åå端å离ï¼ã

**`@Controller +@ResponseBody` è¿åJSON æ XML 形弿°æ®**
å¦æä½ éè¦å¨Spring4ä¹åå¼å RESTful Webæå¡çè¯ï¼ä½ éè¦ä½¿ç¨`@Controller` å¹¶ç»å`@ResponseBody`注解ï¼ä¹å°±æ¯è¯´`@Controller` +`@ResponseBody`= `@RestController`ï¼Spring 4 ä¹åæ°å çæ³¨è§£ï¼ã
> `@ResponseBody` 注解çä½ç¨æ¯å° `Controller` çæ¹æ³è¿åç对象éè¿éå½ç转æ¢å¨è½¬æ¢ä¸ºæå®çæ ¼å¼ä¹åï¼åå
¥å°HTTP ååº(Response)对象ç body ä¸ï¼éå¸¸ç¨æ¥è¿å JSON æè
XML æ°æ®ï¼è¿å JSON æ°æ®çæ
嵿¯è¾å¤ã

Reference:
- https://dzone.com/articles/spring-framework-restcontroller-vs-controllerï¼å¾çæ¥æºï¼
- https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html?m=1
### 5.1.4 Spring IOC & AOP
#### è°è°èªå·±å¯¹äº Spring IoC å AOP ççè§£
##### IoC
IoCï¼Inverse of Control:æ§å¶åè½¬ï¼æ¯ä¸ç§**è®¾è®¡ææ³**ï¼å°±æ¯ **å°åæ¬å¨ç¨åºä¸æå¨åå»ºå¯¹è±¡çæ§å¶æï¼äº¤ç±Springæ¡æ¶æ¥ç®¡çã** IoC å¨å
¶ä»è¯è¨ä¸ä¹æåºç¨ï¼å¹¶é Spring ç¹æã **IoC 容卿¯ Spring ç¨æ¥å®ç° IoC çè½½ä½ï¼ IoC 容å¨å®é
ä¸å°±æ¯ä¸ªMapï¼keyï¼valueï¼,Map ä¸åæ¾çæ¯åç§å¯¹è±¡ã**
å°å¯¹è±¡ä¹é´çç¸äºä¾èµå
³ç³»äº¤ç» IoC 容卿¥ç®¡çï¼å¹¶ç± IoC 容å¨å®æå¯¹è±¡ç注å
¥ãè¿æ ·å¯ä»¥å¾å¤§ç¨åº¦ä¸ç®ååºç¨çå¼åï¼æåºç¨ä»å¤æçä¾èµå
³ç³»ä¸è§£æ¾åºæ¥ã **IoC 容å¨å°±åæ¯ä¸ä¸ªå·¥å䏿 ·ï¼å½æä»¬éè¦å建ä¸ä¸ªå¯¹è±¡çæ¶åï¼åªéè¦é
置好é
ç½®æä»¶/注解å³å¯ï¼å®å
¨ä¸ç¨èè对象æ¯å¦ä½è¢«åå»ºåºæ¥çã** å¨å®é
项ç®ä¸ä¸ä¸ª Service ç±»å¯è½æå ç¾çè³ä¸å个类ä½ä¸ºå®çåºå±ï¼å妿们éè¦å®ä¾åè¿ä¸ª Serviceï¼ä½ å¯è½è¦æ¯æ¬¡é½è¦ææ¸
è¿ä¸ª Service ææåºå±ç±»çæé 彿°ï¼è¿å¯è½ä¼æäººé¼ç¯ã妿å©ç¨ IoC çè¯ï¼ä½ åªéè¦é
置好ï¼ç¶åå¨éè¦çå°æ¹å¼ç¨å°±è¡äºï¼è¿å¤§å¤§å¢å äºé¡¹ç®çå¯ç»´æ¤æ§ä¸éä½äºå¼åé¾åº¦ã
Spring æ¶ä»£æä»¬ä¸è¬éè¿ XML æä»¶æ¥é
ç½® Beanï¼åæ¥å¼å人åè§å¾ XML æä»¶æ¥é
ç½®ä¸å¤ªå¥½ï¼äºæ¯ SpringBoot 注解é
置就æ
¢æ
¢å¼å§æµè¡èµ·æ¥ã
æ¨èé
读ï¼https://www.zhihu.com/question/23277575/answer/169698662
**Spring IoCçåå§åè¿ç¨ï¼**

IoCæºç é
读
- https://javadoop.com/post/spring-ioc
##### AOP
AOP(Aspect-Oriented Programming:é¢ååé¢ç¼ç¨)è½å¤å°é£äºä¸ä¸å¡æ å
³ï¼**å´ä¸ºä¸å¡æ¨¡åæå
±åè°ç¨çé»è¾æè´£ä»»ï¼ä¾å¦äºå¡å¤çãæ¥å¿ç®¡çãæéæ§å¶çï¼å°è£
èµ·æ¥**ï¼ä¾¿äº**åå°ç³»ç»çéå¤ä»£ç **ï¼**é使¨¡åé´çè¦å度**ï¼å¹¶**æå©äºæªæ¥ç坿屿§åå¯ç»´æ¤æ§**ã
**Spring AOPå°±æ¯åºäºå¨æä»£çç**ï¼å¦æè¦ä»£çç对象ï¼å®ç°äºæä¸ªæ¥å£ï¼é£ä¹Spring AOPä¼ä½¿ç¨**JDK Proxy**ï¼å»å建代ç对象ï¼èå¯¹äºæ²¡æå®ç°æ¥å£ç对象ï¼å°±æ æ³ä½¿ç¨ JDK Proxy å»è¿è¡ä»£çäºï¼è¿æ¶åSpring AOPä¼ä½¿ç¨**Cglib** ï¼è¿æ¶åSpring AOPä¼ä½¿ç¨ **Cglib** çæä¸ä¸ªè¢«ä»£ç对象çåç±»æ¥ä½ä¸ºä»£çï¼å¦ä¸å¾æç¤ºï¼

å½ç¶ä½ ä¹å¯ä»¥ä½¿ç¨ AspectJ ,Spring AOP å·²ç»éæäºAspectJ ï¼AspectJ åºè¯¥ç®ç䏿¯ Java çæç³»ç»ä¸æå®æ´ç AOP æ¡æ¶äºã
ä½¿ç¨ AOP ä¹åæä»¬å¯ä»¥æä¸äºéç¨åè½æ½è±¡åºæ¥ï¼å¨éè¦ç¨å°çå°æ¹ç´æ¥ä½¿ç¨å³å¯ï¼è¿æ ·å¤§å¤§ç®åäºä»£ç éãæä»¬éè¦å¢å æ°åè½æ¶ä¹æ¹ä¾¿ï¼è¿æ ·ä¹æé«äºç³»ç»æ©å±æ§ãæ¥å¿åè½ãäºå¡ç®¡çççåºæ¯é½ç¨å°äº AOP ã
#### Spring AOP å AspectJ AOP æä»ä¹åºå«ï¼
**Spring AOP å±äºè¿è¡æ¶å¢å¼ºï¼è AspectJ æ¯ç¼è¯æ¶å¢å¼ºã** Spring AOP åºäºä»£ç(Proxying)ï¼è AspectJ åºäºåèç æä½(Bytecode Manipulation)ã
Spring AOP å·²ç»éæäº AspectJ ï¼AspectJ åºè¯¥ç®ç䏿¯ Java çæç³»ç»ä¸æå®æ´ç AOP æ¡æ¶äºãAspectJ ç¸æ¯äº Spring AOP åè½æ´å 强大ï¼ä½æ¯ Spring AOP ç¸å¯¹æ¥è¯´æ´ç®åï¼
妿æä»¬çå颿¯è¾å°ï¼é£ä¹ä¸¤è
æ§è½å·®å¼ä¸å¤§ã使¯ï¼å½åé¢å¤ªå¤çè¯ï¼æå¥½éæ© AspectJ ï¼å®æ¯Spring AOP å¿«å¾å¤ã
> ä½è
ï¼Guideå¥ã
>
> **ä»ç»:** Github 70k Star é¡¹ç® **[JavaGuide](https://github.com/Snailclimb/JavaGuide)**ï¼å
¬ä¼å·ååï¼ ä½è
ãæ¯å¨é½ä¼å¨å
¬ä¼å·æ´æ°ä¸äºèªå·±åå干货ãå
¬ä¼å·åå°åå¤â1âé¢åJavaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæ+é¢è¯çªå»pdfã
### 5.1.5 Spring bean
#### Spring ä¸ç bean çä½ç¨åæåªäº?
- singleton : å¯ä¸ bean å®ä¾ï¼Spring ä¸ç bean é»è®¤é½æ¯åä¾çã
- prototype : æ¯æ¬¡è¯·æ±é½ä¼å建ä¸ä¸ªæ°ç bean å®ä¾ã
- request : æ¯ä¸æ¬¡HTTP请æ±é½ä¼äº§çä¸ä¸ªæ°çbeanï¼è¯¥beanä»
å¨å½åHTTP requestå
ææã
- session : æ¯ä¸æ¬¡HTTP请æ±é½ä¼äº§çä¸ä¸ªæ°ç beanï¼è¯¥beanä»
å¨å½å HTTP session å
ææã
- global-sessionï¼ å
¨å±sessionä½ç¨åï¼ä»
ä»
å¨åºäºportletçwebåºç¨ä¸æææä¹ï¼Spring5å·²ç»æ²¡æäºãPortletæ¯è½å¤çæè¯ä¹ä»£ç (ä¾å¦ï¼HTML)çæ®µçå°åJava Webæä»¶ãå®ä»¬åºäºportlet容å¨ï¼å¯ä»¥åservlet䏿 ·å¤çHTTP请æ±ã使¯ï¼ä¸ servlet ä¸åï¼æ¯ä¸ª portlet 齿ä¸åçä¼è¯
#### Spring ä¸çåä¾ bean ç线ç¨å®å
¨é®é¢äºè§£åï¼
大é¨åæ¶åæä»¬å¹¶æ²¡æå¨ç³»ç»ä¸ä½¿ç¨å¤çº¿ç¨ï¼æä»¥å¾å°æäººä¼å
³æ³¨è¿ä¸ªé®é¢ãåä¾ bean åå¨çº¿ç¨é®é¢ï¼ä¸»è¦æ¯å 为å½å¤ä¸ªçº¿ç¨æä½åä¸ä¸ªå¯¹è±¡çæ¶åï¼å¯¹è¿ä¸ªå¯¹è±¡çééææååéçåæä½ä¼åå¨çº¿ç¨å®å
¨é®é¢ã
常è§çæä¸¤ç§è§£å³åæ³ï¼
1. å¨Bean对象ä¸å°½éé¿å
å®ä¹å¯åçæååéï¼ä¸å¤ªç°å®ï¼ã
2. å¨ç±»ä¸å®ä¹ä¸ä¸ªThreadLocalæååéï¼å°éè¦çå¯åæååéä¿åå¨ ThreadLocal ä¸ï¼æ¨èçä¸ç§æ¹å¼ï¼ã
#### @Component å @Bean çåºå«æ¯ä»ä¹ï¼
1. ä½ç¨å¯¹è±¡ä¸å: `@Component` 注解ä½ç¨äºç±»ï¼è`@Bean`注解ä½ç¨äºæ¹æ³ã
2. `@Component`é常æ¯éè¿ç±»è·¯å¾æ«ææ¥èªå¨ä¾¦æµä»¥åèªå¨è£
é
å°Spring容å¨ä¸ï¼æä»¬å¯ä»¥ä½¿ç¨ `@ComponentScan` 注解å®ä¹è¦æ«æçè·¯å¾ä»ä¸æ¾åºæ è¯äºéè¦è£
é
çç±»èªå¨è£
é
å° Spring ç bean 容å¨ä¸ï¼ã`@Bean` 注解éå¸¸æ¯æä»¬å¨æ æè¯¥æ³¨è§£çæ¹æ³ä¸å®ä¹äº§çè¿ä¸ª bean,`@Bean`åè¯äºSpringè¿æ¯æä¸ªç±»ç示ä¾ï¼å½æéè¦ç¨å®çæ¶åè¿ç»æã
3. `@Bean` æ³¨è§£æ¯ `Component` 注解çèªå®ä¹æ§æ´å¼ºï¼èä¸å¾å¤å°æ¹æä»¬åªè½éè¿ `@Bean` æ³¨è§£æ¥æ³¨åbeanãæ¯å¦å½æä»¬å¼ç¨ç¬¬ä¸æ¹åºä¸çç±»éè¦è£
é
å° `Spring`容卿¶ï¼ååªè½éè¿ `@Bean`æ¥å®ç°ã
`@Bean`注解使ç¨ç¤ºä¾ï¼
```java
@Configuration
public class AppConfig {
@Bean
public TransferService transferService() {
return new TransferServiceImpl();
}
}
```
ä¸é¢ç代ç ç¸å½äºä¸é¢ç xml é
ç½®
```xml
```
ä¸é¢è¿ä¸ªä¾åæ¯éè¿ `@Component` æ æ³å®ç°çã
```java
@Bean
public OneService getService(status) {
case (status) {
when 1:
return new serviceImpl1();
when 2:
return new serviceImpl2();
when 3:
return new serviceImpl3();
}
}
```
#### å°ä¸ä¸ªç±»å£°æä¸ºSpringç bean çæ³¨è§£æåªäº?
æä»¬ä¸è¬ä½¿ç¨ `@Autowired` 注解èªå¨è£
é
beanï¼è¦æ³æç±»æ è¯æå¯ç¨äº `@Autowired` 注解èªå¨è£
é
ç bean çç±»,éç¨ä»¥ä¸æ³¨è§£å¯å®ç°ï¼
- `@Component` ï¼éç¨ç注解ï¼å¯æ 注任æç±»ä¸º `Spring` ç»ä»¶ã妿ä¸ä¸ªBeanä¸ç¥éå±äºåªä¸ªå±ï¼å¯ä»¥ä½¿ç¨`@Component` æ³¨è§£æ æ³¨ã
- `@Repository` : å¯¹åºæä¹
å±å³ Dao å±ï¼ä¸»è¦ç¨äºæ°æ®åºç¸å
³æä½ã
- `@Service` : å¯¹åºæå¡å±ï¼ä¸»è¦æ¶åä¸äºå¤æçé»è¾ï¼éè¦ç¨å° Daoå±ã
- `@Controller` : å¯¹åº Spring MVC æ§å¶å±ï¼ä¸»è¦ç¨æ·æ¥åç¨æ·è¯·æ±å¹¶è°ç¨ Service å±è¿åæ°æ®ç»å端页é¢ã
#### Spring ä¸ç bean çå½å¨æ?
è¿é¨åç½ä¸æå¾å¤æç« é½è®²å°äºï¼ä¸é¢çå
容æ´çèªï¼ ï¼é¤äºè¿ç¯æç« ï¼åæ¨èä¸ç¯å¾ä¸éçæç« ï¼ ã
- Bean 容卿¾å°é
ç½®æä»¶ä¸ Spring Bean çå®ä¹ã
- Bean 容å¨å©ç¨ Java Reflection API å建ä¸ä¸ªBeançå®ä¾ã
- 妿æ¶åå°ä¸äºå±æ§å¼ å©ç¨ `set()`æ¹æ³è®¾ç½®ä¸äºå±æ§å¼ã
- 妿 Bean å®ç°äº `BeanNameAware` æ¥å£ï¼è°ç¨ `setBeanName()`æ¹æ³ï¼ä¼ å
¥Beançååã
- 妿 Bean å®ç°äº `BeanClassLoaderAware` æ¥å£ï¼è°ç¨ `setBeanClassLoader()`æ¹æ³ï¼ä¼ å
¥ `ClassLoader`对象çå®ä¾ã
- ä¸ä¸é¢ç类似ï¼å¦æå®ç°äºå
¶ä» `*.Aware`æ¥å£ï¼å°±è°ç¨ç¸åºçæ¹æ³ã
- 妿æåå è½½è¿ä¸ª Bean ç Spring 容å¨ç¸å
³ç `BeanPostProcessor` å¯¹è±¡ï¼æ§è¡`postProcessBeforeInitialization()` æ¹æ³
- 妿Beanå®ç°äº`InitializingBean`æ¥å£ï¼æ§è¡`afterPropertiesSet()`æ¹æ³ã
- 妿 Bean å¨é
ç½®æä»¶ä¸çå®ä¹å
å« init-method 屿§ï¼æ§è¡æå®çæ¹æ³ã
- 妿æåå è½½è¿ä¸ª Beanç Spring 容å¨ç¸å
³ç `BeanPostProcessor` å¯¹è±¡ï¼æ§è¡`postProcessAfterInitialization()` æ¹æ³
- å½è¦éæ¯ Bean çæ¶åï¼å¦æ Bean å®ç°äº `DisposableBean` æ¥å£ï¼æ§è¡ `destroy()` æ¹æ³ã
- å½è¦éæ¯ Bean çæ¶åï¼å¦æ Bean å¨é
ç½®æä»¶ä¸çå®ä¹å
å« destroy-method 屿§ï¼æ§è¡æå®çæ¹æ³ã
å¾ç¤ºï¼

ä¸ä¹æ¯è¾ç±»ä¼¼çä¸æçæ¬:

### 5.1.6 Spring MVC
#### 说说èªå·±å¯¹äº Spring MVC äºè§£?
è°å°è¿ä¸ªé®é¢ï¼æä»¬ä¸å¾ä¸ææä¹å Model1 å Model2 è¿ä¸¤ä¸ªæ²¡æ Spring MVC çæ¶ä»£ã
- **Model1 æ¶ä»£** : å¾å¤å¦ Java å端æ¯è¾æçæåå¯è½å¹¶æ²¡ææ¥è§¦è¿ Model1 模å¼ä¸ç JavaWeb åºç¨å¼åãå¨ Model1 模å¼ä¸ï¼æ´ä¸ª Web åºç¨å ä¹å
¨é¨ç¨ JSP 页é¢ç»æï¼åªç¨å°éç JavaBean æ¥å¤çæ°æ®åºè¿æ¥ã访é®çæä½ãè¿ä¸ªæ¨¡å¼ä¸ JSP 峿¯æ§å¶å±åæ¯è¡¨ç°å±ãæ¾èæè§ï¼è¿ç§æ¨¡å¼åå¨å¾å¤é®é¢ãæ¯å¦â å°æ§å¶é»è¾å表ç°é»è¾æ··æå¨ä¸èµ·ï¼å¯¼è´ä»£ç éç¨çæä½ï¼â¡å端åå端ç¸äºä¾èµï¼é¾ä»¥è¿è¡æµè¯å¹¶ä¸å¼åæçæä½ï¼
- **Model2 æ¶ä»£** ï¼å¦è¿ Servlet å¹¶åè¿ç¸å
³ Demo çæååºè¯¥äºè§£âJava Bean(Model)+ JSPï¼View,ï¼+Servletï¼Controllerï¼ âè¿ç§å¼å模å¼,è¿å°±æ¯æ©æç JavaWeb MVC å¼å模å¼ãModel:ç³»ç»æ¶åçæ°æ®ï¼ä¹å°±æ¯ dao å beanãViewï¼å±ç¤ºæ¨¡åä¸çæ°æ®ï¼åªæ¯ç¨æ¥å±ç¤ºãControllerï¼å¤çç¨æ·è¯·æ±é½åéç» ï¼è¿åæ°æ®ç» JSP å¹¶å±ç¤ºç»ç¨æ·ã
Model2 模å¼ä¸è¿åå¨å¾å¤é®é¢ï¼Model2çæ½è±¡åå°è£
ç¨åº¦è¿è¿è¿ä¸å¤ï¼ä½¿ç¨Model2è¿è¡å¼åæ¶ä¸å¯é¿å
å°ä¼éå¤é è½®åï¼è¿å°±å¤§å¤§éä½äºç¨åºçå¯ç»´æ¤æ§åå¤ç¨æ§ãäºæ¯å¾å¤JavaWebå¼åç¸å
³ç MVC æ¡æ¶åºè¿èçæ¯å¦Struts2ï¼ä½æ¯ Struts2 æ¯è¾ç¬¨éãéç Spring è½»é级å¼åæ¡æ¶çæµè¡ï¼Spring çæååºç°äº Spring MVC æ¡æ¶ï¼ Spring MVC æ¯å½åæä¼ç§ç MVC æ¡æ¶ãç¸æ¯äº Struts2 ï¼ Spring MVC ä½¿ç¨æ´å ç®ååæ¹ä¾¿ï¼å¼åæçæ´é«ï¼å¹¶ä¸ Spring MVC è¿è¡é度æ´å¿«ã
MVC æ¯ä¸ç§è®¾è®¡æ¨¡å¼,Spring MVC æ¯ä¸æ¬¾å¾ä¼ç§ç MVC æ¡æ¶ãSpring MVC å¯ä»¥å¸®å©æä»¬è¿è¡æ´ç®æ´çWebå±çå¼åï¼å¹¶ä¸å®å¤©çä¸ Spring æ¡æ¶éæãSpring MVC 䏿们ä¸è¬æå端项ç®å为 Serviceå±ï¼å¤çä¸å¡ï¼ãDaoå±ï¼æ°æ®åºæä½ï¼ãEntityå±ï¼å®ä½ç±»ï¼ãControllerå±(æ§å¶å±ï¼è¿åæ°æ®ç»åå°é¡µé¢)ã
**Spring MVC çç®ååçå¾å¦ä¸ï¼**

#### SpringMVC å·¥ä½åçäºè§£å?
**åçå¦ä¸å¾æç¤ºï¼**

ä¸å¾çä¸ä¸ªç¬è¯¯çå°é®é¢ï¼Spring MVC çå
¥å£å½æ°ä¹å°±æ¯å端æ§å¶å¨ `DispatcherServlet` çä½ç¨æ¯æ¥æ¶è¯·æ±ï¼ååºç»æã
**æµç¨è¯´æï¼éè¦ï¼ï¼**
1. 客æ·ç«¯ï¼æµè§å¨ï¼åé请æ±ï¼ç´æ¥è¯·æ±å° `DispatcherServlet`ã
2. `DispatcherServlet` æ ¹æ®è¯·æ±ä¿¡æ¯è°ç¨ `HandlerMapping`ï¼è§£æè¯·æ±å¯¹åºç `Handler`ã
3. è§£æå°å¯¹åºç `Handler`ï¼ä¹å°±æ¯æä»¬å¹³å¸¸è¯´ç `Controller` æ§å¶å¨ï¼åï¼å¼å§ç± `HandlerAdapter` éé
å¨å¤çã
4. `HandlerAdapter` 伿 ¹æ® `Handler `æ¥è°ç¨çæ£çå¤çå¨å¼å¤ç请æ±ï¼å¹¶å¤çç¸åºçä¸å¡é»è¾ã
5. å¤çå¨å¤çå®ä¸å¡åï¼ä¼è¿åä¸ä¸ª `ModelAndView` 对象ï¼`Model` æ¯è¿åçæ°æ®å¯¹è±¡ï¼`View` æ¯ä¸ªé»è¾ä¸ç `View`ã
6. `ViewResolver` 伿 ¹æ®é»è¾ `View` æ¥æ¾å®é
ç `View`ã
7. `DispaterServlet` æè¿åç `Model` ä¼ ç» `View`ï¼è§å¾æ¸²æï¼ã
8. æ `View` è¿åç»è¯·æ±è
ï¼æµè§å¨ï¼
### 5.1.7 Spring æ¡æ¶ä¸ç¨å°äºåªäºè®¾è®¡æ¨¡å¼ï¼
å
³äºä¸é¢ä¸äºè®¾è®¡æ¨¡å¼ç详ç»ä»ç»ï¼å¯ä»¥çç¬ä¸»å段æ¶é´çååæç« [ãé¢è¯å®:âè°è°Springä¸é½ç¨å°äºé£äºè®¾è®¡æ¨¡å¼?âãã](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485303&idx=1&sn=9e4626a1e3f001f9b0d84a6fa0cff04a&chksm=cea248bcf9d5c1aaf48b67cc52bac74eb29d6037848d6cf213b0e5466f2d1fda970db700ba41&token=255050878&lang=zh_CN#rd) ã
- **å·¥å设计模å¼** : Spring使ç¨å·¥å模å¼éè¿ `BeanFactory`ã`ApplicationContext` å建 bean 对象ã
- **代ç设计模å¼** : Spring AOP åè½çå®ç°ã
- **åä¾è®¾è®¡æ¨¡å¼** : Spring ä¸ç Bean é»è®¤é½æ¯åä¾çã
- **å
è£
å¨è®¾è®¡æ¨¡å¼** : æä»¬ç项ç®éè¦è¿æ¥å¤ä¸ªæ°æ®åºï¼èä¸ä¸åç客æ·å¨æ¯æ¬¡è®¿é®ä¸æ ¹æ®éè¦ä¼å»è®¿é®ä¸åçæ°æ®åºãè¿ç§æ¨¡å¼è®©æä»¬å¯ä»¥æ ¹æ®å®¢æ·çéæ±è½å¤å¨æåæ¢ä¸åçæ°æ®æºã
- **è§å¯è
模å¼:** Spring äºä»¶é©±å¨æ¨¡åå°±æ¯è§å¯è
模å¼å¾ç»å
¸çä¸ä¸ªåºç¨ã
- **éé
卿¨¡å¼** :Spring AOP çå¢å¼ºæéç¥(Advice)使ç¨å°äºéé
卿¨¡å¼ãspring MVC ä¸ä¹æ¯ç¨å°äºéé
卿¨¡å¼éé
`Controller`ã
- ......
### 5.1.8 Spring äºå¡
#### Spring 管çäºå¡çæ¹å¼æå ç§ï¼
1. ç¼ç¨å¼äºå¡ï¼å¨ä»£ç ä¸ç¡¬ç¼ç ã(䏿¨è使ç¨)
2. 声æå¼äºå¡ï¼å¨é
ç½®æä»¶ä¸é
ç½®ï¼æ¨è使ç¨ï¼
**声æå¼äºå¡åå为两ç§ï¼**
1. åºäºXMLç声æå¼äºå¡
2. åºäºæ³¨è§£ç声æå¼äºå¡
#### Spring äºå¡ä¸çéç¦»çº§å«æåªå ç§?
**TransactionDefinition æ¥å£ä¸å®ä¹äºäºä¸ªè¡¨ç¤ºé离级å«ç常éï¼**
- **TransactionDefinition.ISOLATION_DEFAULT:** 使ç¨åç«¯æ°æ®åºé»è®¤çé离级å«ï¼Mysql é»è®¤éç¨ç REPEATABLE_READéç¦»çº§å« Oracle é»è®¤éç¨ç READ_COMMITTEDé离级å«.
- **TransactionDefinition.ISOLATION_READ_UNCOMMITTED:** æä½çé离级å«ï¼å
许读åå°æªæäº¤çæ°æ®åæ´ï¼**å¯è½ä¼å¯¼è´è读ã幻读æä¸å¯éå¤è¯»**
- **TransactionDefinition.ISOLATION_READ_COMMITTED:** å
许读åå¹¶åäºå¡å·²ç»æäº¤çæ°æ®ï¼**å¯ä»¥é»æ¢è读ï¼ä½æ¯å¹»è¯»æä¸å¯éå¤è¯»ä»æå¯è½åç**
- **TransactionDefinition.ISOLATION_REPEATABLE_READ:** 对åä¸å段ç夿¬¡è¯»åç»æé½æ¯ä¸è´çï¼é¤éæ°æ®æ¯è¢«æ¬èº«äºå¡èªå·±æä¿®æ¹ï¼**å¯ä»¥é»æ¢è读åä¸å¯éå¤è¯»ï¼ä½å¹»è¯»ä»æå¯è½åçã**
- **TransactionDefinition.ISOLATION_SERIALIZABLE:** æé«çé离级å«ï¼å®å
¨æä»ACIDçé离级å«ãææçäºå¡ä¾æ¬¡é个æ§è¡ï¼è¿æ ·äºå¡ä¹é´å°±å®å
¨ä¸å¯è½äº§çå¹²æ°ï¼ä¹å°±æ¯è¯´ï¼**该级å«å¯ä»¥é²æ¢è读ãä¸å¯éå¤è¯»ä»¥å幻读**ã使¯è¿å°ä¸¥éå½±åç¨åºçæ§è½ãé常æ
åµä¸ä¹ä¸ä¼ç¨å°è¯¥çº§å«ã
#### Spring äºå¡ä¸åªå ç§äºå¡ä¼ æè¡ä¸º?
**æ¯æå½åäºå¡çæ
åµï¼**
- **TransactionDefinition.PROPAGATION_REQUIREDï¼** 妿å½ååå¨äºå¡ï¼åå å
¥è¯¥äºå¡ï¼å¦æå½å没æäºå¡ï¼åå建ä¸ä¸ªæ°çäºå¡ã
- **TransactionDefinition.PROPAGATION_SUPPORTSï¼** 妿å½ååå¨äºå¡ï¼åå å
¥è¯¥äºå¡ï¼å¦æå½å没æäºå¡ï¼å以éäºå¡çæ¹å¼ç»§ç»è¿è¡ã
- **TransactionDefinition.PROPAGATION_MANDATORYï¼** 妿å½ååå¨äºå¡ï¼åå å
¥è¯¥äºå¡ï¼å¦æå½å没æäºå¡ï¼åæåºå¼å¸¸ãï¼mandatoryï¼å¼ºå¶æ§ï¼
**䏿¯æå½åäºå¡çæ
åµï¼**
- **TransactionDefinition.PROPAGATION_REQUIRES_NEWï¼** å建ä¸ä¸ªæ°çäºå¡ï¼å¦æå½ååå¨äºå¡ï¼åæå½åäºå¡æèµ·ã
- **TransactionDefinition.PROPAGATION_NOT_SUPPORTEDï¼** 以éäºå¡æ¹å¼è¿è¡ï¼å¦æå½ååå¨äºå¡ï¼åæå½åäºå¡æèµ·ã
- **TransactionDefinition.PROPAGATION_NEVERï¼** 以éäºå¡æ¹å¼è¿è¡ï¼å¦æå½ååå¨äºå¡ï¼åæåºå¼å¸¸ã
**å
¶ä»æ
åµï¼**
- **TransactionDefinition.PROPAGATION_NESTEDï¼** 妿å½ååå¨äºå¡ï¼åå建ä¸ä¸ªäºå¡ä½ä¸ºå½åäºå¡çåµå¥äºå¡æ¥è¿è¡ï¼å¦æå½å没æäºå¡ï¼å该åå¼çä»·äºTransactionDefinition.PROPAGATION_REQUIREDã
#### @Transactional(rollbackFor = Exception.class)注解äºè§£åï¼
æä»¬ç¥éï¼Exceptionå为è¿è¡æ¶å¼å¸¸RuntimeExceptionåéè¿è¡æ¶å¼å¸¸ãäºå¡ç®¡ç对äºä¼ä¸åºç¨æ¥è¯´æ¯è³å
³éè¦çï¼å³ä½¿åºç°å¼å¸¸æ
åµï¼å®ä¹å¯ä»¥ä¿è¯æ°æ®çä¸è´æ§ã
å½`@Transactional`注解ä½ç¨äºç±»ä¸æ¶ï¼è¯¥ç±»çææ public æ¹æ³å°é½å
·æè¯¥ç±»åçäºå¡å±æ§ï¼åæ¶ï¼æä»¬ä¹å¯ä»¥å¨æ¹æ³çº§å«ä½¿ç¨è¯¥æ 注æ¥è¦ç类级å«çå®ä¹ãå¦æç±»æè
æ¹æ³å äºè¿ä¸ªæ³¨è§£ï¼é£ä¹è¿ä¸ªç±»éé¢çæ¹æ³æåºå¼å¸¸ï¼å°±ä¼åæ»ï¼æ°æ®åºéé¢çæ°æ®ä¹ä¼åæ»ã
å¨`@Transactional`注解ä¸å¦æä¸é
ç½®`rollbackFor`屿§,é£ä¹äºç©åªä¼å¨éå°`RuntimeException`çæ¶åæä¼åæ»,å ä¸`rollbackFor=Exception.class`,å¯ä»¥è®©äºç©å¨éå°éè¿è¡æ¶å¼å¸¸æ¶ä¹åæ»ã
å
³äº `@Transactional ` 注解æ¨èé
读çæç« ï¼
- [éå½»çææ¡ Spring ä¸@transactional ç使ç¨](https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html)
### 5.1.9 JPA
#### å¦ä½ä½¿ç¨JPA卿°æ®åºä¸éæä¹
åä¸ä¸ªå段ï¼
å妿们ææä¸é¢ä¸ä¸ªç±»ï¼
```java
Entity(name="USER")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
private Long id;
@Column(name="USER_NAME")
private String userName;
@Column(name="PASSWORD")
private String password;
private String secrect;
}
```
妿æä»¬æ³è®©`secrect` è¿ä¸ªå段ä¸è¢«æä¹
åï¼ä¹å°±æ¯ä¸è¢«æ°æ®åºå卿ä¹åï¼æä»¬å¯ä»¥éç¨ä¸é¢å ç§æ¹æ³ï¼
```java
static String transient1; // not persistent because of static
final String transient2 = âSatishâ; // not persistent because of final
transient String transient3; // not persistent because of transient
@Transient
String transient4; // not persistent because of @Transient
```
ä¸è¬ä½¿ç¨åé¢ä¸¤ç§æ¹å¼æ¯è¾å¤ï¼æä¸ªäººä½¿ç¨æ³¨è§£çæ¹å¼æ¯è¾å¤ã
### åè
- ãSpring ææ¯å
å¹ã
-
-
-
- https://www.cnblogs.com/clwydjgs/p/9317849.html
-
-
-
### å
¬ä¼å·
妿大家æ³è¦å®æ¶å
³æ³¨ææ´æ°çæç« 以åå享ç干货çè¯ï¼å¯ä»¥å
³æ³¨æçå
¬ä¼å·ã
**ãJavaé¢è¯çªå»ã:** ç±æ¬ææ¡£è¡ççä¸ä¸ºé¢è¯èççãJavaé¢è¯çªå»ãV2.0 PDF çæ¬[å
¬ä¼å·](#å
¬ä¼å·)åå°åå¤ **"Javaé¢è¯çªå»"** å³å¯å
è´¹é¢åï¼
**Javaå·¥ç¨å¸å¿
å¤å¦ä¹ èµæº:** ä¸äºJavaå·¥ç¨å¸å¸¸ç¨å¦ä¹ èµæºå
¬ä¼å·åå°åå¤å
³é®å **â1â** å³å¯å
è´¹æ å¥è·¯è·åã
------
## 5.2 MyBatisé¢è¯é¢æ»ç»
> æ¬ç¯æç« æ¯JavaGuideæ¶éèªç½ç»ï¼ååºå¤ä¸æã
Mybatis ææ¯å
å¹ç³»åå客ï¼ä»åçåæºç è§åº¦ï¼ä»ç»äºå
¶å
é¨å®ç°ç»èï¼æ 论æ¯åç好ä¸ä¸å¥½ï¼æç¡®å®æ¯ç¨å¿åäºï¼ç±äºå¹¶ä¸æ¯ä»ç»å¦ä½ä½¿ç¨ Mybatis çæç« ï¼æä»¥ï¼ä¸äºåæ°ä½¿ç¨ç»èç¥æäºï¼æä»¬çç®æ æ¯ä»ç» Mybatis çææ¯æ¶æåéè¦ç»æé¨åï¼ä»¥ååºæ¬è¿è¡åçã
å客åçå¾è¾è¦ï¼ä½æ¯ååºæ¥å´ä¸ä¸å®å¥½çï¼æè°å¼å§å¾å
´å¥ï¼è¿ç¨å¾çè¦ï¼ç»æå¾éæ¾ãè¦æ±ä¸é«ï¼åªè¦è¯»è
è½ä»ç³»åå客ä¸ï¼å¦ä¹ å°ä¸ç¹å
¶ä»åå®¢ææ²¡æçææ¯ç¹ï¼ä½ä¸ºä½è
ï¼æå°±å¾æ¬£æ
°äºï¼æä¹è¯»å«äººåçå客ï¼é常对èªå·±å½åç ç©¶çææ¯ï¼æ¯å¾æå¸®å©çã
å°½ç®¡è¿æå¾å¤å¯åçå
容ï¼ä½æ¯ï¼æè®¤ä¸ºååä¸å»å·²ç»æ²¡ææä¹ï¼ä»»ä½å
¶ä»å°çåè½ç¹ï¼é½æ¯å¨å·²ç»ä»ç»çåºæ¬æ¡æ¶ååºæ¬åçä¸è¿è¡çï¼åªæç»æï¼æè½ææ°çå¼å§ãåå客ä¹ç§¯æäºä¸äºç»éªï¼æºç å¤äºæè§å°±æ¯å¤å¶é»è´´ï¼æºç å°äºåè§å¾æ¯ç©ºè°åçï¼å°æ¥åååå®¢ï¼æå¸ææ¯âç²¾ç¼åæâï¼å¥½è¯»å¥½æç¾è§è¯»èµ·æ¥åä¸ç´¯ï¼å¸æèªå·±è½ååä¸é¨å¼æºåå¸å¼æ¡æ¶åçç³»åå客ã
æèå°±æ¥ï¼æåºå é Mybatis é¢è¯é¢ï¼çä½ è½åç䏿¥å éï¼é½æ¯æåºçï¼å¯ä¸æ¯ç½ä¸æ¾çï¼ã
### 5.2.1 #{}å\${}çåºå«æ¯ä»ä¹ï¼
注ï¼è¿é颿¯é¢è¯å®é¢è¯æåäºçã
çï¼
- `${}`æ¯ Properties æä»¶ä¸çåéå ä½ç¬¦ï¼å®å¯ä»¥ç¨äºæ ç¾å±æ§å¼å sql å
é¨ï¼å±äºéæææ¬æ¿æ¢ï¼æ¯å¦\${driver}ä¼è¢«éææ¿æ¢ä¸º`com.mysql.jdbc.Driver`ã
- `#{}`æ¯ sql çåæ°å ä½ç¬¦ï¼Mybatis ä¼å° sql ä¸ç`#{}`æ¿æ¢ä¸º?å·ï¼å¨ sql æ§è¡åä¼ä½¿ç¨ PreparedStatement çåæ°è®¾ç½®æ¹æ³ï¼æåºç» sql ç?å·å ä½ç¬¦è®¾ç½®åæ°å¼ï¼æ¯å¦ ps.setInt(0, parameterValue)ï¼`#{item.name}` çå弿¹å¼ä¸ºä½¿ç¨åå°ä»åæ°å¯¹è±¡ä¸è·å item 对象ç name 屿§å¼ï¼ç¸å½äº `param.getItem().getName()`ã
### 5.2.2 Xml æ å°æä»¶ä¸ï¼é¤äºå¸¸è§ç select|insert|updae|delete æ ç¾ä¹å¤ï¼è¿æåªäºæ ç¾ï¼
注ï¼è¿é颿¯äº¬ä¸é¢è¯å®é¢è¯ææ¶é®çã
çï¼è¿æå¾å¤å
¶ä»çæ ç¾ï¼``ã``ã``ã``ã``ï¼å ä¸å¨æ sql ç 9 个æ ç¾ï¼`trim|where|set|foreach|if|choose|when|otherwise|bind`çï¼å
¶ä¸ä¸º sql çæ®µæ ç¾ï¼éè¿``æ ç¾å¼å
¥ sql çæ®µï¼``ä¸ºä¸æ¯æèªå¢ç主é®çæçç¥æ ç¾ã
### 5.2.3 æä½³å®è·µä¸ï¼é常ä¸ä¸ª Xml æ å°æä»¶ï¼é½ä¼åä¸ä¸ª Dao æ¥å£ä¸ä¹å¯¹åºï¼è¯·é®ï¼è¿ä¸ª Dao æ¥å£çå·¥ä½åçæ¯ä»ä¹ï¼Dao æ¥å£éçæ¹æ³ï¼åæ°ä¸åæ¶ï¼æ¹æ³è½éè½½åï¼
注ï¼è¿éé¢ä¹æ¯äº¬ä¸é¢è¯å®é¢è¯ææ¶é®çã
çï¼Dao æ¥å£ï¼å°±æ¯äººä»¬å¸¸è¯´ç `Mapper`æ¥å£ï¼æ¥å£çå
¨éåï¼å°±æ¯æ å°æä»¶ä¸ç namespace çå¼ï¼æ¥å£çæ¹æ³åï¼å°±æ¯æ å°æä»¶ä¸`MappedStatement`ç id å¼ï¼æ¥å£æ¹æ³å
çåæ°ï¼å°±æ¯ä¼ éç» sql çåæ°ã`Mapper`æ¥å£æ¯æ²¡æå®ç°ç±»çï¼å½è°ç¨æ¥å£æ¹æ³æ¶ï¼æ¥å£å
¨éå+æ¹æ³åæ¼æ¥å符串ä½ä¸º key å¼ï¼å¯å¯ä¸å®ä½ä¸ä¸ª`MappedStatement`ï¼ä¸¾ä¾ï¼`com.mybatis3.mappers.StudentDao.findStudentById`ï¼å¯ä»¥å¯ä¸æ¾å° namespace 为`com.mybatis3.mappers.StudentDao`ä¸é¢`id = findStudentById`ç`MappedStatement`ãå¨ Mybatis ä¸ï¼æ¯ä¸ä¸ª`