---
title: Javaåºç¡å¸¸è§é¢è¯é¢æ»ç»
description: ç³»ç»æ¢³çJavaé¢è¯ä¸æå¸¸èçåºç¡ç¥è¯ä¸é«é¢é®é¢ï¼æ¶µçJVMãJDKãJREåºå«ï¼åèç ä¸ç¼è¯è§£éæ§è¡æºå¶ï¼AOTä¸JIT对æ¯åGraalVMï¼Oracle JDKä¸OpenJDKåºå«ï¼8ç§åºæ¬æ°æ®ç±»åä¸èªå¨è£
ç®±ãå
è£
ç±»åç¼åæºå¶ï¼æµ®ç¹æ°ç²¾åº¦ä¸BigDecimalï¼æååéåå±é¨åéãéæåé䏿¹æ³ï¼éè½½åéåï¼Stringä¸å¯åæ§ä¸å¸¸éæ± ï¼å¼å¸¸ä½ç³»ä¸try-with-resourcesï¼æ³åãåå°ãSPIãåºåååI/Oçæ ¸å¿èç¹ã
category: Java
tag:
- Javaåºç¡
head:
- - meta
- name: keywords
content: Javaåºç¡é¢è¯é¢,Javaç¹ç¹,JVM,JDK,JRE,åèç ,AOTç¼è¯,JITç¼è¯,GraalVM,Oracle JDK,OpenJDK,åºæ¬æ°æ®ç±»å,èªå¨è£
ç®±,å
è£
ç±»åç¼å,BigDecimal,éæåé,æ¹æ³éè½½,æ¹æ³éå,Stringä¸å¯å,叏鿱 ,å¼å¸¸å¤ç,æ³å,åå°,SPI,åºåå
---
è¿é¨åå
容æèª [JavaGuide](https://javaguide.cn/) ä¸é¢å ç¯æç« ä¸çéç¹ï¼
- [Java åºç¡å¸¸è§é¢è¯é¢æ»ç»(ä¸)](https://javaguide.cn/java/basis/java-basic-questions-01.html)ï¼Java è¯è¨çåºæ¬æ¦å¿µãè¯æ³ãæ°æ®ç±»åãåéãæ¹æ³çï¼
- [Java åºç¡å¸¸è§é¢è¯é¢æ»ç»(ä¸)](https://javaguide.cn/java/basis/java-basic-questions-02.html)ï¼é¢å对象åºç¡ãå符串ãå¯¹è±¡çæ¯è¾ä¸æ·è´çï¼
- [Java åºç¡å¸¸è§é¢è¯é¢æ»ç»ï¼ä¸ï¼](https://javaguide.cn/java/basis/java-basic-questions-03.html)ï¼å¼å¸¸ãæ³åãåå°ãSPIãåºååãæ³¨è§£çï¼
## åºç¡æ¦å¿µä¸å¸¸è¯
### âï¸JVM vs JDK vs JRE
#### JVM
Java èææºï¼Java Virtual Machine, JVMï¼æ¯è¿è¡ Java åèç çèææºãJVM æé对ä¸åç³»ç»çç¹å®å®ç°ï¼Windowsï¼Linuxï¼macOSï¼ï¼ç®çæ¯ä½¿ç¨ç¸åçåèç ï¼å®ä»¬é½ä¼ç»åºç¸åçç»æãåèç åä¸åç³»ç»ç JVM å®ç°æ¯ Java è¯è¨â䏿¬¡ç¼è¯ï¼éå¤å¯ä»¥è¿è¡âçå
³é®æå¨ã
å¦ä¸å¾æç¤ºï¼ä¸åç¼ç¨è¯è¨ï¼JavaãGroovyãKotlinãJRubyãClojure ...ï¼éè¿åèªçç¼è¯å¨ç¼è¯æ `.class` æä»¶ï¼å¹¶æç»éè¿ JVM å¨ä¸åå¹³å°ï¼WindowsãMacãLinuxï¼ä¸è¿è¡ã

**JVM 并䏿¯åªæä¸ç§ï¼åªè¦æ»¡è¶³ JVM è§èï¼æ¯ä¸ªå
¬å¸ãç»ç»æè
个人é½å¯ä»¥å¼åèªå·±çä¸å± JVMã** ä¹å°±æ¯è¯´æä»¬å¹³æ¶æ¥è§¦å°ç HotSpot VM ä»
ä»
æ¯æ¯ JVM è§èçä¸ç§å®ç°èå·²ã
é¤äºæä»¬å¹³æ¶æå¸¸ç¨ç HotSpot VM å¤ï¼è¿æ J9 VMãZing VMãJRockit VM ç JVM ãç»´åºç¾ç§ä¸å°±æå¸¸è§ JVM ç对æ¯ï¼[Comparison of Java virtual machines](https://en.wikipedia.org/wiki/Comparison_of_Java_virtual_machines) ï¼æå
´è¶£çå¯ä»¥å»ççãå¹¶ä¸ï¼ä½ å¯ä»¥å¨ [Java SE Specifications](https://docs.oracle.com/javase/specs/index.html) 䏿¾å°åä¸ªçæ¬ç JDK 对åºç JVM è§èã

#### JDK å JRE
JDKï¼Java Development Kitï¼æ¯ä¸ä¸ªåè½é½å
¨ç Java å¼åå·¥å
·å
ï¼ä¾å¼åè
使ç¨ï¼ç¨äºå建åç¼è¯ Java ç¨åºãå®å
å«äº JREï¼Java Runtime Environmentï¼ï¼ä»¥åç¼è¯å¨ javac åå
¶ä»å·¥å
·ï¼å¦ javadocï¼ææ¡£çæå¨ï¼ãjdbï¼è°è¯å¨ï¼ãjconsoleï¼çæ§å·¥å
·ï¼ãjavapï¼åç¼è¯å·¥å
·ï¼çã
JRE æ¯è¿è¡å·²ç¼è¯ Java ç¨åºæéçç¯å¢ï¼ä¸»è¦å
å«ä»¥ä¸ä¸¤ä¸ªé¨åï¼
1. **JVM** : ä¹å°±æ¯æä»¬ä¸é¢æå°ç Java èææºã
2. **Java åºç¡ç±»åºï¼Class Libraryï¼**ï¼ä¸ç»æ åçç±»åºï¼æä¾å¸¸ç¨çåè½å APIï¼å¦ I/O æä½ãç½ç»éä¿¡ãæ°æ®ç»æçï¼ã
ç®åæ¥è¯´ï¼JRE åªå
å«è¿è¡ Java ç¨åºæéçç¯å¢åç±»åºï¼è JDK ä¸ä»
å
å« JREï¼è¿å
æ¬ç¨äºå¼ååè°è¯ Java ç¨åºçå·¥å
·ã
妿éè¦ç¼åãç¼è¯ Java ç¨åºæä½¿ç¨ Java API ææ¡£ï¼å°±éè¦å®è£
JDKãæäºéè¦ Java ç¹æ§çåºç¨ç¨åºï¼å¦ JSP 转æ¢ä¸º Servlet æä½¿ç¨åå°ï¼ä¹å¯è½éè¦ JDK æ¥ç¼è¯åè¿è¡ Java 代ç ãå æ¤ï¼å³ä½¿ä¸è¿è¡ Java å¼åå·¥ä½ï¼ææ¶ä¹å¯è½éè¦å®è£
JDKã
ä¸å¾æ¸
æ°å±ç¤ºäº JDKãJRE å JVM çå
³ç³»ã

ä¸è¿ï¼ä» JDK 9 å¼å§ï¼å°±ä¸éè¦åºå JDK å JRE çå
³ç³»äºï¼åè代ä¹çæ¯æ¨¡åç³»ç»ï¼JDK è¢«éæ°ç»ç»æ 94 个模åï¼+ [jlink](http://openjdk.java.net/jeps/282) å·¥å
· (é Java 9 ä¸èµ·åå¸çæ°å½ä»¤è¡å·¥å
·ï¼ç¨äºçæèªå®ä¹ Java è¿è¡æ¶æ åï¼è¯¥æ åä»
å
å«ç»å®åºç¨ç¨åºæéçæ¨¡å) ãå¹¶ä¸ï¼ä» JDK 11 å¼å§ï¼Oracle ä¸åæä¾åç¬ç JRE ä¸è½½ã
å¨ [Java 9 æ°ç¹æ§æ¦è§](https://javaguide.cn/java/new-features/java9.html)è¿ç¯æç« ä¸ï¼æå¨ä»ç»æ¨¡ååç³»ç»çæ¶åæå°ï¼
> å¨å¼å
¥äºæ¨¡åç³»ç»ä¹åï¼JDK è¢«éæ°ç»ç»æ 94 个模åãJava åºç¨å¯ä»¥éè¿æ°å¢ç jlink å·¥å
·ï¼å建åºåªå
嫿ä¾èµç JDK 模åçèªå®ä¹è¿è¡æ¶éåãè¿æ ·å¯ä»¥æå¤§çåå° Java è¿è¡æ¶ç¯å¢ç大å°ã
ä¹å°±æ¯è¯´ï¼å¯ä»¥ç¨ jlink æ ¹æ®èªå·±çéæ±ï¼å建ä¸ä¸ªæ´å°ç runtimeï¼è¿è¡æ¶ï¼ï¼è䏿¯ä¸ç®¡ä»ä¹åºç¨ï¼é½æ¯åæ ·ç JREã
å®å¶çãæ¨¡ååç Java è¿è¡æ¶æ åæå©äºç®å Java åºç¨çé¨ç½²åèçå
åå¹¶å¢å¼ºå®å
¨æ§åå¯ç»´æ¤æ§ãè¿å¯¹äºæ»¡è¶³ç°ä»£åºç¨ç¨åºæ¶æçéæ±ï¼å¦èæåã容å¨åãå¾®æå¡åäºåçå¼åï¼æ¯é常éè¦çã
### âï¸ä»ä¹æ¯åèç ?éç¨åèç ç好夿¯ä»ä¹?
å¨ Java ä¸ï¼JVM å¯ä»¥çè§£ç代ç å°±å«ååèç ï¼å³æ©å±å为 `.class` çæä»¶ï¼ï¼å®ä¸é¢åä»»ä½ç¹å®çå¤çå¨ï¼åªé¢åèææºãJava è¯è¨éè¿åèç çæ¹å¼ï¼å¨ä¸å®ç¨åº¦ä¸è§£å³äºä¼ ç»è§£éåè¯è¨æ§è¡æçä½çé®é¢ï¼åæ¶åä¿çäºè§£éåè¯è¨å¯ç§»æ¤çç¹ç¹ãæä»¥ï¼ Java ç¨åºè¿è¡æ¶ç¸å¯¹æ¥è¯´è¿æ¯é«æçï¼ä¸è¿ï¼å Cã C++ï¼Rustï¼Go çè¯è¨è¿æ¯æä¸å®å·®è·çï¼ï¼èä¸ï¼ç±äºåèç å¹¶ä¸é对ä¸ç§ç¹å®çæºå¨ï¼å æ¤ï¼Java ç¨åºæ 须鿰ç¼è¯ä¾¿å¯å¨å¤ç§ä¸åæä½ç³»ç»çè®¡ç®æºä¸è¿è¡ã
**Java ç¨åºä»æºä»£ç å°è¿è¡çè¿ç¨å¦ä¸å¾æç¤º**ï¼

æä»¬éè¦æ ¼å¤æ³¨æçæ¯ `.class->æºå¨ç ` è¿ä¸æ¥ãå¨è¿ä¸æ¥ JVM ç±»å è½½å¨é¦å
å è½½åèç æä»¶ï¼ç¶åéè¿è§£éå¨éè¡è§£éæ§è¡ï¼è¿ç§æ¹å¼çæ§è¡é度ä¼ç¸å¯¹æ¯è¾æ
¢ãèä¸ï¼æäºæ¹æ³å代ç 忝ç»å¸¸éè¦è¢«è°ç¨ç(ä¹å°±æ¯æè°ççç¹ä»£ç )ï¼æä»¥åé¢å¼è¿äº **JITï¼Just in Time Compilationï¼** ç¼è¯å¨ï¼è JIT å±äºè¿è¡æ¶ç¼è¯ãå½ JIT ç¼è¯å¨å®æç¬¬ä¸æ¬¡ç¼è¯åï¼å
¶ä¼å°åèç 对åºçæºå¨ç ä¿å䏿¥ï¼ä¸æ¬¡å¯ä»¥ç´æ¥ä½¿ç¨ãèæä»¬ç¥éï¼æºå¨ç çè¿è¡æçè¯å®æ¯é«äº Java è§£éå¨çãè¿ä¹è§£éäºæä»¬ä¸ºä»ä¹ç»å¸¸ä¼è¯´ **Java æ¯ç¼è¯ä¸è§£éå
±åçè¯è¨** ã
> ð æå±é
读ï¼
>
> - [åºæ¬å | Java 峿¶ç¼è¯å¨åçè§£æåå®è·µ - ç¾å¢ææ¯å¢é](https://tech.meituan.com/2020/10/22/java-jit-practice-in-meituan.html)
> - [åºäºéæç¼è¯æå»ºå¾®æå¡åºç¨ - é¿éå·´å·´ä¸é´ä»¶](https://mp.weixin.qq.com/s/4haTyXUmh8m-dBQaEzwDJw)

> HotSpot éç¨äºæ°æ§è¯ä¼°(Lazy Evaluation)çåæ³ï¼æ ¹æ®äºå
«å®å¾ï¼æ¶è大é¨åç³»ç»èµæºçåªæé£ä¸å°é¨åç代ç ï¼çç¹ä»£ç ï¼ï¼èè¿ä¹å°±æ¯ JIT æéè¦ç¼è¯çé¨åãJVM 伿 ¹æ®ä»£ç æ¯æ¬¡è¢«æ§è¡çæ
嵿¶éä¿¡æ¯å¹¶ç¸åºå°ååºä¸äºä¼åï¼å æ¤æ§è¡ç次æ°è¶å¤ï¼å®çé度就è¶å¿«ã
JDKãJREãJVMãJIT è¿åè
çå
³ç³»å¦ä¸å¾æç¤ºã

ä¸é¢è¿å¼ 徿¯ JVM ç大è´ç»ææ¨¡åã

### âï¸ä¸ºä»ä¹è¯´ Java è¯è¨âç¼è¯ä¸è§£éå¹¶åâï¼
å
¶å®è¿ä¸ªé®é¢æä»¬è®²åèç çæ¶åå·²ç»æå°è¿ï¼å 为æ¯è¾éè¦ï¼æä»¥æä»¬è¿éåæä¸ä¸ã
æä»¬å¯ä»¥å°é«çº§ç¼ç¨è¯è¨æç
§ç¨åºçæ§è¡æ¹å¼å为两ç§ï¼
- **ç¼è¯å**ï¼[ç¼è¯åè¯è¨](https://zh.wikipedia.org/wiki/%E7%B7%A8%E8%AD%AF%E8%AA%9E%E8%A8%80) ä¼éè¿[ç¼è¯å¨](https://zh.wikipedia.org/wiki/%E7%B7%A8%E8%AD%AF%E5%99%A8)å°æºä»£ç 䏿¬¡æ§ç¿»è¯æå¯è¢«è¯¥å¹³å°æ§è¡çæºå¨ç ãä¸è¬æ
åµä¸ï¼ç¼è¯è¯è¨çæ§è¡é度æ¯è¾å¿«ï¼å¼åæçæ¯è¾ä½ã常è§çç¼è¯æ§è¯è¨æ CãC++ãGoãRust ççã
- **è§£éå**ï¼[è§£éåè¯è¨](https://zh.wikipedia.org/wiki/%E7%9B%B4%E8%AD%AF%E8%AA%9E%E8%A8%80)ä¼éè¿[è§£éå¨](https://zh.wikipedia.org/wiki/ç´è¯å¨)ä¸å¥ä¸å¥çå°ä»£ç è§£éï¼interpretï¼ä¸ºæºå¨ä»£ç ååæ§è¡ãè§£éåè¯è¨å¼åæçæ¯è¾å¿«ï¼æ§è¡é度æ¯è¾æ
¢ã常è§çè§£éæ§è¯è¨æ PythonãJavaScriptãPHP ççã

æ ¹æ®ç»´åºç¾ç§ä»ç»ï¼
> ä¸ºäºæ¹åè§£éè¯è¨çæçèåå±åºç[峿¶ç¼è¯](https://zh.wikipedia.org/wiki/å³æç·¨è¯)ææ¯ï¼å·²ç»ç¼©å°äºè¿ä¸¤ç§è¯è¨é´çå·®è·ãè¿ç§ææ¯æ··åäºç¼è¯è¯è¨ä¸è§£éåè¯è¨çä¼ç¹ï¼å®åç¼è¯è¯è¨ä¸æ ·ï¼å
æç¨åºæºä»£ç ç¼è¯æ[åèç ](https://zh.wikipedia.org/wiki/åèç )ãå°æ§è¡ææ¶ï¼åå°åèç ç´è¯ï¼ä¹åæ§è¡ã[Java](https://zh.wikipedia.org/wiki/Java)ä¸[LLVM](https://zh.wikipedia.org/wiki/LLVM)æ¯è¿ç§ææ¯ç代表产ç©ã
>
> ç¸å
³é
读ï¼[åºæ¬å | Java 峿¶ç¼è¯å¨åçè§£æåå®è·µ](https://tech.meituan.com/2020/10/22/java-jit-practice-in-meituan.html)
**为ä»ä¹è¯´ Java è¯è¨âç¼è¯ä¸è§£éå¹¶åâï¼**
è¿æ¯å 为 Java è¯è¨æ¢å
·æç¼è¯åè¯è¨çç¹å¾ï¼ä¹å
·æè§£éåè¯è¨çç¹å¾ãå 为 Java ç¨åºè¦ç»è¿å
ç¼è¯ï¼åè§£é两个æ¥éª¤ï¼ç± Java ç¼åçç¨åºéè¦å
ç»è¿ç¼è¯æ¥éª¤ï¼çæåèç ï¼`.class` æä»¶ï¼ï¼è¿ç§åèç å¿
é¡»ç± Java è§£é卿¥è§£éæ§è¡ã
### AOT æä»ä¹ä¼ç¹ï¼ä¸ºä»ä¹ä¸å
¨é¨ä½¿ç¨ AOT å¢ï¼
JDK 9 å¼å
¥äºä¸ç§æ°çç¼è¯æ¨¡å¼ **AOT(Ahead of Time Compilation)** ãå JIT ä¸åçæ¯ï¼è¿ç§ç¼è¯æ¨¡å¼ä¼å¨ç¨åºè¢«æ§è¡åå°±å°å
¶ç¼è¯ææºå¨ç ï¼å±äºéæç¼è¯ï¼Cã C++ï¼Rustï¼Go çè¯è¨å°±æ¯éæç¼è¯ï¼ãAOT é¿å
äº JIT é¢ççåæ¹é¢çå¼éï¼å¯ä»¥æé« Java ç¨åºçå¯å¨é度ï¼é¿å
é¢çæ¶é´é¿ãå¹¶ä¸ï¼AOT è¿è½åå°å
åå ç¨åå¢å¼º Java ç¨åºçå®å
¨æ§ï¼AOT ç¼è¯åç代ç ä¸å®¹æè¢«åç¼è¯åä¿®æ¹ï¼ï¼ç¹å«éåäºåçåºæ¯ã
**JIT ä¸ AOT 两è
çå
³é®ææ 对æ¯**:
å¯ä»¥çåºï¼AOT ç主è¦ä¼å¿å¨äºå¯å¨æ¶é´ãå
åå ç¨åæå
ä½ç§¯ãJIT ç主è¦ä¼å¿å¨äºå
·å¤æ´é«çæéå¤çè½åï¼å¯ä»¥éä½è¯·æ±çæå¤§å»¶è¿ã
æå° AOT å°±ä¸å¾ä¸æ [GraalVM](https://www.graalvm.org/) äºï¼GraalVM æ¯ä¸ç§é«æ§è½ç JDKï¼å®æ´ç JDK åè¡çæ¬ï¼ï¼å®å¯ä»¥è¿è¡ Java åå
¶ä» JVM è¯è¨ï¼ä»¥å JavaScriptãPython çé JVM è¯è¨ã GraalVM ä¸ä»
è½æä¾ AOT ç¼è¯ï¼è¿è½æä¾ JIT ç¼è¯ãæå
´è¶£çåå¦ï¼å¯ä»¥å»çç GraalVM ç宿¹ææ¡£ï¼ã妿è§å¾å®æ¹ææ¡£ççæ¯è¾é¾çè§£çè¯ï¼ä¹å¯ä»¥æ¾ä¸äºæç« æ¥ççï¼æ¯å¦ï¼
- [åºäºéæç¼è¯æå»ºå¾®æå¡åºç¨](https://mp.weixin.qq.com/s/4haTyXUmh8m-dBQaEzwDJw)
- [èµ°å Native åï¼Spring&Dubbo AOT ææ¯ç¤ºä¾ä¸åç讲解](https://cn.dubbo.apache.org/zh-cn/blog/2023/06/28/%e8%b5%b0%e5%90%91-native-%e5%8c%96springdubbo-aot-%e6%8a%80%e6%9c%af%e7%a4%ba%e4%be%8b%e4%b8%8e%e5%8e%9f%e7%90%86%e8%ae%b2%e8%a7%a3/)
**æ¢ç¶ AOT è¿ä¹å¤ä¼ç¹ï¼é£ä¸ºä»ä¹ä¸å
¨é¨ä½¿ç¨è¿ç§ç¼è¯æ¹å¼å¢ï¼**
æä»¬åé¢ä¹å¯¹æ¯è¿ JIT ä¸ AOTï¼ä¸¤è
åæä¼ç¹ï¼åªè½è¯´ AOT æ´éåå½ä¸çäºåçåºæ¯ï¼å¯¹å¾®æå¡æ¶æçæ¯æä¹æ¯è¾å好ã餿¤ä¹å¤ï¼AOT ç¼è¯æ æ³æ¯æ Java çä¸äºå¨æç¹æ§ï¼å¦åå°ã卿代çã卿å è½½ãJNIï¼Java Native Interfaceï¼çãç¶èï¼å¾å¤æ¡æ¶ååºï¼å¦ SpringãCGLIBï¼é½ç¨å°äºè¿äºç¹æ§ã妿åªä½¿ç¨ AOT ç¼è¯ï¼é£å°±æ²¡åæ³ä½¿ç¨è¿äºæ¡æ¶ååºäºï¼æè
说éè¦é对æ§å°å»åéé
åä¼åã举个ä¾åï¼CGLIB 卿代ç使ç¨çæ¯ ASM ææ¯ï¼èè¿ç§ææ¯å¤§è´åçæ¯è¿è¡æ¶ç´æ¥å¨å
åä¸çæå¹¶å 载修æ¹åçåèç æä»¶ä¹å°±æ¯ `.class` æä»¶ï¼å¦æå
¨é¨ä½¿ç¨ AOT æåç¼è¯ï¼ä¹å°±ä¸è½ä½¿ç¨ ASM ææ¯äºãä¸ºäºæ¯æç±»ä¼¼çå¨æç¹æ§ï¼æä»¥éæ©ä½¿ç¨ JIT 峿¶ç¼è¯å¨ã
### Oracle JDK vs OpenJDK
å¯è½å¨çè¿ä¸ªé®é¢ä¹åå¾å¤äººåæä¸æ ·å¹¶æ²¡ææ¥è§¦å使ç¨è¿ OpenJDK ãé£ä¹ Oracle JDK å OpenJDK ä¹é´æ¯å¦åå¨é大差å¼ï¼ä¸é¢æéè¿æ¶éå°çä¸äºèµæï¼ä¸ºä½ è§£çè¿ä¸ªè¢«å¾å¤äººå¿½è§çé®é¢ã
é¦å
ï¼2006 å¹´ SUN å
¬å¸å° Java 弿ºï¼ä¹å°±æäº OpenJDKã2009 å¹´ Oracle æ¶è´äº Sun å
¬å¸ï¼äºæ¯èªå·±å¨ OpenJDK çåºç¡ä¸æäºä¸ä¸ª Oracle JDKãOracle JDK æ¯ä¸å¼æºçï¼å¹¶ä¸åå¼å§çå ä¸ªçæ¬ï¼Java8 ~ Java11ï¼è¿ä¼ç¸æ¯äº OpenJDK æ·»å ä¸äºç¹æçåè½åå·¥å
·ã
å
¶æ¬¡ï¼å¯¹äº Java 7 èè¨ï¼OpenJDK å Oracle JDK æ¯å忥è¿çã Oracle JDK æ¯åºäº OpenJDK 7 æå»ºçï¼åªæ·»å äºä¸äºå°åè½ï¼ç± Oracle å·¥ç¨å¸åä¸ç»´æ¤ã
ä¸é¢è¿æ®µè¯æèª Oracle 宿¹å¨ 2012 å¹´å表çä¸ä¸ªå客ï¼
> é®ï¼OpenJDK åå¨åºä¸çæºä»£ç ä¸ç¨äºæå»º Oracle JDK ç代ç ä¹é´æä»ä¹åºå«ï¼
>
> çï¼é常æ¥è¿ - æä»¬ç Oracle JDK çæ¬æå»ºè¿ç¨åºäº OpenJDK 7 æå»ºï¼åªæ·»å äºå 个é¨åï¼ä¾å¦é¨ç½²ä»£ç ï¼å
¶ä¸å
æ¬ Oracle ç Java æä»¶å Java WebStart çå®ç°ï¼ä»¥åä¸äºéæºçç¬¬ä¸æ¹ç»ä»¶ï¼å¦å¾å½¢å
æ
åå¨ï¼ä¸äºå¼æºçç¬¬ä¸æ¹ç»ä»¶ï¼å¦ Rhinoï¼ä»¥åä¸äºé¶ç¢çä¸è¥¿ï¼å¦éå ææ¡£æç¬¬ä¸æ¹åä½ãå±ææªæ¥ï¼æä»¬çç®çæ¯å¼æº Oracle JDK çææé¨åï¼é¤äºæä»¬èèåä¸åè½çé¨åã
æåï¼ç®åæ»ç»ä¸ä¸ Oracle JDK å OpenJDK çåºå«ï¼
1. **æ¯å¦å¼æº**ï¼OpenJDK æ¯ä¸ä¸ªåèæ¨¡å并䏿¯å®å
¨å¼æºçï¼è Oracle JDK æ¯åºäº OpenJDK å®ç°çï¼å¹¶ä¸æ¯å®å
¨å¼æºçï¼ä¸ªäººè§ç¹ï¼ä¼æå¨ç¥ï¼JDK åæ¥æ¯ SUN å
¬å¸å¼åçï¼åæ¥ SUN å
¬å¸ååç»äº Oracle å
¬å¸ï¼Oracle å
¬å¸ä»¥ Oracle æ°æ®åºèèåï¼è Oracle æ°æ®åºåæ¯éæºçï¼è¿ä¸ªæ¶å Oracle å
¬å¸å°±ä¸æ³å®å
¨å¼æºäºï¼ä½æ¯åæ¥ç SUN å
¬å¸åæ JDK ç»å¼æºäºï¼å¦æè¿ä¸ªæ¶å Oracle æ¶è´åæ¥ä¹åå°±æä»ç»éæºï¼å¿
ç¶ä¼å¼èµ·å¾å¤ Java å¼åè
ç䏿»¡ï¼å¯¼è´å¤§å®¶å¯¹ Java 失å»ä¿¡å¿ï¼é£ Oracle å
¬å¸æ¶è´åæ¥ä¸å°±æ Java ç卿éäºåï¼ç¶åï¼Oracle å
¬å¸å°±æ³äºä¸ªéªæä½ï¼è¿æ ·å§ï¼ææä¸é¨åæ ¸å¿ä»£ç 弿ºåºæ¥ç»ä½ 们ç©ï¼å¹¶ä¸æè¦åä½ ä»¬èªå·±æç JDK åºåä¸ï¼ä½ ä»¬å« OpenJDKï¼æå« Oracle JDKï¼æå叿çï¼ä½ 们继ç»ç©ä½ 们çï¼è¦æ¯ä½ 们æåºæ¥ä»ä¹å¥½ç©çä¸è¥¿ï¼æåç»åå¸ Oracle JDK ä¹ä¼æ¿æ¥ç¨ä¸ä¸ï¼ä¸ä¸¾ä¸¤å¾ï¼ï¼OpenJDK 弿ºé¡¹ç®ï¼[https://github.com/openjdk/jdk](https://github.com/openjdk/jdk) ã
2. **æ¯å¦å
è´¹**ï¼Oracle JDK 伿ä¾å
è´¹çæ¬ï¼ä½ä¸è¬ææ¶é´éå¶ãJDK17 ä¹åççæ¬å¯ä»¥å
è´¹ååååç¨ï¼ä½æ¯ä»
æ 3 å¹´æ¶é´ï¼3 å¹´åæ æ³å
è´¹åç¨ãä¸è¿ï¼JDK8u221 ä¹ååªè¦ä¸å级å¯ä»¥æ éæå
è´¹ãOpenJDK æ¯å®å
¨å
è´¹çã
3. **åè½æ§**ï¼Oracle JDK å¨ OpenJDK çåºç¡ä¸æ·»å äºä¸äºç¹æçåè½åå·¥å
·ï¼æ¯å¦ Java Flight Recorderï¼JFRï¼ä¸ç§çæ§å·¥å
·ï¼ãJava Mission Controlï¼JMCï¼ä¸ç§çæ§å·¥å
·ï¼çå·¥å
·ãä¸è¿ï¼å¨ Java 11 ä¹åï¼OracleJDK å OpenJDK çåè½åºæ¬ä¸è´ï¼ä¹å OracleJDK ä¸çç§æç»ä»¶å¤§å¤æ°ä¹å·²ç»è¢«æèµ ç»å¼æºç»ç»ã
4. **ç¨³å®æ§**ï¼OpenJDK ä¸æä¾ LTS æå¡ï¼è OracleJDK å¤§æ¦æ¯ä¸å¹´é½ä¼æ¨åºä¸ä¸ª LTS çè¿è¡é¿ææ¯æãä¸è¿ï¼å¾å¤å
¬å¸é½åºäº OpenJDK æä¾äºå¯¹åºçå OracleJDK 卿ç¸åç LTS çãå æ¤ï¼ä¸¤è
ç¨³å®æ§å
¶å®ä¹æ¯å·®ä¸å¤çã
5. **åè®®**ï¼Oracle JDK ä½¿ç¨ BCL/OTN åè®®è·å¾è®¸å¯ï¼è OpenJDK æ ¹æ® GPL v2 许å¯è·å¾è®¸å¯ã
> æ¢ç¶ Oracle JDK è¿ä¹å¥½ï¼é£ä¸ºä»ä¹è¿è¦æ OpenJDKï¼
>
> çï¼
>
> 1. OpenJDK æ¯å¼æºçï¼å¼æºæå³çä½ å¯ä»¥å¯¹å®æ ¹æ®ä½ èªå·±çéè¦è¿è¡ä¿®æ¹ãä¼åï¼æ¯å¦ Alibaba åºäº OpenJDK å¼åäº Dragonwell8ï¼[https://github.com/alibaba/dragonwell8](https://github.com/alibaba/dragonwell8)
> 2. OpenJDK æ¯åä¸å
è´¹çï¼è¿ä¹æ¯ä¸ºä»ä¹éè¿ yum å
管çå¨ä¸é»è®¤å®è£
ç JDK æ¯ OpenJDK è䏿¯ Oracle JDKï¼ãè½ç¶ Oracle JDK 乿¯åä¸å
è´¹ï¼æ¯å¦ JDK 8ï¼ï¼ä½å¹¶ä¸æ¯ææçæ¬é½æ¯å
è´¹çã
> 3. OpenJDK æ´æ°é¢çæ´å¿«ãOracle JDK ä¸è¬æ¯æ¯ 6 个æåå¸ä¸ä¸ªæ°çæ¬ï¼è OpenJDK ä¸è¬æ¯æ¯ 3 个æåå¸ä¸ä¸ªæ°çæ¬ãï¼ç°å¨ä½ ç¥éä¸ºå¥ Oracle JDK æ´ç¨³å®äºå§ï¼å
å¨ OpenJDK è¯è¯æ°´ï¼æå¤§é¨åé®é¢é½è§£å³æäºæå¨ Oracle JDK ä¸åå¸ï¼
>
> åºäºä»¥ä¸è¿äºåå ï¼OpenJDK è¿æ¯æåå¨çå¿
è¦çï¼

**Oracle JDK å OpenJDK å¦ä½éæ©ï¼**
å»ºè®®éæ© OpenJDK æè
åºäº OpenJDK çåè¡çï¼æ¯å¦ AWS ç Amazon Correttoï¼é¿éå·´å·´ç Alibaba Dragonwellã
ð æå±ä¸ä¸ï¼
- BCL åè®®ï¼Oracle Binary Code License Agreementï¼ï¼å¯ä»¥ä½¿ç¨ JDKï¼æ¯æåç¨ï¼ï¼ä½æ¯ä¸è½è¿è¡ä¿®æ¹ã
- OTN åè®®ï¼Oracle Technology Network License Agreementï¼ï¼11 åä¹åæ°åå¸ç JDK ç¨ç齿¯è¿ä¸ªåè®®ï¼å¯ä»¥èªå·±ç§ä¸ç¨ï¼ä½æ¯åç¨éè¦ä»è´¹ã
## åºæ¬è¯æ³
### âï¸èªå¢èªåè¿ç®ç¬¦
å¨å代ç çè¿ç¨ä¸ï¼å¸¸è§çä¸ç§æ
嵿¯éè¦æä¸ªæ´æ°ç±»ååéå¢å 1 æåå° 1ãJava æä¾äºèªå¢è¿ç®ç¬¦ (`++`) åèªåè¿ç®ç¬¦ (`--`) æ¥ç®åè¿ç§æä½ã
`++` å `--` è¿ç®ç¬¦å¯ä»¥æ¾å¨åéä¹åï¼ä¹å¯ä»¥æ¾å¨åéä¹åï¼
- **åç¼å½¢å¼**ï¼ä¾å¦ `++a` æ `--a`ï¼ï¼å
èªå¢/èªååéçå¼ï¼ç¶åå使ç¨è¯¥åéï¼ä¾å¦ï¼`b = ++a` å
å° `a` å¢å 1ï¼ç¶åæå¢å åçå¼èµç» `b`ã
- **åç¼å½¢å¼**ï¼ä¾å¦ `a++` æ `a--`ï¼ï¼å
使ç¨åéçå½åå¼ï¼ç¶ååèªå¢/èªååéçå¼ãä¾å¦ï¼`b = a++` å
å° `a` çå½åå¼èµç» `b`ï¼ç¶ååå° `a` å¢å 1ã
ä¸ºäºæ¹ä¾¿è®°å¿ï¼å¯ä»¥ä½¿ç¨ä¸é¢çå£è¯ï¼**符å·å¨åå°±å
å /åï¼ç¬¦å·å¨åå°±åå /å**ã
ä¸é¢æ¥çä¸ä¸ªèå¯èªå¢èªåè¿ç®ç¬¦çé«é¢ç¬è¯é¢ï¼æ§è¡ä¸é¢ç代ç åï¼`a` ã`b` ã `c` ã`d`å`e`ç弿¯ï¼
```java
int a = 9;
int b = a++;
int c = ++a;
int d = c--;
int e = --d;
```
çæ¡ï¼`a = 11` ã`b = 9` ã `c = 10` ã `d = 10` ã `e = 10`ã
### âï¸ç§»ä½è¿ç®ç¬¦
ç§»ä½è¿ç®ç¬¦æ¯æåºæ¬çè¿ç®ç¬¦ä¹ä¸ï¼å 乿¯ç§ç¼ç¨è¯è¨é½å
å«è¿ä¸è¿ç®ç¬¦ãç§»ä½æä½ä¸ï¼è¢«æä½çæ°æ®è¢«è§ä¸ºäºè¿å¶æ°ï¼ç§»ä½å°±æ¯å°å
¶åå·¦æåå³ç§»å¨è¥å¹²ä½çè¿ç®ã
ç§»ä½è¿ç®ç¬¦å¨åç§æ¡æ¶ä»¥å JDK èªèº«çæºç ä¸ä½¿ç¨è¿æ¯æºå¹¿æ³çï¼`HashMap`ï¼JDK1.8ï¼ ä¸ç `hash` æ¹æ³çæºç å°±ç¨å°äºç§»ä½è¿ç®ç¬¦ï¼
```java
static final int hash(Object key) {
int h;
// key.hashCode()ï¼è¿åæ£åå¼ä¹å°±æ¯hashcode
// ^ï¼æä½å¼æ
// >>>:æ 符å·å³ç§»ï¼å¿½ç¥ç¬¦å·ä½ï¼ç©ºä½é½ä»¥0è¡¥é½
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
```
**使ç¨ç§»ä½è¿ç®ç¬¦ç主è¦åå **ï¼
1. **髿**ï¼ç§»ä½è¿ç®ç¬¦ç´æ¥å¯¹åºäºå¤çå¨çç§»ä½æä»¤ãç°ä»£å¤çå¨å
·æä¸é¨ç硬件æä»¤æ¥æ§è¡è¿äºç§»ä½æä½ï¼è¿äºæä»¤é常å¨ä¸ä¸ªæ¶é卿å
宿ãç¸æ¯ä¹ä¸ï¼ä¹æ³å餿³çç®æ¯è¿ç®å¨ç¡¬ä»¶å±é¢ä¸éè¦æ´å¤çæ¶é卿æ¥å®æã
2. **èçå
å**ï¼éè¿ç§»ä½æä½ï¼å¯ä»¥ä½¿ç¨ä¸ä¸ªæ´æ°ï¼å¦ `int` æ `long`ï¼æ¥åå¨å¤ä¸ªå¸å°å¼ææ å¿ä½ï¼ä»èèçå
åã
ç§»ä½è¿ç®ç¬¦æå¸¸ç¨äºå¿«éä¹ä»¥æé¤ä»¥ 2 ç广¬¡æ¹ã餿¤ä¹å¤ï¼å®è¿å¨ä»¥ä¸æ¹é¢åæ¥çéè¦ä½ç¨ï¼
- **ä½å段管ç**ï¼ä¾å¦åå¨åæä½å¤ä¸ªå¸å°å¼ã
- **åå¸ç®æ³åå å¯è§£å¯**ï¼éè¿ç§»ä½åä¸ãæçæä½æ¥æ··æ·æ°æ®ã
- **æ°æ®å缩**ï¼ä¾å¦é夫æ¼ç¼ç éè¿ç§»ä½è¿ç®ç¬¦å¯ä»¥å¿«éå¤çåæä½äºè¿å¶æ°æ®ï¼ä»¥çæç´§åçåç¼©æ ¼å¼ã
- **æ°æ®æ ¡éª**ï¼ä¾å¦ CRCï¼å¾ªç¯å使 ¡éªï¼éè¿ç§»ä½åå¤é¡¹å¼é¤æ³çæåæ ¡éªæ°æ®å®æ´æ§ã
- **å
å对é½**ï¼éè¿ç§»ä½æä½ï¼å¯ä»¥è½»æ¾è®¡ç®åè°æ´æ°æ®ç对é½å°åã
ææ¡æåºæ¬çç§»ä½è¿ç®ç¬¦ç¥è¯è¿æ¯å¾æå¿
è¦çï¼è¿ä¸å
å¯ä»¥å¸®å©æä»¬å¨ä»£ç ä¸ä½¿ç¨ï¼è¿å¯ä»¥å¸®å©æä»¬çè§£æºç 䏿¶åå°ç§»ä½è¿ç®ç¬¦ç代ç ã
Java 䏿ä¸ç§ç§»ä½è¿ç®ç¬¦ï¼
- `<<` :左移è¿ç®ç¬¦ï¼å左移è¥å¹²ä½ï¼é«ä½ä¸¢å¼ï¼ä½ä½è¡¥é¶ã`x << n`,ç¸å½äº x ä¹ä»¥ 2 ç n 次æ¹(䏿º¢åºçæ
åµä¸)ã
- `>>` :带符å·å³ç§»ï¼åå³ç§»è¥å¹²ä½ï¼é«ä½è¡¥ç¬¦å·ä½ï¼ä½ä½ä¸¢å¼ãæ£æ°é«ä½è¡¥ 0,è´æ°é«ä½è¡¥ 1ã`x >> n`,ç¸å½äº x é¤ä»¥ 2 ç n 次æ¹ã
- `>>>` :æ 符å·å³ç§»ï¼å¿½ç¥ç¬¦å·ä½ï¼ç©ºä½é½ä»¥ 0 è¡¥é½ã
è½ç¶ç§»ä½è¿ç®æ¬è´¨ä¸å¯ä»¥å为左移åå³ç§»ï¼ä½å¨å®é
åºç¨ä¸ï¼å³ç§»æä½éè¦èè符å·ä½çå¤çæ¹å¼ã
ç±äº `double`ï¼`float` å¨äºè¿å¶ä¸çè¡¨ç°æ¯è¾ç¹æ®ï¼å æ¤ä¸è½æ¥è¿è¡ç§»ä½æä½ã
ç§»ä½æä½ç¬¦å®é
䏿¯æçç±»ååªæ`int`å`long`ï¼ç¼è¯å¨å¨å¯¹`short`ã`byte`ã`char`ç±»åè¿è¡ç§»ä½åï¼é½ä¼å°å
¶è½¬æ¢ä¸º`int`ç±»ååæä½ã
**å¦æç§»ä½ç使°è¶
è¿æ°å¼æå æç使°ä¼ææ ·ï¼**
å½ int ç±»å左移/å³ç§»ä½æ°å¤§äºçäº 32 使使¶ï¼ä¼å
æ±ä½ï¼%ï¼ååè¿è¡å·¦ç§»/å³ç§»æä½ãä¹å°±æ¯è¯´å·¦ç§»/å³ç§» 32 ä½ç¸å½äºä¸è¿è¡ç§»ä½æä½ï¼32%32=0ï¼ï¼å·¦ç§»/å³ç§» 42 ä½ç¸å½äºå·¦ç§»/å³ç§» 10 ä½ï¼42%32=10ï¼ãå½ long ç±»åè¿è¡å·¦ç§»/å³ç§»æä½æ¶ï¼ç±äº long 对åºçäºè¿å¶æ¯ 64 ä½ï¼å æ¤æ±ä½æä½çåºæ°ä¹åæäº 64ã
ä¹å°±æ¯è¯´ï¼`x<<42`çåäº`x<<10`ï¼`x>>42`çåäº`x>>10`ï¼`x >>>42`çåäº`x >>> 10`ã
**左移è¿ç®ç¬¦ä»£ç 示ä¾**ï¼
```java
int i = -1;
System.out.println("åå§æ°æ®ï¼" + i);
System.out.println("åå§æ°æ®å¯¹åºçäºè¿å¶å符串ï¼" + Integer.toBinaryString(i));
i <<= 10;
System.out.println("左移 10 ä½åçæ°æ® " + i);
System.out.println("左移 10 ä½åçæ°æ®å¯¹åºçäºè¿å¶å符 " + Integer.toBinaryString(i));
```
è¾åºï¼
```plain
åå§æ°æ®ï¼-1
åå§æ°æ®å¯¹åºçäºè¿å¶å符串ï¼11111111111111111111111111111111
左移 10 ä½åçæ°æ® -1024
左移 10 ä½åçæ°æ®å¯¹åºçäºè¿å¶å符 11111111111111111111110000000000
```
ç±äºå·¦ç§»ä½æ°å¤§äºçäº 32 使使¶ï¼ä¼å
æ±ä½ï¼%ï¼ååè¿è¡å·¦ç§»æä½ï¼æä»¥ä¸é¢ç代ç 左移 42 ä½ç¸å½äºå·¦ç§» 10 ä½ï¼42%32=10ï¼ï¼è¾åºç»æååé¢ç代ç 䏿 ·ã
```java
int i = -1;
System.out.println("åå§æ°æ®ï¼" + i);
System.out.println("åå§æ°æ®å¯¹åºçäºè¿å¶å符串ï¼" + Integer.toBinaryString(i));
i <<= 42;
System.out.println("左移 10 ä½åçæ°æ® " + i);
System.out.println("左移 10 ä½åçæ°æ®å¯¹åºçäºè¿å¶å符 " + Integer.toBinaryString(i));
```
å³ç§»è¿ç®ç¬¦ä½¿ç¨ç±»ä¼¼ï¼ç¯å¹
é®é¢ï¼è¿éå°±ä¸åæ¼ç¤ºäºã
## âï¸åºæ¬æ°æ®ç±»å
### Java ä¸çå ç§åºæ¬æ°æ®ç±»åäºè§£ä¹ï¼
Java 䏿 8 ç§åºæ¬æ°æ®ç±»åï¼åå«ä¸ºï¼
- 6 ç§æ°åç±»åï¼
- 4 ç§æ´æ°åï¼`byte`ã`short`ã`int`ã`long`
- 2 ç§æµ®ç¹åï¼`float`ã`double`
- 1 ç§å符类åï¼`char`
- 1 ç§å¸å°åï¼`boolean`ã
è¿ 8 ç§åºæ¬æ°æ®ç±»åçé»è®¤å¼ä»¥åæå 空é´ç大å°å¦ä¸ï¼
| åºæ¬ç±»å | 使° | åè | é»è®¤å¼ | åå¼èå´ |
| :-------- | :--- | :--- | :------ | ------------------------------------------------------------ |
| `byte` | 8 | 1 | 0 | -128 ~ 127 |
| `short` | 16 | 2 | 0 | -32768ï¼-2^15ï¼ ~ 32767ï¼2^15 - 1ï¼ |
| `int` | 32 | 4 | 0 | -2147483648 ~ 2147483647 |
| `long` | 64 | 8 | 0L | -9223372036854775808ï¼-2^63ï¼ ~ 9223372036854775807ï¼2^63 -1ï¼ |
| `char` | 16 | 2 | 'u0000' | 0 ~ 65535ï¼2^16 - 1ï¼ |
| `float` | 32 | 4 | 0f | 1.4E-45 ~ 3.4028235E38 |
| `double` | 64 | 8 | 0d | 4.9E-324 ~ 1.7976931348623157E308 |
| `boolean` | 1 | | false | trueãfalse |
å¯ä»¥çå°ï¼å `byte`ã`short`ã`int`ã`long`è½è¡¨ç¤ºçæå¤§æ£æ°é½å 1 äºãè¿æ¯ä¸ºä»ä¹å¢ï¼è¿æ¯å 为å¨äºè¿å¶è¡¥ç 表示æ³ä¸ï¼æé«ä½æ¯ç¨æ¥è¡¨ç¤ºç¬¦å·çï¼0 è¡¨ç¤ºæ£æ°ï¼1 è¡¨ç¤ºè´æ°ï¼ï¼å
¶ä½ä½è¡¨ç¤ºæ°å¼é¨åãæä»¥ï¼å¦ææä»¬è¦è¡¨ç¤ºæå¤§çæ£æ°ï¼æä»¬éè¦æé¤äºæé«ä½ä¹å¤çææä½é½è®¾ä¸º 1ã妿æä»¬åå 1ï¼å°±ä¼å¯¼è´æº¢åºï¼åæä¸ä¸ªè´æ°ã
å¯¹äº `boolean`ï¼å®æ¹ææ¡£æªæç¡®å®ä¹ï¼å®ä¾èµäº JVM ååçå
·ä½å®ç°ãé»è¾ä¸çè§£æ¯å ç¨ 1 ä½ï¼ä½æ¯å®é
ä¸ä¼èèè®¡ç®æºé«æåå¨å ç´ ã
å¦å¤ï¼Java çæ¯ç§åºæ¬ç±»åæå åå¨ç©ºé´ç大å°ä¸ä¼åå
¶ä»å¤§å¤æ°è¯è¨é£æ ·éæºå¨ç¡¬ä»¶æ¶æçååèååãè¿ç§æå åå¨ç©ºé´å¤§å°çä¸åæ§æ¯ Java ç¨åºæ¯ç¨å
¶ä»å¤§å¤æ°è¯è¨ç¼åçç¨åºæ´å
·å¯ç§»æ¤æ§çåå ä¹ä¸ï¼ãJava ç¼ç¨ææ³ã2.2 èææå°ï¼ã
**注æï¼**
1. Java éä½¿ç¨ `long` ç±»åçæ°æ®ä¸å®è¦å¨æ°å¼åé¢å ä¸ **L**ï¼å¦åå°ä½ä¸ºæ´åè§£æã
2. Java éä½¿ç¨ `float` ç±»åçæ°æ®ä¸å®è¦å¨æ°å¼åé¢å ä¸ **f æ F**ï¼å¦åå°æ æ³éè¿ç¼è¯ã
3. `char a = 'h'`char :åå¼å·ï¼`String a = "hello"` :åå¼å·ã
è¿å
«ç§åºæ¬ç±»å齿坹åºçå
è£
ç±»åå«ä¸ºï¼`Byte`ã`Short`ã`Integer`ã`Long`ã`Float`ã`Double`ã`Character`ã`Boolean` ã
### åºæ¬ç±»ååå
è£
ç±»åçåºå«ï¼
- **ç¨é**ï¼é¤äºå®ä¹ä¸äºå¸¸éåå±é¨åéä¹å¤ï¼æä»¬å¨å
¶ä»å°æ¹æ¯å¦æ¹æ³åæ°ãå¯¹è±¡å±æ§ä¸å¾å°ä¼ä½¿ç¨åºæ¬ç±»åæ¥å®ä¹åéãå¹¶ä¸ï¼å
è£
ç±»åå¯ç¨äºæ³åï¼èåºæ¬ç±»åä¸å¯ä»¥ã
- **å卿¹å¼**ï¼åºæ¬æ°æ®ç±»åçå±é¨åéåæ¾å¨ Java èææºæ ä¸çå±é¨åé表ä¸ï¼åºæ¬æ°æ®ç±»åçæååéï¼æªè¢« `static` 修饰 ï¼åæ¾å¨ Java èææºçå ä¸ãå
è£
ç±»åå±äºå¯¹è±¡ç±»åï¼æä»¬ç¥éå 乿æå¯¹è±¡å®ä¾é½åå¨äºå ä¸ã
- **å ç¨ç©ºé´**ï¼ç¸æ¯äºå
è£
ç±»åï¼å¯¹è±¡ç±»åï¼ï¼ åºæ¬æ°æ®ç±»åå ç¨ç空é´å¾å¾é常å°ã
- **é»è®¤å¼**ï¼æååéå
è£
ç±»åä¸èµå¼å°±æ¯ `null` ï¼èåºæ¬ç±»åæé»è®¤å¼ä¸ä¸æ¯ `null`ã
- **æ¯è¾æ¹å¼**ï¼å¯¹äºåºæ¬æ°æ®ç±»åæ¥è¯´ï¼`==` æ¯è¾çæ¯å¼ã对äºå
è£
æ°æ®ç±»åæ¥è¯´ï¼`==` æ¯è¾çæ¯å¯¹è±¡çå
åå°åãæææ´åå
è£
类对象ä¹é´å¼çæ¯è¾ï¼å
¨é¨ä½¿ç¨ `equals()` æ¹æ³ã
**为ä»ä¹è¯´æ¯å 乿æå¯¹è±¡å®ä¾é½åå¨äºå ä¸å¢ï¼** è¿æ¯å 为 HotSpot èææºå¼å
¥äº JIT ä¼åä¹åï¼ä¼å¯¹å¯¹è±¡è¿è¡éé¸åæï¼å¦æåç°æä¸ä¸ªå¯¹è±¡å¹¶æ²¡æéé¸å°æ¹æ³å¤é¨ï¼é£ä¹å°±å¯è½éè¿æ éæ¿æ¢æ¥å®ç°æ ä¸åé
ï¼èé¿å
å ä¸åé
å
å
â ï¸ æ³¨æï¼**åºæ¬æ°æ®ç±»å忾卿 䏿¯ä¸ä¸ªå¸¸è§ç误åºï¼** åºæ¬æ°æ®ç±»åçåå¨ä½ç½®åå³äºå®ä»¬çä½ç¨ååå£°ææ¹å¼ã妿å®ä»¬æ¯å±é¨åéï¼é£ä¹å®ä»¬ä¼åæ¾å¨æ ä¸ï¼å¦æå®ä»¬æ¯æååéï¼é£ä¹å®ä»¬ä¼åæ¾å¨å /æ¹æ³åº/å
空é´ä¸ã
```java
public class Test {
// æååéï¼åæ¾å¨å ä¸
int a = 10;
// 被 static 修饰çæååéï¼JDK 1.7 åä¹åä½äºæ¹æ³åºï¼1.8 ååæ¾äºå
空é´ï¼åä¸åæ¾äºå ä¸ã
// åéå±äºç±»ï¼ä¸å±äºå¯¹è±¡ã
static int b = 20;
public void method() {
// å±é¨åéï¼åæ¾å¨æ ä¸
int c = 30;
static int d = 40; // ç¼è¯é误ï¼ä¸è½å¨æ¹æ³ä¸ä½¿ç¨ static 修饰å±é¨åé
}
}
```
### å
è£
ç±»åçç¼åæºå¶äºè§£ä¹ï¼
Java åºæ¬æ°æ®ç±»åçå
è£
ç±»åç大é¨åé½ç¨å°äºç¼åæºå¶æ¥æåæ§è½ã
`Byte`,`Short`,`Integer`,`Long` è¿ 4 ç§å
è£
ç±»é»è®¤åå»ºäºæ°å¼ **[-128ï¼127]** çç¸åºç±»åçç¼åæ°æ®ï¼`Character` åå»ºäºæ°å¼å¨ **[0,127]** èå´çç¼åæ°æ®ï¼`Boolean` ç´æ¥è¿å `TRUE` or `FALSE`ã
å¯¹äº `Integer`ï¼å¯ä»¥éè¿ JVM åæ° `-XX:AutoBoxCacheMax=` ä¿®æ¹ç¼åä¸éï¼ä½ä¸è½ä¿®æ¹ä¸é -128ãå®é
ä½¿ç¨æ¶ï¼å¹¶ä¸å»ºè®®è®¾ç½®è¿å¤§çå¼ï¼é¿å
浪费å
åï¼çè³æ¯ OOMã
对äº`Byte`,`Short`,`Long` ,`Character` 没æç±»ä¼¼ `-XX:AutoBoxCacheMax` åæ°å¯ä»¥ä¿®æ¹ï¼å æ¤ç¼åèå´æ¯åºå®çï¼æ æ³éè¿ JVM åæ°è°æ´ã`Boolean` åç´æ¥è¿åé¢å®ä¹ç `TRUE` å `FALSE` å®ä¾ï¼æ²¡æç¼åèå´çæ¦å¿µã
**Integer ç¼åæºç ï¼**
```java
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
private static class IntegerCache {
static final int low = -128;
static final int high;
static {
// high value may be configured by property
int h = 127;
}
}
```
**`Character` ç¼åæºç :**
```java
public static Character valueOf(char c) {
if (c <= 127) { // must cache
return CharacterCache.cache[(int)c];
}
return new Character(c);
}
private static class CharacterCache {
private CharacterCache(){}
static final Character cache[] = new Character[127 + 1];
static {
for (int i = 0; i < cache.length; i++)
cache[i] = new Character((char)i);
}
}
```
**`Boolean` ç¼åæºç ï¼**
```java
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
```
妿è¶
åºå¯¹åºèå´ä»ç¶ä¼å»å建æ°ç对象ï¼ç¼åçèå´åºé´ç大å°åªæ¯å¨æ§è½åèµæºä¹é´çæè¡¡ã
ä¸¤ç§æµ®ç¹æ°ç±»åçå
è£
ç±» `Float`,`Double` 并没æå®ç°ç¼åæºå¶ã
```java
Integer i1 = 33;
Integer i2 = 33;
System.out.println(i1 == i2);// è¾åº true
Float i11 = 333f;
Float i22 = 333f;
System.out.println(i11 == i22);// è¾åº false
Double i3 = 1.2;
Double i4 = 1.2;
System.out.println(i3 == i4);// è¾åº false
```
ä¸é¢æä»¬æ¥çä¸ä¸ªé®é¢ï¼ä¸é¢ç代ç çè¾åºç»ææ¯ `true` è¿æ¯ `false` å¢ï¼
```java
Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1==i2);
```
`Integer i1=40` è¿ä¸è¡ä»£ç ä¼åçè£
ç®±ï¼ä¹å°±æ¯è¯´è¿è¡ä»£ç çä»·äº `Integer i1=Integer.valueOf(40)` ãå æ¤ï¼`i1` ç´æ¥ä½¿ç¨çæ¯ç¼åä¸ç对象ãè`Integer i2 = new Integer(40)` ä¼ç´æ¥å建æ°ç对象ã
å æ¤ï¼çæ¡æ¯ `false` ãä½ ç对äºåï¼
è®°ä½ï¼**æææ´åå
è£
类对象ä¹é´å¼çæ¯è¾ï¼å
¨é¨ä½¿ç¨ equals æ¹æ³æ¯è¾**ã

### èªå¨è£
ç®±ä¸æç®±äºè§£åï¼åçæ¯ä»ä¹ï¼
**ä»ä¹æ¯èªå¨æè£
ç®±ï¼**
- **è£
ç®±**ï¼å°åºæ¬ç±»åç¨å®ä»¬å¯¹åºçå¼ç¨ç±»åå
è£
èµ·æ¥ï¼
- **æç®±**ï¼å°å
è£
ç±»å转æ¢ä¸ºåºæ¬æ°æ®ç±»åï¼
举ä¾ï¼
```java
Integer i = 10; //è£
ç®±
int n = i; //æç®±
```
ä¸é¢è¿ä¸¤è¡ä»£ç 对åºçåèç 为ï¼
```java
L1
LINENUMBER 8 L1
ALOAD 0
BIPUSH 10
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
PUTFIELD AutoBoxTest.i : Ljava/lang/Integer;
L2
LINENUMBER 9 L2
ALOAD 0
ALOAD 0
GETFIELD AutoBoxTest.i : Ljava/lang/Integer;
INVOKEVIRTUAL java/lang/Integer.intValue ()I
PUTFIELD AutoBoxTest.n : I
RETURN
```
ä»åèç ä¸ï¼æä»¬åç°è£
ç®±å
¶å®å°±æ¯è°ç¨äº å
è£
ç±»ç`valueOf()`æ¹æ³ï¼æç®±å
¶å®å°±æ¯è°ç¨äº `xxxValue()`æ¹æ³ã
å æ¤ï¼
- `Integer i = 10` çä»·äº `Integer i = Integer.valueOf(10)`
- `int n = i` çä»·äº `int n = i.intValue()`;
注æï¼**妿é¢ç¹æè£
ç®±çè¯ï¼ä¹ä¼ä¸¥éå½±åç³»ç»çæ§è½ãæä»¬åºè¯¥å°½éé¿å
ä¸å¿
è¦çæè£
ç®±æä½ã**
```java
private static long sum() {
// åºè¯¥ä½¿ç¨ long è䏿¯ Long
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
```
### 为ä»ä¹æµ®ç¹æ°è¿ç®çæ¶åä¼æç²¾åº¦ä¸¢å¤±çé£é©ï¼
æµ®ç¹æ°è¿ç®ç²¾åº¦ä¸¢å¤±ä»£ç æ¼ç¤ºï¼
```java
float a = 2.0f - 1.9f;
float b = 1.8f - 1.7f;
System.out.printf("%.9f",a);// 0.100000024
System.out.println(b);// 0.099999905
System.out.println(a == b);// false
```
为ä»ä¹ä¼åºç°è¿ä¸ªé®é¢å¢ï¼
è¿ä¸ªåè®¡ç®æºä¿åæµ®ç¹æ°çæºå¶æå¾å¤§å
³ç³»ãæä»¬ç¥éè®¡ç®æºæ¯äºè¿å¶çï¼èä¸è®¡ç®æºå¨è¡¨ç¤ºä¸ä¸ªæ°åæ¶ï¼å®½åº¦æ¯æéçï¼æ é循ç¯çå°æ°åå¨å¨è®¡ç®æºæ¶ï¼åªè½è¢«æªæï¼æä»¥å°±ä¼å¯¼è´å°æ°ç²¾åº¦åçæå¤±çæ
åµãè¿ä¹å°±æ¯è§£éäºä¸ºä»ä¹æµ®ç¹æ°æ²¡æåæ³ç¨äºè¿å¶ç²¾ç¡®è¡¨ç¤ºã
å°±æ¯å¦è¯´åè¿å¶ä¸ç 0.2 å°±æ²¡åæ³ç²¾ç¡®è½¬æ¢æäºè¿å¶å°æ°ï¼
```java
// 0.2 转æ¢ä¸ºäºè¿å¶æ°çè¿ç¨ä¸ºï¼ä¸æä¹ä»¥ 2ï¼ç´å°ä¸åå¨å°æ°ä¸ºæ¢ï¼
// å¨è¿ä¸ªè®¡ç®è¿ç¨ä¸ï¼å¾å°çæ´æ°é¨åä»ä¸å°ä¸æåå°±æ¯äºè¿å¶çç»æã
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0ï¼åç循ç¯ï¼
...
```
å
³äºæµ®ç¹æ°çæ´å¤å
容ï¼å»ºè®®çä¸ä¸[è®¡ç®æºç³»ç»åºç¡ï¼åï¼æµ®ç¹æ°](http://kaito-kidd.com/2018/08/08/computer-system-float-point/)è¿ç¯æç« ã
### å¦ä½è§£å³æµ®ç¹æ°è¿ç®ç精度丢失é®é¢ï¼
`BigDecimal` å¯ä»¥å®ç°å¯¹æµ®ç¹æ°çè¿ç®ï¼ä¸ä¼é æç²¾åº¦ä¸¢å¤±ãé常æ
åµä¸ï¼å¤§é¨åéè¦æµ®ç¹æ°ç²¾ç¡®è¿ç®ç»æçä¸å¡åºæ¯ï¼æ¯å¦æ¶åå°é±çåºæ¯ï¼é½æ¯éè¿ `BigDecimal` æ¥åçã
```java
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("1.00");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(c);
BigDecimal y = b.subtract(c);
System.out.println(x); /* 0.2 */
System.out.println(y); /* 0.20 */
// æ¯è¾å
容ï¼ä¸æ¯æ¯è¾å¼
System.out.println(Objects.equals(x, y)); /* false */
// æ¯è¾å¼ç¸çç¨ç¸çcompareToï¼ç¸çè¿å0
System.out.println(0 == x.compareTo(y)); /* true */
```
å
³äº `BigDecimal` ç详ç»ä»ç»ï¼å¯ä»¥ççæåçè¿ç¯æç« ï¼[BigDecimal 详解](https://javaguide.cn/java/basis/bigdecimal.html)ã
### è¶
è¿ long æ´åçæ°æ®åºè¯¥å¦ä½è¡¨ç¤ºï¼
åºæ¬æ°å¼ç±»å齿ä¸ä¸ªè¡¨è¾¾èå´ï¼å¦æè¶
è¿è¿ä¸ªèå´å°±ä¼ææ°å¼æº¢åºçé£é©ã
å¨ Java ä¸ï¼64 ä½ long æ´åæ¯æå¤§çæ´æ°ç±»åã
```java
long l = Long.MAX_VALUE;
System.out.println(l + 1); // -9223372036854775808
System.out.println(l + 1 == Long.MIN_VALUE); // true
```
`BigInteger` å
é¨ä½¿ç¨ `int[]` æ°ç»æ¥åå¨ä»»æå¤§å°çæ´å½¢æ°æ®ã
ç¸å¯¹äºå¸¸è§æ´æ°ç±»åçè¿ç®æ¥è¯´ï¼`BigInteger` è¿ç®çæçä¼ç¸å¯¹è¾ä½ã
## é¢å对象åºç¡
### âï¸æååéä¸å±é¨åéçåºå«ï¼
- **è¯æ³å½¢å¼**ï¼ä»è¯æ³å½¢å¼ä¸çï¼æåå鿝å±äºç±»çï¼èå±é¨å鿝å¨ä»£ç åææ¹æ³ä¸å®ä¹çåéææ¯æ¹æ³çåæ°ï¼æååéå¯ä»¥è¢« `public`,`private`,`static` ç修饰符æä¿®é¥°ï¼èå±é¨åéä¸è½è¢«è®¿é®æ§å¶ä¿®é¥°ç¬¦å `static` æä¿®é¥°ï¼ä½æ¯ï¼æååéåå±é¨åéé½è½è¢« `final` æä¿®é¥°ã
- **å卿¹å¼**ï¼ä»åéå¨å
åä¸çå卿¹å¼æ¥çï¼å¦ææååéæ¯ä½¿ç¨ `static` 修饰çï¼é£ä¹è¿ä¸ªæåå鿝å±äºç±»çï¼å¦ææ²¡æä½¿ç¨ `static` 修饰ï¼è¿ä¸ªæåå鿝å±äºå®ä¾çãè对象åå¨äºå å
åï¼å±é¨åéååå¨äºæ å
åã
- **çåæ¶é´**ï¼ä»åéå¨å
åä¸ççåæ¶é´ä¸çï¼æååéæ¯å¯¹è±¡çä¸é¨åï¼å®éç对象çå建èåå¨ï¼èå±é¨åééçæ¹æ³çè°ç¨èèªå¨çæï¼éçæ¹æ³çè°ç¨ç»æèæ¶äº¡ã
- **é»è®¤å¼**ï¼ä»å鿝妿é»è®¤å¼æ¥çï¼æååéå¦ææ²¡æè¢«èµåå§å¼ï¼åä¼èªå¨ä»¥ç±»åçé»è®¤å¼èèµå¼ï¼ä¸ç§æ
åµä¾å¤:被 `final` 修饰çæååéä¹å¿
é¡»æ¾å¼å°èµå¼ï¼ï¼èå±é¨åéåä¸ä¼èªå¨èµå¼ã
**为ä»ä¹æååéæé»è®¤å¼ï¼**
1. å
ä¸èèåéç±»åï¼å¦ææ²¡æé»è®¤å¼ä¼ææ ·ï¼åéåå¨çæ¯å
åå°å对åºçä»»æéæºå¼ï¼ç¨åºè¯»å该å¼è¿è¡ä¼åºç°æå¤ã
2. é»è®¤å¼æä¸¤ç§è®¾ç½®æ¹å¼ï¼æå¨åèªå¨ï¼æ ¹æ®ç¬¬ä¸ç¹ï¼æ²¡ææå¨èµå¼ä¸å®è¦èªå¨èµå¼ãæååéå¨è¿è¡æ¶å¯åå©åå°çæ¹æ³æå¨èµå¼ï¼èå±é¨åéä¸è¡ã
3. 对äºç¼è¯å¨ï¼javacï¼æ¥è¯´ï¼å±é¨åéæ²¡èµå¼å¾å¥½å¤æï¼å¯ä»¥ç´æ¥æ¥éãèæååéå¯è½æ¯è¿è¡æ¶èµå¼ï¼æ æ³å¤æï¼è¯¯æ¥â没é»è®¤å¼âåä¼å½±åç¨æ·ä½éªï¼æä»¥éç¨èªå¨èµé»è®¤å¼ã
æååéä¸å±é¨åé代ç 示ä¾ï¼
```java
public class VariableExample {
// æååé
private String name;
private int age;
// æ¹æ³ä¸çå±é¨åé
public void method() {
int num1 = 10; // æ ä¸åé
çå±é¨åé
String str = "Hello, world!"; // æ ä¸åé
çå±é¨åé
System.out.println(num1);
System.out.println(str);
}
// å¸¦åæ°çæ¹æ³ä¸çå±é¨åé
public void method2(int num2) {
int sum = num2 + 10; // æ ä¸åé
çå±é¨åé
System.out.println(sum);
}
// æé æ¹æ³ä¸çå±é¨åé
public VariableExample(String name, int age) {
this.name = name; // 对æååéè¿è¡èµå¼
this.age = age; // 对æååéè¿è¡èµå¼
int num3 = 20; // æ ä¸åé
çå±é¨åé
String str2 = "Hello, " + this.name + "!"; // æ ä¸åé
çå±é¨åé
System.out.println(num3);
System.out.println(str2);
}
}
```
### âï¸éææ¹æ³åå®ä¾æ¹æ³æä½ä¸åï¼
**1ãè°ç¨æ¹å¼**
å¨å¤é¨è°ç¨éææ¹æ³æ¶ï¼å¯ä»¥ä½¿ç¨ `ç±»å.æ¹æ³å` çæ¹å¼ï¼ä¹å¯ä»¥ä½¿ç¨ `对象.æ¹æ³å` çæ¹å¼ï¼èå®ä¾æ¹æ³åªæåé¢è¿ç§æ¹å¼ãä¹å°±æ¯è¯´ï¼**è°ç¨éææ¹æ³å¯ä»¥æ éå建对象** ã
ä¸è¿ï¼éè¦æ³¨æçæ¯ä¸è¬ä¸å»ºè®®ä½¿ç¨ `对象.æ¹æ³å` çæ¹å¼æ¥è°ç¨éææ¹æ³ãè¿ç§æ¹å¼é常容æé ææ··æ·ï¼éææ¹æ³ä¸å±äºç±»çæä¸ªå¯¹è±¡èæ¯å±äºè¿ä¸ªç±»ã
å æ¤ï¼ä¸è¬å»ºè®®ä½¿ç¨ `ç±»å.æ¹æ³å` çæ¹å¼æ¥è°ç¨éææ¹æ³ã
```java
public class Person {
public void method() {
//......
}
public static void staicMethod(){
//......
}
public static void main(String[] args) {
Person person = new Person();
// è°ç¨å®ä¾æ¹æ³
person.method();
// è°ç¨éææ¹æ³
Person.staicMethod()
}
}
```
**2ã访é®ç±»æåæ¯å¦åå¨éå¶**
éææ¹æ³å¨è®¿é®æ¬ç±»çæåæ¶ï¼åªå
许访é®éææåï¼å³éææååéåéææ¹æ³ï¼ï¼ä¸å
许访é®å®ä¾æåï¼å³å®ä¾æååéåå®ä¾æ¹æ³ï¼ï¼èå®ä¾æ¹æ³ä¸åå¨è¿ä¸ªéå¶ã
### âï¸éè½½åéåæä»ä¹åºå«ï¼
> é载就æ¯åæ ·çä¸ä¸ªæ¹æ³è½å¤æ ¹æ®è¾å
¥æ°æ®çä¸åï¼ååºä¸åçå¤ç
>
> éåå°±æ¯å½å类继æ¿èªç¶ç±»çç¸åæ¹æ³ï¼è¾å
¥æ°æ®ä¸æ ·ï¼ä½è¦ååºæå«äºç¶ç±»çååºæ¶ï¼ä½ å°±è¦è¦çç¶ç±»æ¹æ³
#### éè½½
åçå¨åä¸ä¸ªç±»ä¸ï¼æè
ç¶ç±»ååç±»ä¹é´ï¼ï¼æ¹æ³åå¿
é¡»ç¸åï¼åæ°ç±»åä¸åã个æ°ä¸åã顺åºä¸åï¼æ¹æ³è¿åå¼å访é®ä¿®é¥°ç¬¦å¯ä»¥ä¸åã
ãJava æ ¸å¿ææ¯ãè¿æ¬ä¹¦æ¯è¿æ ·ä»ç»éè½½çï¼
> 妿å¤ä¸ªæ¹æ³(æ¯å¦ `StringBuilder` çæé æ¹æ³)æç¸åçååãä¸åçåæ°ï¼ ä¾¿äº§çäºéè½½ã
>
> ```java
> StringBuilder sb = new StringBuilder();
> StringBuilder sb2 = new StringBuilder("HelloWorld");
> ```
>
> ç¼è¯å¨å¿
é¡»æéåºå
·ä½æ§è¡åªä¸ªæ¹æ³ï¼å®éè¿ç¨åä¸ªæ¹æ³ç»åºçåæ°ç±»åä¸ç¹å®æ¹æ³è°ç¨æä½¿ç¨çå¼ç±»åè¿è¡å¹é
æ¥æéåºç¸åºçæ¹æ³ã 妿ç¼è¯å¨æ¾ä¸å°å¹é
çåæ°ï¼ å°±ä¼äº§çç¼è¯æ¶éè¯¯ï¼ å ä¸ºæ ¹æ¬ä¸åå¨å¹é
ï¼ æè
没æä¸ä¸ªæ¯å
¶ä»çæ´å¥½(è¿ä¸ªè¿ç¨è¢«ç§°ä¸ºé载解æ(overloading resolution))ã
>
> Java å
许éè½½ä»»ä½æ¹æ³ï¼ èä¸åªæ¯æé 卿¹æ³ã
综ä¸ï¼é载就æ¯åä¸ä¸ªç±»ä¸å¤ä¸ªååæ¹æ³æ ¹æ®ä¸åçä¼ åæ¥æ§è¡ä¸åçé»è¾å¤çã
#### éå
éååçå¨è¿è¡æï¼æ¯å类对ç¶ç±»çå
许访é®çæ¹æ³çå®ç°è¿ç¨è¿è¡éæ°ç¼åã
1. æ¹æ³åãåæ°å表å¿
é¡»ç¸åï¼åç±»æ¹æ³è¿åå¼ç±»ååºæ¯ç¶ç±»æ¹æ³è¿åå¼ç±»åæ´å°æç¸çï¼æåºçå¼å¸¸èå´å°äºçäºç¶ç±»ï¼è®¿é®ä¿®é¥°ç¬¦èå´å¤§äºçäºç¶ç±»ã
2. 妿ç¶ç±»æ¹æ³è®¿é®ä¿®é¥°ç¬¦ä¸º `private/final/static` åå类就ä¸è½éåè¯¥æ¹æ³ï¼ä½æ¯è¢« `static` ä¿®é¥°çæ¹æ³è½å¤è¢«å次声æã
3. æé æ¹æ³æ æ³è¢«éå
#### æ»ç»
综ä¸ï¼**éåå°±æ¯å类对ç¶ç±»æ¹æ³çéæ°æ¹é ï¼å¤é¨æ ·åä¸è½æ¹åï¼å
é¨é»è¾å¯ä»¥æ¹åã**
| åºå«ç¹ | éè½½ (Overloading) | éå (Overriding) |
| -------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| **åçèå´** | åä¸ä¸ªç±»ä¸ã | ç¶ç±»ä¸åç±»ä¹é´ï¼åå¨ç»§æ¿å
³ç³»ï¼ã |
| **æ¹æ³ç¾å** | æ¹æ³å**å¿
é¡»ç¸å**ï¼ä½**åæ°å表å¿
é¡»ä¸å**ï¼åæ°çç±»åãä¸ªæ°æé¡ºåºè³å°æä¸é¡¹ä¸åï¼ã | æ¹æ³åãåæ°å表**å¿
é¡»å®å
¨ç¸å**ã |
| **è¿åç±»å** | ä¸è¿åå¼ç±»å**æ å
³**ï¼å¯ä»¥ä»»æä¿®æ¹ã | åç±»æ¹æ³çè¿åç±»åå¿
é¡»ä¸ç¶ç±»æ¹æ³çè¿åç±»å**ç¸å**ï¼æè
æ¯å
¶**åç±»**ã |
| **访é®ä¿®é¥°ç¬¦** | ä¸è®¿é®ä¿®é¥°ç¬¦**æ å
³**ï¼å¯ä»¥ä»»æä¿®æ¹ã | åç±»æ¹æ³çè®¿é®æé**ä¸è½ä½äº**ç¶ç±»æ¹æ³çè®¿é®æéãï¼public > protected > default > privateï¼ |
| **ç»å®æ¶æ** | ç¼è¯æ¶ç»å®æç§°éæç»å® | è¿è¡æ¶ç»å® (Run-time Binding) æç§°å¨æç»å® |
**æ¹æ³çéåè¦éµå¾ªâ两å两å°ä¸å¤§â**ï¼ä»¥ä¸å
容æå½èªãç¯ç Java 讲ä¹ãï¼[issue#892](https://github.com/Snailclimb/JavaGuide/issues/892) ï¼ï¼
- â两åâ峿¹æ³åç¸åãå½¢åå表ç¸åï¼
- â两å°âæçæ¯åç±»æ¹æ³è¿åå¼ç±»ååºæ¯ç¶ç±»æ¹æ³è¿åå¼ç±»åæ´å°æç¸çï¼åç±»æ¹æ³å£°ææåºçå¼å¸¸ç±»åºæ¯ç¶ç±»æ¹æ³å£°ææåºçå¼å¸¸ç±»æ´å°æç¸çï¼
- âä¸å¤§âæçæ¯åç±»æ¹æ³çè®¿é®æéåºæ¯ç¶ç±»æ¹æ³çè®¿é®æéæ´å¤§æç¸çã
âï¸ å
³äº **éåçè¿åå¼ç±»å** è¿ééè¦é¢å¤å¤è¯´æä¸ä¸ï¼ä¸é¢ç表述ä¸å¤ªæ¸
æ°åç¡®ï¼å¦ææ¹æ³çè¿åç±»åæ¯ void ååºæ¬æ°æ®ç±»åï¼åè¿åå¼éåæ¶ä¸å¯ä¿®æ¹ã使¯å¦ææ¹æ³çè¿å弿¯å¼ç¨ç±»åï¼éåæ¶æ¯å¯ä»¥è¿å该å¼ç¨ç±»åçåç±»çã
```java
public class Hero {
public String name() {
return "è¶
级è±é";
}
}
public class SuperMan extends Hero{
@Override
public String name() {
return "è¶
人";
}
public Hero hero() {
return new Hero();
}
}
public class SuperSuperMan extends SuperMan {
@Override
public String name() {
return "è¶
级è¶
级è±é";
}
@Override
public SuperMan hero() {
return new SuperMan();
}
}
```
### âï¸é¢å对象åé¢åè¿ç¨çåºå«
é¢åè¿ç¨ç¼ç¨ï¼Procedural-Oriented Programmingï¼POPï¼åé¢å对象ç¼ç¨ï¼Object-Oriented Programmingï¼OOPï¼æ¯ä¸¤ç§å¸¸è§çç¼ç¨èå¼ï¼ä¸¤è
ç主è¦åºå«å¨äºè§£å³é®é¢çæ¹å¼ä¸åï¼
- **é¢åè¿ç¨ç¼ç¨ï¼POPï¼**ï¼é¢åè¿ç¨æè§£å³é®é¢çè¿ç¨ææä¸ä¸ªä¸ªæ¹æ³ï¼éè¿ä¸ä¸ªä¸ªæ¹æ³çæ§è¡è§£å³é®é¢ã
- **é¢å对象ç¼ç¨ï¼OOPï¼**ï¼é¢å对象ä¼å
æ½è±¡åºå¯¹è±¡ï¼ç¶åç¨å¯¹è±¡æ§è¡æ¹æ³çæ¹å¼è§£å³é®é¢ã
ç¸æ¯è¾äº POPï¼OOP å¼åçç¨åºä¸è¬å
·æä¸é¢è¿äºä¼ç¹ï¼
- **æç»´æ¤**ï¼ç±äºè¯å¥½çç»æåå°è£
æ§ï¼OOP ç¨åºé常æ´å®¹æç»´æ¤ã
- **æå¤ç¨**ï¼éè¿ç»§æ¿å夿ï¼OOP 设计使å¾ä»£ç æ´å
·å¤ç¨æ§ï¼æ¹ä¾¿æ©å±åè½ã
- **ææ©å±**ï¼æ¨¡åå设计使å¾ç³»ç»æ©å±å徿´å 容æåçµæ´»ã
POP çç¼ç¨æ¹å¼é常æ´ä¸ºç®ååç´æ¥ï¼éåå¤çä¸äºè¾ç®åçä»»å¡ã
POP å OOP çæ§è½å·®å¼ä¸»è¦åå³äºå®ä»¬çè¿è¡æºå¶ï¼èä¸ä»
ä»
æ¯ç¼ç¨è弿¬èº«ãå æ¤ï¼ç®åå°æ¯è¾ä¸¤è
çæ§è½æ¯ä¸ä¸ªå¸¸è§ç误åºï¼ç¸å
³ issue : [é¢åè¿ç¨ï¼é¢åè¿ç¨æ§è½æ¯é¢å对象é«ï¼ï¼](https://github.com/Snailclimb/JavaGuide/issues/431) ï¼ã

å¨éæ©ç¼ç¨è弿¶ï¼æ§è½å¹¶ä¸æ¯å¯ä¸çèèå ç´ ã代ç çå¯ç»´æ¤æ§ã坿©å±æ§åå¼åæçåæ ·éè¦ã
ç°ä»£ç¼ç¨è¯è¨åºæ¬é½æ¯æå¤ç§ç¼ç¨èå¼ï¼æ¢å¯ä»¥ç¨æ¥è¿è¡é¢åè¿ç¨ç¼ç¨ï¼ä¹å¯ä»¥è¿è¡é¢å对象ç¼ç¨ã
ä¸é¢æ¯ä¸ä¸ªæ±åçé¢ç§¯åå¨é¿ç示ä¾ï¼ç®ååå«å±ç¤ºäºé¢å对象åé¢åè¿ç¨ä¸¤ç§ä¸åçè§£å³æ¹æ¡ã
**é¢å对象**ï¼
```java
public class Circle {
// å®ä¹åçåå¾
private double radius;
// æé 彿°
public Circle(double radius) {
this.radius = radius;
}
// 计ç®åçé¢ç§¯
public double getArea() {
return Math.PI * radius * radius;
}
// 计ç®åçå¨é¿
public double getPerimeter() {
return 2 * Math.PI * radius;
}
public static void main(String[] args) {
// å建ä¸ä¸ªåå¾ä¸º3çå
Circle circle = new Circle(3.0);
// è¾åºåçé¢ç§¯åå¨é¿
System.out.println("åçé¢ç§¯ä¸ºï¼" + circle.getArea());
System.out.println("åçå¨é¿ä¸ºï¼" + circle.getPerimeter());
}
}
```
æä»¬å®ä¹äºä¸ä¸ª `Circle` ç±»æ¥è¡¨ç¤ºåï¼è¯¥ç±»å
å«äºåçåå¾å±æ§å计ç®é¢ç§¯ãå¨é¿çæ¹æ³ã
**é¢åè¿ç¨**ï¼
```java
public class Main {
public static void main(String[] args) {
// å®ä¹åçåå¾
double radius = 3.0;
// 计ç®åçé¢ç§¯åå¨é¿
double area = Math.PI * radius * radius;
double perimeter = 2 * Math.PI * radius;
// è¾åºåçé¢ç§¯åå¨é¿
System.out.println("åçé¢ç§¯ä¸ºï¼" + area);
System.out.println("åçå¨é¿ä¸ºï¼" + perimeter);
}
}
```
æä»¬ç´æ¥å®ä¹äºåçåå¾ï¼å¹¶ä½¿ç¨è¯¥åå¾ç´æ¥è®¡ç®åºåçé¢ç§¯åå¨é¿ã
### âï¸å¯¹è±¡çç¸çåå¼ç¨ç¸ççåºå«
- 对象çç¸çä¸è¬æ¯è¾çæ¯å
åä¸åæ¾çå
容æ¯å¦ç¸çã
- å¼ç¨ç¸çä¸è¬æ¯è¾çæ¯ä»ä»¬æåçå
åå°åæ¯å¦ç¸çã
è¿é举ä¸ä¸ªä¾åï¼
```java
String str1 = "hello";
String str2 = new String("hello");
String str3 = "hello";
// ä½¿ç¨ == æ¯è¾å符串çå¼ç¨ç¸ç
System.out.println(str1 == str2);
System.out.println(str1 == str3);
// ä½¿ç¨ equals æ¹æ³æ¯è¾å符串çç¸ç
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
```
è¾åºç»æï¼
```plain
false
true
true
true
```
ä»ä¸é¢ç代ç è¾åºç»æå¯ä»¥çåºï¼
- `str1` å `str2` ä¸ç¸çï¼è `str1` å `str3` ç¸çãè¿æ¯å 为 `==` è¿ç®ç¬¦æ¯è¾çæ¯å符串çå¼ç¨æ¯å¦ç¸çã
- `str1`ã `str2`ã`str3` ä¸è
çå
容é½ç¸çãè¿æ¯å 为`equals` æ¹æ³æ¯è¾çæ¯å符串çå
容ï¼å³ä½¿è¿äºå符串ç对象å¼ç¨ä¸åï¼åªè¦å®ä»¬çå
容ç¸çï¼å°±è®¤ä¸ºå®ä»¬æ¯ç¸ççã
### âï¸é¢å对象ä¸å¤§ç¹å¾
#### å°è£
å°è£
æ¯ææä¸ä¸ªå¯¹è±¡çç¶æä¿¡æ¯ï¼ä¹å°±æ¯å±æ§ï¼éèå¨å¯¹è±¡å
é¨ï¼ä¸å
许å¤é¨å¯¹è±¡ç´æ¥è®¿é®å¯¹è±¡çå
é¨ä¿¡æ¯ã使¯å¯ä»¥æä¾ä¸äºå¯ä»¥è¢«å¤ç访é®çæ¹æ³æ¥æä½å±æ§ã就好åæä»¬çä¸å°æå¨å¢ä¸ç空è°çå
é¨çé¶ä»¶ä¿¡æ¯ï¼ä¹å°±æ¯å±æ§ï¼ï¼ä½æ¯å¯ä»¥éè¿é¥æ§å¨ï¼æ¹æ³ï¼æ¥æ§å¶ç©ºè°ã妿屿§ä¸æ³è¢«å¤ç访é®ï¼æä»¬å¤§å¯ä¸å¿
æä¾æ¹æ³ç»å¤ç访é®ã使¯å¦æä¸ä¸ªç±»æ²¡ææä¾ç»å¤ç访é®çæ¹æ³ï¼é£ä¹è¿ä¸ªç±»ä¹æ²¡æä»ä¹æä¹äºã就好åå¦ææ²¡æç©ºè°é¥æ§å¨ï¼é£ä¹æä»¬å°±æ æ³ææ§ç©ºåå¶å·ï¼ç©ºè°æ¬èº«å°±æ²¡ææä¹äºï¼å½ç¶ç°å¨è¿æå¾å¤å
¶ä»æ¹æ³ ï¼è¿éåªæ¯ä¸ºäºä¸¾ä¾åï¼ã
```java
public class Student {
private int id;//id屿§ç§æå
private String name;//name屿§ç§æå
//è·åidçæ¹æ³
public int getId() {
return id;
}
//设置idçæ¹æ³
public void setId(int id) {
this.id = id;
}
//è·ånameçæ¹æ³
public String getName() {
return name;
}
//设置nameçæ¹æ³
public void setName(String name) {
this.name = name;
}
}
```
#### ç»§æ¿
ä¸åç±»åç对象ï¼ç¸äºä¹é´ç»å¸¸æä¸å®æ°éçå
±åç¹ãä¾å¦ï¼å°æåå¦ãå°çº¢åå¦ãå°æåå¦ï¼é½å
±äº«å¦ççç¹æ§ï¼ç级ãå¦å·çï¼ãåæ¶ï¼æ¯ä¸ä¸ªå¯¹è±¡è¿å®ä¹äºé¢å¤çç¹æ§ä½¿å¾ä»ä»¬ä¸ä¼ä¸åãä¾å¦å°æçæ°å¦æ¯è¾å¥½ï¼å°çº¢çæ§æ ¼æ¹äººåç±ï¼å°æçåæ°æ¯è¾å¤§ãç»§æ¿æ¯ä½¿ç¨å·²åå¨çç±»çå®ä¹ä½ä¸ºåºç¡å»ºç«æ°ç±»çææ¯ï¼æ°ç±»çå®ä¹å¯ä»¥å¢å æ°çæ°æ®ææ°çåè½ï¼ä¹å¯ä»¥ç¨ç¶ç±»çåè½ï¼ä½ä¸è½éæ©æ§å°ç»§æ¿ç¶ç±»ãéè¿ä½¿ç¨ç»§æ¿ï¼å¯ä»¥å¿«éå°å建æ°çç±»ï¼å¯ä»¥æé«ä»£ç çéç¨ï¼ç¨åºçå¯ç»´æ¤æ§ï¼èç大éå建æ°ç±»çæ¶é´ ï¼æé«æä»¬çå¼åæçã
**å
³äºç»§æ¿å¦ä¸ 3 ç¹è¯·è®°ä½ï¼**
1. åç±»æ¥æç¶ç±»å¯¹è±¡ææç屿§åæ¹æ³ï¼å
æ¬ç§æå±æ§åç§ææ¹æ³ï¼ï¼ä½æ¯ç¶ç±»ä¸çç§æå±æ§åæ¹æ³åç±»æ¯æ æ³è®¿é®ï¼**åªæ¯æ¥æ**ã
2. åç±»å¯ä»¥æ¥æèªå·±å±æ§åæ¹æ³ï¼å³åç±»å¯ä»¥å¯¹ç¶ç±»è¿è¡æ©å±ã
3. åç±»å¯ä»¥ç¨èªå·±çæ¹å¼å®ç°ç¶ç±»çæ¹æ³ãï¼ä»¥åä»ç»ï¼ã
#### 夿
夿ï¼é¡¾åæä¹ï¼è¡¨ç¤ºä¸ä¸ªå¯¹è±¡å
·æå¤ç§çç¶æï¼å
·ä½è¡¨ç°ä¸ºç¶ç±»çå¼ç¨æååç±»çå®ä¾ã
**夿çç¹ç¹:**
- 对象类ååå¼ç¨ç±»åä¹é´å
·æç»§æ¿ï¼ç±»ï¼/å®ç°ï¼æ¥å£ï¼çå
³ç³»ï¼
- å¼ç¨ç±»ååéååºçæ¹æ³è°ç¨çå°åºæ¯åªä¸ªç±»ä¸çæ¹æ³ï¼å¿
é¡»å¨ç¨åºè¿è¡æé´æè½ç¡®å®ï¼
- 夿ä¸è½è°ç¨âåªå¨åç±»åå¨ä½å¨ç¶ç±»ä¸åå¨âçæ¹æ³ï¼
- 妿åç±»éåäºç¶ç±»çæ¹æ³ï¼çæ£æ§è¡çæ¯åç±»éåçæ¹æ³ï¼å¦æå类没æéåç¶ç±»çæ¹æ³ï¼æ§è¡çæ¯ç¶ç±»çæ¹æ³ã
### âï¸æ¥å£åæ½è±¡ç±»æä»ä¹å
±åç¹ååºå«ï¼
#### æ¥å£åæ½è±¡ç±»çå
±åç¹
- **å®ä¾å**ï¼æ¥å£åæ½è±¡ç±»é½ä¸è½ç´æ¥å®ä¾åï¼åªè½è¢«å®ç°ï¼æ¥å£ï¼æç»§æ¿ï¼æ½è±¡ç±»ï¼åæè½å建å
·ä½ç对象ã
- **æ½è±¡æ¹æ³**ï¼æ¥å£åæ½è±¡ç±»é½å¯ä»¥å
嫿½è±¡æ¹æ³ãæ½è±¡æ¹æ³æ²¡ææ¹æ³ä½ï¼å¿
é¡»å¨åç±»æå®ç°ç±»ä¸å®ç°ã
#### æ¥å£åæ½è±¡ç±»çåºå«
- **设计ç®ç**ï¼æ¥å£ä¸»è¦ç¨äºå¯¹ç±»çè¡ä¸ºè¿è¡çº¦æï¼ä½ å®ç°äºæä¸ªæ¥å£å°±å
·æäºå¯¹åºçè¡ä¸ºãæ½è±¡ç±»ä¸»è¦ç¨äºä»£ç å¤ç¨ï¼å¼ºè°çæ¯æå±å
³ç³»ã
- **ç»§æ¿åå®ç°**ï¼ä¸ä¸ªç±»åªè½ç»§æ¿ä¸ä¸ªç±»ï¼å
æ¬æ½è±¡ç±»ï¼ï¼å 为 Java 䏿¯æå¤ç»§æ¿ãä½ä¸ä¸ªç±»å¯ä»¥å®ç°å¤ä¸ªæ¥å£ï¼ä¸ä¸ªæ¥å£ä¹å¯ä»¥ç»§æ¿å¤ä¸ªå
¶ä»æ¥å£ã
- **æååé**ï¼æ¥å£ä¸çæååéåªè½æ¯ `public static final` ç±»åçï¼ä¸è½è¢«ä¿®æ¹ä¸å¿
é¡»æåå§å¼ãæ½è±¡ç±»çæååéå¯ä»¥æä»»ä½ä¿®é¥°ç¬¦ï¼`private`, `protected`, `public`ï¼ï¼å¯ä»¥å¨åç±»ä¸è¢«éæ°å®ä¹æèµå¼ã
- **æ¹æ³**ï¼
- Java 8 ä¹åï¼æ¥å£ä¸çæ¹æ³é»è®¤æ¯ `public abstract` ï¼ä¹å°±æ¯åªè½ææ¹æ³å£°æãèª Java 8 èµ·ï¼å¯ä»¥å¨æ¥å£ä¸å®ä¹ `default`ï¼é»è®¤ï¼ æ¹æ³å `static` ï¼éæï¼æ¹æ³ã èª Java 9 èµ·ï¼æ¥å£å¯ä»¥å
å« `private` æ¹æ³ã
- æ½è±¡ç±»å¯ä»¥å
嫿½è±¡æ¹æ³åéæ½è±¡æ¹æ³ãæ½è±¡æ¹æ³æ²¡ææ¹æ³ä½ï¼å¿
é¡»å¨åç±»ä¸å®ç°ãéæ½è±¡æ¹æ³æå
·ä½å®ç°ï¼å¯ä»¥ç´æ¥å¨æ½è±¡ç±»ä¸ä½¿ç¨æå¨åç±»ä¸éåã
å¨ Java 8 å以ä¸çæ¬ä¸ï¼æ¥å£å¼å
¥äºæ°çæ¹æ³ç±»åï¼`default` æ¹æ³ã`static` æ¹æ³å `private` æ¹æ³ãè¿äºæ¹æ³è®©æ¥å£çä½¿ç¨æ´å çµæ´»ã
Java 8 å¼å
¥ç`default` æ¹æ³ç¨äºæä¾æ¥å£æ¹æ³çé»è®¤å®ç°ï¼å¯ä»¥å¨å®ç°ç±»ä¸è¢«è¦çãè¿æ ·å°±å¯ä»¥å¨ä¸ä¿®æ¹å®ç°ç±»çæ
åµä¸åç°ææ¥å£æ·»å æ°åè½ï¼ä»èå¢å¼ºæ¥å£çæ©å±æ§åååå
¼å®¹æ§ã
```java
public interface MyInterface {
default void defaultMethod() {
System.out.println("This is a default method.");
}
}
```
Java 8 å¼å
¥ç`static` æ¹æ³æ æ³å¨å®ç°ç±»ä¸è¢«è¦çï¼åªè½éè¿æ¥å£åç´æ¥è°ç¨ï¼ `MyInterface.staticMethod()`ï¼ï¼ç±»ä¼¼äºç±»ä¸çéææ¹æ³ã`static` æ¹æ³é常ç¨äºå®ä¹ä¸äºéç¨çã䏿¥å£ç¸å
³çå·¥å
·æ¹æ³ï¼ä¸è¬å¾å°ç¨ã
```java
public interface MyInterface {
static void staticMethod() {
System.out.println("This is a static method in the interface.");
}
}
```
Java 9 å
è®¸å¨æ¥å£ä¸ä½¿ç¨ `private` æ¹æ³ã`private`æ¹æ³å¯ä»¥ç¨äºå¨æ¥å£å
é¨å
±äº«ä»£ç ï¼ä¸å¯¹å¤æ´é²ã
```java
public interface MyInterface {
// default æ¹æ³
default void defaultMethod() {
commonMethod();
}
// static æ¹æ³
static void staticMethod() {
commonMethod();
}
// ç§æéææ¹æ³ï¼å¯ä»¥è¢« static å default æ¹æ³è°ç¨
private static void commonMethod() {
System.out.println("This is a private method used internally.");
}
// å®ä¾ç§ææ¹æ³ï¼åªè½è¢« default æ¹æ³è°ç¨ã
private void instanceCommonMethod() {
System.out.println("This is a private instance method used internally.");
}
}
```
### æ·±æ·è´åæµ
æ·è´åºå«äºè§£åï¼ä»ä¹æ¯å¼ç¨æ·è´ï¼
å
³äºæ·±æ·è´åæµ
æ·è´åºå«ï¼æè¿éå
ç»ç»è®ºï¼
- **æµ
æ·è´**ï¼æµ
æ·è´ä¼å¨å ä¸å建ä¸ä¸ªæ°ç对象ï¼åºå«äºå¼ç¨æ·è´çä¸ç¹ï¼ï¼ä¸è¿ï¼å¦æå对象å
é¨ç屿§æ¯å¼ç¨ç±»åçè¯ï¼æµ
æ·è´ä¼ç´æ¥å¤å¶å
é¨å¯¹è±¡çå¼ç¨å°åï¼ä¹å°±æ¯è¯´æ·è´å¯¹è±¡åå对象å
±ç¨åä¸ä¸ªå
é¨å¯¹è±¡ã
- **æ·±æ·è´**ï¼æ·±æ·è´ä¼å®å
¨å¤å¶æ´ä¸ªå¯¹è±¡ï¼å
æ¬è¿ä¸ªå¯¹è±¡æå
å«çå
é¨å¯¹è±¡ã
ä¸é¢çç»è®ºæ²¡æå®å
¨çè§£çè¯ä¹æ²¡å
³ç³»ï¼æä»¬æ¥çä¸ä¸ªå
·ä½çæ¡ä¾ï¼
#### æµ
æ·è´
æµ
æ·è´ç示ä¾ä»£ç å¦ä¸ï¼æä»¬è¿éå®ç°äº `Cloneable` æ¥å£ï¼å¹¶éåäº `clone()` æ¹æ³ã
`clone()` æ¹æ³çå®ç°å¾ç®åï¼ç´æ¥è°ç¨çæ¯ç¶ç±» `Object` ç `clone()` æ¹æ³ã
```java
public class Address implements Cloneable{
private String name;
// çç¥æé 彿°ãGetter&Setteræ¹æ³
@Override
public Address clone() {
try {
return (Address) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
public class Person implements Cloneable {
private Address address;
// çç¥æé 彿°ãGetter&Setteræ¹æ³
@Override
public Person clone() {
try {
Person person = (Person) super.clone();
return person;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
```
æµè¯ï¼
```java
Person person1 = new Person(new Address("æ¦æ±"));
Person person1Copy = person1.clone();
// true
System.out.println(person1.getAddress() == person1Copy.getAddress());
```
ä»è¾åºç»æå°±å¯ä»¥çåºï¼ `person1` çå
é对象å `person1` 使ç¨çä»ç¶æ¯åä¸ä¸ª `Address` 对象ã
#### æ·±æ·è´
è¿éæä»¬ç®å对 `Person` ç±»ç `clone()` æ¹æ³è¿è¡ä¿®æ¹ï¼è¿å¸¦çè¦æ `Person` 对象å
é¨ç `Address` 对象ä¸èµ·å¤å¶ã
```java
@Override
public Person clone() {
try {
Person person = (Person) super.clone();
person.setAddress(person.getAddress().clone());
return person;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
```
æµè¯ï¼
```java
Person person1 = new Person(new Address("æ¦æ±"));
Person person1Copy = person1.clone();
// false
System.out.println(person1.getAddress() == person1Copy.getAddress());
```
ä»è¾åºç»æå°±å¯ä»¥çåºï¼æ¾ç¶ `person1` çå
é对象å `person1` å
å«ç `Address` å¯¹è±¡å·²ç»æ¯ä¸åçäºã
**é£ä»ä¹æ¯å¼ç¨æ·è´å¢ï¼** ç®åæ¥è¯´ï¼å¼ç¨æ·è´å°±æ¯ä¸¤ä¸ªä¸åçå¼ç¨æååä¸ä¸ªå¯¹è±¡ã
æä¸é¨ç»äºä¸å¼ 徿¥æè¿°æµ
æ·è´ãæ·±æ·è´ãå¼ç¨æ·è´ï¼

## âï¸Object
### Object ç±»çå¸¸è§æ¹æ³æåªäºï¼
Object ç±»æ¯ä¸ä¸ªç¹æ®çç±»ï¼æ¯ææç±»çç¶ç±»ï¼ä¸»è¦æä¾äºä»¥ä¸ 11 ä¸ªæ¹æ³ï¼
```java
/**
* native æ¹æ³ï¼ç¨äºè¿åå½åè¿è¡æ¶å¯¹è±¡ç Class 对象ï¼ä½¿ç¨äº final å
³é®åä¿®é¥°ï¼æ
ä¸å
许åç±»éåã
*/
public final native Class> getClass()
/**
* native æ¹æ³ï¼ç¨äºè¿å对象çåå¸ç ï¼ä¸»è¦ä½¿ç¨å¨åå¸è¡¨ä¸ï¼æ¯å¦ JDK ä¸çHashMapã
*/
public native int hashCode()
/**
* ç¨äºæ¯è¾ 2 个对象çå
åå°åæ¯å¦ç¸çï¼String ç±»å¯¹è¯¥æ¹æ³è¿è¡äºéå以ç¨äºæ¯è¾å符串ç弿¯å¦ç¸çã
*/
public boolean equals(Object obj)
/**
* native æ¹æ³ï¼ç¨äºå建并è¿åå½å对象çä¸ä»½æ·è´ã
*/
protected native Object clone() throws CloneNotSupportedException
/**
* è¿åç±»çååå®ä¾çåå¸ç ç 16 è¿å¶çå符串ã建议 Object ææçåç±»é½éåè¿ä¸ªæ¹æ³ã
*/
public String toString()
/**
* native æ¹æ³ï¼å¹¶ä¸ä¸è½éåãå¤éä¸ä¸ªå¨æ¤å¯¹è±¡çè§å¨ä¸çå¾
ç线ç¨(çè§å¨ç¸å½äºå°±æ¯éçæ¦å¿µ)ã妿æå¤ä¸ªçº¿ç¨å¨çå¾
åªä¼ä»»æå¤éä¸ä¸ªã
*/
public final native void notify()
/**
* native æ¹æ³ï¼å¹¶ä¸ä¸è½éåãè· notify 䏿 ·ï¼å¯ä¸çåºå«å°±æ¯ä¼å¤é卿¤å¯¹è±¡çè§å¨ä¸çå¾
çææçº¿ç¨ï¼è䏿¯ä¸ä¸ªçº¿ç¨ã
*/
public final native void notifyAll()
/**
* nativeæ¹æ³ï¼å¹¶ä¸ä¸è½éåãæå线ç¨çæ§è¡ã注æï¼sleep æ¹æ³æ²¡æéæ¾éï¼è wait æ¹æ³éæ¾äºé ï¼timeout æ¯çå¾
æ¶é´ã
*/
public final native void wait(long timeout) throws InterruptedException
/**
* å¤äº nanos åæ°ï¼è¿ä¸ªåæ°è¡¨ç¤ºé¢å¤æ¶é´ï¼ä»¥çº³ç§ä¸ºåä½ï¼èå´æ¯ 0-999999ï¼ã æä»¥è¶
æ¶çæ¶é´è¿éè¦å ä¸ nanos 纳ç§ãã
*/
public final void wait(long timeout, int nanos) throws InterruptedException
/**
* è·ä¹åç2个waitæ¹æ³ä¸æ ·ï¼åªä¸è¿è¯¥æ¹æ³ä¸ç´çå¾
ï¼æ²¡æè¶
æ¶æ¶é´è¿ä¸ªæ¦å¿µ
*/
public final void wait() throws InterruptedException
/**
* å®ä¾è¢«åå¾åæ¶å¨åæ¶çæ¶å触åçæä½
*/
protected void finalize() throws Throwable { }
```
### == å equals() çåºå«
**`==`** 对äºåºæ¬ç±»ååå¼ç¨ç±»åçä½ç¨æææ¯ä¸åçï¼
- 对äºåºæ¬æ°æ®ç±»åæ¥è¯´ï¼`==` æ¯è¾çæ¯å¼ã
- 对äºå¼ç¨æ°æ®ç±»åæ¥è¯´ï¼`==` æ¯è¾çæ¯å¯¹è±¡çå
åå°åã
> å 为 Java åªæå¼ä¼ éï¼æä»¥ï¼å¯¹äº == æ¥è¯´ï¼ä¸ç®¡æ¯æ¯è¾åºæ¬æ°æ®ç±»åï¼è¿æ¯å¼ç¨æ°æ®ç±»åçåéï¼å
¶æ¬è´¨æ¯è¾ç齿¯å¼ï¼åªæ¯å¼ç¨ç±»ååéåç弿¯å¯¹è±¡çå°åã
**`equals()`** ä¸è½ç¨äºå¤æåºæ¬æ°æ®ç±»åçåéï¼åªè½ç¨æ¥å¤æä¸¤ä¸ªå¯¹è±¡æ¯å¦ç¸çã`equals()`æ¹æ³åå¨äº`Object`ç±»ä¸ï¼è`Object`ç±»æ¯ææç±»çç´æ¥æé´æ¥ç¶ç±»ï¼å æ¤ææçç±»é½æ`equals()`æ¹æ³ã
`Object` ç±» `equals()` æ¹æ³ï¼
```java
public boolean equals(Object obj) {
return (this == obj);
}
```
`equals()` æ¹æ³åå¨ä¸¤ç§ä½¿ç¨æ
åµï¼
- **类没æéå `equals()`æ¹æ³**ï¼éè¿`equals()`æ¯è¾è¯¥ç±»ç两个对象æ¶ï¼çä»·äºéè¿â==âæ¯è¾è¿ä¸¤ä¸ªå¯¹è±¡ï¼ä½¿ç¨çé»è®¤æ¯ `Object`ç±»`equals()`æ¹æ³ã
- **ç±»éåäº `equals()`æ¹æ³**ï¼ä¸è¬æä»¬é½éå `equals()`æ¹æ³æ¥æ¯è¾ä¸¤ä¸ªå¯¹è±¡ä¸ç屿§æ¯å¦ç¸çï¼è¥å®ä»¬ç屿§ç¸çï¼åè¿å true(å³ï¼è®¤ä¸ºè¿ä¸¤ä¸ªå¯¹è±¡ç¸ç)ã
举个ä¾åï¼è¿éåªæ¯ä¸ºäºä¸¾ä¾ãå®é
ä¸ï¼ä½ æç
§ä¸é¢è¿ç§åæ³çè¯ï¼å IDEA è¿ç§æ¯è¾æºè½ç IDE é½ä¼æç¤ºä½ å° `==` æ¢æ `equals()` ï¼ï¼
```java
String a = new String("ab"); // a 为ä¸ä¸ªå¼ç¨
String b = new String("ab"); // b为å¦ä¸ä¸ªå¼ç¨,对象çå
容䏿 ·
String aa = "ab"; // æ¾å¨å¸¸éæ± ä¸
String bb = "ab"; // ä»å¸¸éæ± ä¸æ¥æ¾
System.out.println(aa == bb);// true
System.out.println(a == b);// false
System.out.println(a.equals(b));// true
System.out.println(42 == 42.0);// true
```
`String` ä¸ç `equals` æ¹æ³æ¯è¢«éåè¿çï¼å 为 `Object` ç `equals` æ¹æ³æ¯æ¯è¾ç对象çå
åå°åï¼è `String` ç `equals` æ¹æ³æ¯è¾çæ¯å¯¹è±¡çå¼ã
å½å建 `String` ç±»åç对象æ¶ï¼èææºä¼å¨å¸¸éæ± ä¸æ¥æ¾ææ²¡æå·²ç»åå¨çå¼åè¦å建çå¼ç¸åç对象ï¼å¦ææå°±æå®èµç»å½åå¼ç¨ãå¦ææ²¡æå°±å¨å¸¸éæ± ä¸éæ°å建ä¸ä¸ª `String` 对象ã
`String`ç±»`equals()`æ¹æ³ï¼
```java
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
```
### hashCode() æä»ä¹ç¨ï¼
`hashCode()` çä½ç¨æ¯è·ååå¸ç ï¼`int` æ´æ°ï¼ï¼ä¹ç§°ä¸ºæ£åç ãè¿ä¸ªåå¸ç çä½ç¨æ¯ç¡®å®è¯¥å¯¹è±¡å¨åå¸è¡¨ä¸çç´¢å¼ä½ç½®ã

`hashCode()` å®ä¹å¨ JDK ç `Object` ç±»ä¸ï¼è¿å°±æå³ç Java ä¸çä»»ä½ç±»é½å
嫿 `hashCode()` 彿°ãå¦å¤éè¦æ³¨æçæ¯ï¼`Object` ç `hashCode()` æ¹æ³æ¯æ¬å°æ¹æ³ï¼ä¹å°±æ¯ç¨ C è¯è¨æ C++ å®ç°çã
> â ï¸ æ³¨æï¼è¯¥æ¹æ³å¨ **Oracle OpenJDK8** ä¸é»è®¤æ¯ "使ç¨çº¿ç¨å±é¨ç¶ææ¥å®ç° Marsaglia's xor-shift éæºæ°çæ", 并䏿¯ "å°å" æè
"å°å转æ¢èæ¥", ä¸å JDK/VM å¯è½ä¸åãå¨ **Oracle OpenJDK8** 䏿å
ç§çææ¹å¼ (å
¶ä¸ç¬¬äºç§æ¯è¿åå°å), éè¿æ·»å VM åæ°: -XX:hashCode=4 å¯ç¨ç¬¬äºç§ãåèæºç :
>
> - ï¼1127 è¡ï¼
> - ï¼537 è¡å¼å§ï¼
```java
public native int hashCode();
```
æ£å表åå¨çæ¯é®å¼å¯¹(key-value)ï¼å®çç¹ç¹æ¯ï¼**è½æ ¹æ®âé®âå¿«éçæ£ç´¢åºå¯¹åºçâå¼âãè¿å
¶ä¸å°±å©ç¨å°äºæ£åç ï¼ï¼å¯ä»¥å¿«éæ¾å°æéè¦ç对象ï¼**
### 为ä»ä¹è¦æ hashCodeï¼
æä»¬ä»¥â`HashSet` å¦ä½æ£æ¥éå¤â为ä¾åæ¥è¯´æä¸ºä»ä¹è¦æ `hashCode`ï¼
ä¸é¢è¿æ®µå
容æèªæç Java å¯è书ãHead First Javaã:
> å½ä½ æå¯¹è±¡å å
¥ `HashSet` æ¶ï¼`HashSet` ä¼å
计ç®å¯¹è±¡ç `hashCode` 弿¥å¤æå¯¹è±¡å å
¥çä½ç½®ï¼åæ¶ä¹ä¼ä¸å
¶ä»å·²ç»å å
¥ç对象ç `hashCode` å¼ä½æ¯è¾ï¼å¦ææ²¡æç¸ç¬¦ç `hashCode`ï¼`HashSet` ä¼å设对象没æéå¤åºç°ã使¯å¦æåç°æç¸å `hashCode` å¼ç对象ï¼è¿æ¶ä¼è°ç¨ `equals()` æ¹æ³æ¥æ£æ¥ `hashCode` ç¸çç对象æ¯å¦ççç¸åã妿䏤è
ç¸åï¼`HashSet` å°±ä¸ä¼è®©å
¶å å
¥æä½æåã妿ä¸åçè¯ï¼å°±ä¼éæ°æ£åå°å
¶ä»ä½ç½®ãè¿æ ·æä»¬å°±å¤§å¤§åå°äº `equals` çæ¬¡æ°ï¼ç¸åºå°±å¤§å¤§æé«äºæ§è¡é度ã
å
¶å®ï¼ `hashCode()` å `equals()`齿¯ç¨äºæ¯è¾ä¸¤ä¸ªå¯¹è±¡æ¯å¦ç¸çã
**é£ä¸ºä»ä¹ JDK è¿è¦åæ¶æä¾è¿ä¸¤ä¸ªæ¹æ³å¢ï¼**
è¿æ¯å 为å¨ä¸äºå®¹å¨ï¼æ¯å¦ `HashMap`ã`HashSet`ï¼ä¸ï¼æäº `hashCode()` ä¹åï¼å¤æå
ç´ æ¯å¦å¨å¯¹åºå®¹å¨ä¸çæç伿´é«ï¼åèæ·»å å
ç´ è¿`HashSet`çè¿ç¨ï¼ï¼
æä»¬å¨åé¢ä¹æå°äºæ·»å å
ç´ è¿`HashSet`çè¿ç¨ï¼å¦æ `HashSet` å¨å¯¹æ¯çæ¶åï¼åæ ·ç `hashCode` æå¤ä¸ªå¯¹è±¡ï¼å®ä¼ç»§ç»ä½¿ç¨ `equals()` æ¥å¤ææ¯å¦ççç¸åãä¹å°±æ¯è¯´ `hashCode` å¸®å©æä»¬å¤§å¤§ç¼©å°äºæ¥æ¾ææ¬ã
**é£ä¸ºä»ä¹ä¸åªæä¾ `hashCode()` æ¹æ³å¢ï¼**
è¿æ¯å 为两个对象ç`hashCode` å¼ç¸çå¹¶ä¸ä»£è¡¨ä¸¤ä¸ªå¯¹è±¡å°±ç¸çã
**é£ä¸ºä»ä¹ä¸¤ä¸ªå¯¹è±¡æç¸åç `hashCode` å¼ï¼å®ä»¬ä¹ä¸ä¸å®æ¯ç¸ççï¼**
å 为 `hashCode()` æä½¿ç¨çåå¸ç®æ³ä¹è®¸å好ä¼è®©å¤ä¸ªå¯¹è±¡ä¼ åç¸åçåå¸å¼ãè¶ç³ç³çåå¸ç®æ³è¶å®¹æç¢°æï¼ä½è¿ä¹ä¸æ°æ®å¼ååå¸çç¹æ§æå
³ï¼æè°åå¸ç¢°æä¹å°±æ¯æçæ¯ä¸åç对象å¾å°ç¸åç `hashCode` )ã
æ»ç»ä¸æ¥å°±æ¯ï¼
- å¦æä¸¤ä¸ªå¯¹è±¡ç`hashCode` å¼ç¸çï¼é£è¿ä¸¤ä¸ªå¯¹è±¡ä¸ä¸å®ç¸çï¼åå¸ç¢°æï¼ã
- å¦æä¸¤ä¸ªå¯¹è±¡ç`hashCode` å¼ç¸çå¹¶ä¸`equals()`æ¹æ³ä¹è¿å `true`ï¼æä»¬æè®¤ä¸ºè¿ä¸¤ä¸ªå¯¹è±¡ç¸çã
- å¦æä¸¤ä¸ªå¯¹è±¡ç`hashCode` å¼ä¸ç¸çï¼æä»¬å°±å¯ä»¥ç´æ¥è®¤ä¸ºè¿ä¸¤ä¸ªå¯¹è±¡ä¸ç¸çã
ç¸ä¿¡å¤§å®¶çäºæåé¢å¯¹ `hashCode()` å `equals()` çä»ç»ä¹åï¼ä¸é¢è¿ä¸ªé®é¢å·²ç»é¾ä¸åä½ ä»¬äºã
### 为ä»ä¹éå equals() æ¶å¿
é¡»éå hashCode() æ¹æ³ï¼
å 为两个ç¸çç对象ç `hashCode` å¼å¿
é¡»æ¯ç¸çãä¹å°±æ¯è¯´å¦æ `equals` æ¹æ³å¤æä¸¤ä¸ªå¯¹è±¡æ¯ç¸ççï¼é£è¿ä¸¤ä¸ªå¯¹è±¡ç `hashCode` å¼ä¹è¦ç¸çã
妿éå `equals()` æ¶æ²¡æéå `hashCode()` æ¹æ³çè¯å°±å¯è½ä¼å¯¼è´ `equals` æ¹æ³å¤ææ¯ç¸çç两个对象ï¼`hashCode` å¼å´ä¸ç¸çã
**æè**ï¼éå `equals()` æ¶æ²¡æéå `hashCode()` æ¹æ³çè¯ï¼ä½¿ç¨ `HashMap` å¯è½ä¼åºç°ä»ä¹é®é¢ã
**æ»ç»**ï¼
- `equals` æ¹æ³å¤æä¸¤ä¸ªå¯¹è±¡æ¯ç¸ççï¼é£è¿ä¸¤ä¸ªå¯¹è±¡ç `hashCode` å¼ä¹è¦ç¸çã
- 两个对象æç¸åç `hashCode` å¼ï¼ä»ä»¬ä¹ä¸ä¸å®æ¯ç¸ççï¼åå¸ç¢°æï¼ã
æ´å¤å
³äº `hashCode()` å `equals()` çå
容å¯ä»¥æ¥çï¼[Java hashCode() å equals()çè¥å¹²é®é¢è§£ç](https://www.cnblogs.com/skywang12345/p/3324958.html)
## String
### âï¸StringãStringBufferãStringBuilder çåºå«ï¼
**å¯åæ§**
`String` æ¯ä¸å¯åçï¼åé¢ä¼è¯¦ç»åæåå ï¼ã
`StringBuilder` ä¸ `StringBuffer` é½ç»§æ¿èª `AbstractStringBuilder` ç±»ï¼å¨ `AbstractStringBuilder` ä¸ä¹æ¯ä½¿ç¨å符æ°ç»ä¿åå符串ï¼ä¸è¿æ²¡æä½¿ç¨ `final` å `private` å
³é®åä¿®é¥°ï¼æå
³é®çæ¯è¿ä¸ª `AbstractStringBuilder` ç±»è¿æä¾äºå¾å¤ä¿®æ¹åç¬¦ä¸²çæ¹æ³æ¯å¦ `append` æ¹æ³ã
```java
abstract class AbstractStringBuilder implements Appendable, CharSequence {
char[] value;
public AbstractStringBuilder append(String str) {
if (str == null)
return appendNull();
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
//...
}
```
**线ç¨å®å
¨æ§**
`String` ä¸ç对象æ¯ä¸å¯åçï¼ä¹å°±å¯ä»¥ç解为常éï¼çº¿ç¨å®å
¨ã`AbstractStringBuilder` æ¯ `StringBuilder` ä¸ `StringBuffer` çå
Œ
±ç¶ç±»ï¼å®ä¹äºä¸äºå符串çåºæ¬æä½ï¼å¦ `expandCapacity`ã`append`ã`insert`ã`indexOf` çå
Œ
±æ¹æ³ã`StringBuffer` å¯¹æ¹æ³å äºåæ¥éæè
对è°ç¨çæ¹æ³å äºåæ¥éï¼æä»¥æ¯çº¿ç¨å®å
¨çã`StringBuilder` 并没æå¯¹æ¹æ³è¿è¡å 忥éï¼æä»¥æ¯é线ç¨å®å
¨çã
**æ§è½**
æ¯æ¬¡å¯¹ `String` ç±»åè¿è¡æ¹åçæ¶åï¼é½ä¼çæä¸ä¸ªæ°ç `String` 对象ï¼ç¶åå°æéæåæ°ç `String` 对象ã`StringBuffer` æ¯æ¬¡é½ä¼å¯¹ `StringBuffer` 对象æ¬èº«è¿è¡æä½ï¼è䏿¯çææ°ç对象并æ¹å对象å¼ç¨ãç¸åæ
åµä¸ä½¿ç¨ `StringBuilder` ç¸æ¯ä½¿ç¨ `StringBuffer` ä»
è½è·å¾ 10%~15% å·¦å³çæ§è½æåï¼ä½å´è¦åå¤çº¿ç¨ä¸å®å
¨çé£é©ã
**对äºä¸è
使ç¨çæ»ç»ï¼**
- æä½å°éçæ°æ®: éç¨ `String`
- åçº¿ç¨æä½å符串ç¼å²åºä¸æä½å¤§éæ°æ®: éç¨ `StringBuilder`
- å¤çº¿ç¨æä½å符串ç¼å²åºä¸æä½å¤§éæ°æ®: éç¨ `StringBuffer`
### âï¸String 为ä»ä¹æ¯ä¸å¯åç?
`String` ç±»ä¸ä½¿ç¨ `final` å
³é®å修饰å符æ°ç»æ¥ä¿åå符串ï¼~~æä»¥`String` 对象æ¯ä¸å¯åçã~~
```java
public final class String implements java.io.Serializable, Comparable, CharSequence {
private final char value[];
//...
}
```
> ð ä¿®æ£ï¼æä»¬ç¥é被 `final` å
³é®å修饰çç±»ä¸è½è¢«ç»§æ¿ï¼ä¿®é¥°çæ¹æ³ä¸è½è¢«éåï¼ä¿®é¥°çåéæ¯åºæ¬æ°æ®ç±»ååå¼ä¸è½æ¹åï¼ä¿®é¥°çå鿝å¼ç¨ç±»ååä¸è½åæåå
¶ä»å¯¹è±¡ãå æ¤ï¼`final` å
³é®åä¿®é¥°çæ°ç»ä¿ååç¬¦ä¸²å¹¶ä¸æ¯ `String` ä¸å¯åçæ ¹æ¬åå ï¼å 为è¿ä¸ªæ°ç»ä¿åçå符串æ¯å¯åçï¼`final` 修饰å¼ç¨ç±»ååéçæ
åµï¼ã
>
> `String` çæ£ä¸å¯åæä¸é¢å ç¹åå ï¼
>
> 1. ä¿ååç¬¦ä¸²çæ°ç»è¢« `final` 修饰ä¸ä¸ºç§æçï¼å¹¶ä¸`String` 类没ææä¾/æ´é²ä¿®æ¹è¿ä¸ªåç¬¦ä¸²çæ¹æ³ã
> 2. `String` 类被 `final` 修饰导è´å
¶ä¸è½è¢«ç»§æ¿ï¼è¿èé¿å
äºåç±»ç ´å `String` ä¸å¯åã
>
> ç¸å
³é
读ï¼[å¦ä½çè§£ String ç±»åå¼çä¸å¯åï¼ - ç¥ä¹æé®](https://www.zhihu.com/question/20618891/answer/114125846)
>
> è¡¥å
ï¼æ¥èª[issue 675](https://github.com/Snailclimb/JavaGuide/issues/675)ï¼ï¼å¨ Java 9 ä¹åï¼`String`ã`StringBuilder` ä¸ `StringBuffer` çå®ç°æ¹ç¨ `byte` æ°ç»åå¨å符串ã
>
> ```java
> public final class String implements java.io.Serializable,Comparable, CharSequence {
> // @Stable 注解表示åéæå¤è¢«ä¿®æ¹ä¸æ¬¡ï¼ç§°ä¸ºâ稳å®çâã
> @Stable
> private final byte[] value;
> }
>
> abstract class AbstractStringBuilder implements Appendable, CharSequence {
> byte[] value;
>
> }
> ```
>
> **Java 9 为ä½è¦å° `String` çåºå±å®ç°ç± `char[]` æ¹æäº `byte[]` ?**
>
> æ°çç String å
¶å®æ¯æä¸¤ä¸ªç¼ç æ¹æ¡ï¼Latin-1 å UTF-16ã妿å符串ä¸å
å«çæ±å没æè¶
è¿ Latin-1 å¯è¡¨ç¤ºèå´å
çå符ï¼é£å°±ä¼ä½¿ç¨ Latin-1 ä½ä¸ºç¼ç æ¹æ¡ãLatin-1 ç¼ç æ¹æ¡ä¸ï¼`byte` å ä¸ä¸ªåè(8 ä½)ï¼`char` å ç¨ 2 个åèï¼16ï¼ï¼`byte` ç¸è¾ `char` èçä¸åçå
å空é´ã
>
> JDK 宿¹å°±è¯´äºç»å¤§é¨åå符串对象åªå
å« Latin-1 å¯è¡¨ç¤ºçå符ã
>
> 
>
> 妿å符串ä¸å
å«çæ±åè¶
è¿ Latin-1 å¯è¡¨ç¤ºèå´å
çå符ï¼`byte` å `char` æå ç¨çç©ºé´æ¯ä¸æ ·çã
>
> è¿æ¯å®æ¹çä»ç»ï¼ ã
### âï¸åç¬¦ä¸²æ¼æ¥ç¨â+â è¿æ¯ StringBuilder?
Java è¯è¨æ¬èº«å¹¶ä¸æ¯æè¿ç®ç¬¦éè½½ï¼â+âåâ+=âæ¯ä¸é¨ä¸º String ç±»éè½½è¿çè¿ç®ç¬¦ï¼ä¹æ¯ Java ä¸ä»
æç两个éè½½è¿çè¿ç®ç¬¦ã
```java
String str1 = "he";
String str2 = "llo";
String str3 = "world";
String str4 = str1 + str2 + str3;
```
ä¸é¢ç代ç 对åºçåèç å¦ä¸ï¼

å¯ä»¥çåºï¼å符串对象éè¿â+âçåç¬¦ä¸²æ¼æ¥æ¹å¼ï¼å®é
䏿¯éè¿ `StringBuilder` è°ç¨ `append()` æ¹æ³å®ç°çï¼æ¼æ¥å®æä¹åè°ç¨ `toString()` å¾å°ä¸ä¸ª `String` 对象 ã
ä¸è¿ï¼å¨å¾ªç¯å
使ç¨â+âè¿è¡åç¬¦ä¸²çæ¼æ¥çè¯ï¼å卿¯è¾ææ¾ç缺é·ï¼**ç¼è¯å¨ä¸ä¼å建å个 `StringBuilder` 以å¤ç¨ï¼ä¼å¯¼è´å建è¿å¤ç `StringBuilder` 对象**ã
```java
String[] arr = {"he", "llo", "world"};
String s = "";
for (int i = 0; i < arr.length; i++) {
s += arr[i];
}
System.out.println(s);
```
`StringBuilder` 对象æ¯å¨å¾ªç¯å
é¨è¢«å建çï¼è¿æå³çæ¯å¾ªç¯ä¸æ¬¡å°±ä¼å建ä¸ä¸ª `StringBuilder` 对象ã

å¦æç´æ¥ä½¿ç¨ `StringBuilder` 对象è¿è¡åç¬¦ä¸²æ¼æ¥çè¯ï¼å°±ä¸ä¼åå¨è¿ä¸ªé®é¢äºã
```java
String[] arr = {"he", "llo", "world"};
StringBuilder s = new StringBuilder();
for (String value : arr) {
s.append(value);
}
System.out.println(s);
```

å¦æä½ ä½¿ç¨ IDEA çè¯ï¼IDEA èªå¸¦çä»£ç æ£æ¥æºå¶ä¹ä¼æç¤ºä½ ä¿®æ¹ä»£ç ã
å¨ JDK 9 ä¸ï¼å符串ç¸å â+âæ¹ä¸ºç¨å¨ææ¹æ³ `makeConcatWithConstants()` æ¥å®ç°ï¼éè¿æååé
空é´ä»èåå°äºé¨å临æ¶å¯¹è±¡çå建ãç¶èè¿ç§ä¼å主è¦é对ç®åçåç¬¦ä¸²æ¼æ¥ï¼å¦ï¼ `a+b+c` ã对äºå¾ªç¯ä¸çå¤§éæ¼æ¥æä½ï¼ä»ç¶ä¼éä¸ªå¨æåé
å
åï¼ç±»ä¼¼äºä¸¤ä¸ªä¸¤ä¸ª append çæ¦å¿µï¼ï¼å¹¶ä¸å¦æå¨ä½¿ç¨ StringBuilder æ¥è¿è¡æ¼æ¥æçé«ãè¿ä¸ªæ¹è¿æ¯ JDK9 ç [JEP 280](https://openjdk.org/jeps/280) æåºçï¼å
³äºè¿é¨åæ¹è¿ç详ç»ä»ç»ï¼æ¨èé
读è¿ç¯æç« ï¼è¿å¨æ èç¨ [StringBuilderï¼æ¥é温ä¸ä¸åç¬¦ä¸²æ¼æ¥å§](https://juejin.cn/post/7182872058743750715) 以ååè [issue#2442](https://github.com/Snailclimb/JavaGuide/issues/2442)ã
### String#equals() å Object#equals() æä½åºå«ï¼
`String` ä¸ç `equals` æ¹æ³æ¯è¢«éåè¿çï¼æ¯è¾çæ¯ String å符串ç弿¯å¦ç¸çã `Object` ç `equals` æ¹æ³æ¯æ¯è¾ç对象çå
åå°åã
### âï¸åç¬¦ä¸²å¸¸éæ± çä½ç¨äºè§£åï¼
**åç¬¦ä¸²å¸¸éæ± ** æ¯ JVM ä¸ºäºæåæ§è½ååå°å
åæ¶èé对å符串ï¼String ç±»ï¼ä¸é¨å¼è¾çä¸ååºåï¼ä¸»è¦ç®çæ¯ä¸ºäºé¿å
å符串çéå¤å建ã
```java
// å¨åç¬¦ä¸²å¸¸éæ± ä¸å建å符串对象 âabâ
// å°å符串对象 âabâ çå¼ç¨èµå¼ç» aa
String aa = "ab";
// ç´æ¥è¿ååç¬¦ä¸²å¸¸éæ± ä¸å符串对象 âabâï¼èµå¼ç»å¼ç¨ bb
String bb = "ab";
System.out.println(aa==bb); // true
```
æ´å¤å
³äºåç¬¦ä¸²å¸¸éæ± çä»ç»å¯ä»¥çä¸ä¸ [Java å
ååºå详解](https://javaguide.cn/java/jvm/memory-area.html) è¿ç¯æç« ã
### âï¸String s1 = new String("abc");è¿å¥è¯å建äºå 个å符串对象ï¼
å
è¯´çæ¡ï¼ä¼å建 1 æ 2 个å符串对象ã
1. åç¬¦ä¸²å¸¸éæ± ä¸ä¸åå¨ "abc"ï¼ä¼å建 2 个 å符串对象ãä¸ä¸ªå¨åç¬¦ä¸²å¸¸éæ± ä¸ï¼ç± `ldc` æä»¤è§¦åå建ãä¸ä¸ªå¨å ä¸ï¼ç± `new String()` å建ï¼å¹¶ä½¿ç¨å¸¸éæ± ä¸ç "abc" è¿è¡åå§åã
2. åç¬¦ä¸²å¸¸éæ± ä¸å·²åå¨ "abc"ï¼ä¼å建 1 个 å符串对象ã该对象å¨å ä¸ï¼ç± `new String()` å建ï¼å¹¶ä½¿ç¨å¸¸éæ± ä¸ç "abc" è¿è¡åå§åã
ä¸é¢å¼å§è¯¦ç»åæã
1ã妿åç¬¦ä¸²å¸¸éæ± ä¸ä¸åå¨å符串对象 âabcâï¼é£ä¹å®é¦å
ä¼å¨åç¬¦ä¸²å¸¸éæ± ä¸å建å符串对象 "abc"ï¼ç¶åå¨å å
åä¸åå建å
¶ä¸ä¸ä¸ªå符串对象 "abc"ã
示ä¾ä»£ç ï¼JDK 1.8ï¼ï¼
```java
String s1 = new String("abc");
```
对åºçåèç ï¼
```java
// å¨å å
åä¸åé
ä¸ä¸ªå°æªåå§åç String 对象ã
// #2 æ¯å¸¸éæ± ä¸çä¸ä¸ªç¬¦å·å¼ç¨ï¼æå java/lang/String ç±»ã
// å¨ç±»å è½½çè§£æé¶æ®µï¼è¿ä¸ªç¬¦å·å¼ç¨ä¼è¢«è§£ææç´æ¥å¼ç¨ï¼å³æåå®é
ç java/lang/String ç±»ã
0 new #2
// å¤å¶æ é¡¶ç String 对象å¼ç¨ï¼ä¸ºåç»çæé 彿°è°ç¨ååå¤ã
// æ¤æ¶æä½æ°æ ä¸æä¸¤ä¸ªç¸åç对象å¼ç¨ï¼ä¸ä¸ªç¨äºä¼ éç»æé 彿°ï¼å¦ä¸ä¸ªç¨äºä¿æå¯¹æ°å¯¹è±¡çå¼ç¨ï¼åç»å°å
¶åå¨å°å±é¨åé表ã
3 dup
// JVM å
æ£æ¥åç¬¦ä¸²å¸¸éæ± 䏿¯å¦åå¨ "abc"ã
// 妿叏鿱 ä¸å·²åå¨ "abc"ï¼åç´æ¥è¿å该å符串çå¼ç¨ï¼
// 妿叏鿱 ä¸ä¸åå¨ "abc"ï¼å JVM ä¼å¨å¸¸éæ± ä¸å建该å符串åé¢éå¹¶è¿åå®çå¼ç¨ã
// è¿ä¸ªå¼ç¨è¢«åå
¥æä½æ°æ ï¼ç¨ä½æé 彿°çåæ°ã
4 ldc #3
// è°ç¨æé æ¹æ³ï¼ä½¿ç¨ä»å¸¸éæ± ä¸å è½½ç "abc" åå§åå ä¸ç String 对象
// æ°ç String 对象å°å
å«ä¸å¸¸éæ± ä¸ç "abc" ç¸åçå
容ï¼ä½å®æ¯ä¸ä¸ªç¬ç«ç对象ï¼åå¨äºå ä¸ã
6 invokespecial #4 : (Ljava/lang/String;)V>
// å°å ä¸ç String 对象å¼ç¨åå¨å°å±é¨åé表
9 astore_1
// è¿åï¼ç»ææ¹æ³
10 return
```
`ldc (load constant)` æä»¤çç¡®æ¯ä»å¸¸éæ± ä¸å è½½åç§ç±»åç常éï¼å
æ¬å符串常éãæ´æ°å¸¸éãæµ®ç¹æ°å¸¸éï¼çè³ç±»å¼ç¨çã对äºå符串常éï¼`ldc` æä»¤çè¡ä¸ºå¦ä¸ï¼
1. **ä»å¸¸éæ± å è½½å符串**ï¼`ldc` é¦å
æ£æ¥åç¬¦ä¸²å¸¸éæ± 䏿¯å¦å·²ç»æå
容ç¸åçå符串对象ã
2. **å¤ç¨å·²æå符串对象**ï¼å¦æåç¬¦ä¸²å¸¸éæ± ä¸å·²ç»åå¨å
容ç¸åçå符串对象ï¼`ldc` ä¼å°è¯¥å¯¹è±¡çå¼ç¨å è½½å°æä½æ°æ ä¸ã
3. **没æåå建æ°å¯¹è±¡å¹¶å å
¥å¸¸éæ± **ï¼å¦æåç¬¦ä¸²å¸¸éæ± 䏿²¡æç¸åå
容çå符串对象ï¼JVM ä¼å¨å¸¸éæ± ä¸å建ä¸ä¸ªæ°çå符串对象ï¼å¹¶å°å
¶å¼ç¨å è½½å°æä½æ°æ ä¸ã
2ã妿åç¬¦ä¸²å¸¸éæ± ä¸å·²åå¨å符串对象âabcâï¼ååªä¼å¨å ä¸å建 1 个å符串对象âabcâã
示ä¾ä»£ç ï¼JDK 1.8ï¼ï¼
```java
// åç¬¦ä¸²å¸¸éæ± ä¸å·²åå¨å符串对象âabcâ
String s1 = "abc";
// ä¸é¢è¿æ®µä»£ç åªä¼å¨å ä¸å建 1 个å符串对象âabcâ
String s2 = new String("abc");
```
对åºçåèç ï¼
```java
0 ldc #2
2 astore_1
3 new #3
6 dup
7 ldc #2
9 invokespecial #4 : (Ljava/lang/String;)V>
12 astore_2
13 return
```
è¿éå°±ä¸å¯¹ä¸é¢çåèç è¿è¡è¯¦ç»æ³¨éäºï¼7 è¿ä¸ªä½ç½®ç `ldc` å½ä»¤ä¸ä¼å¨å ä¸å建æ°çå符串对象âabcâï¼è¿æ¯å 为 0 è¿ä¸ªä½ç½®å·²ç»æ§è¡äºä¸æ¬¡ `ldc` å½ä»¤ï¼å·²ç»å¨å ä¸å建è¿ä¸æ¬¡å符串对象âabcâäºã7 è¿ä¸ªä½ç½®æ§è¡ `ldc` å½ä»¤ä¼ç´æ¥è¿ååç¬¦ä¸²å¸¸éæ± ä¸å符串对象âabcâ对åºçå¼ç¨ã
### String#intern æ¹æ³æä»ä¹ä½ç¨?
`String.intern()` æ¯ä¸ä¸ª `native` (æ¬å°) æ¹æ³ï¼ç¨æ¥å¤çåç¬¦ä¸²å¸¸éæ± ä¸çå符串对象å¼ç¨ãå®ç工使µç¨å¯ä»¥æ¦æ¬ä¸ºä»¥ä¸ä¸¤ç§æ
åµï¼
1. **叏鿱 ä¸å·²æç¸åå
容çå符串对象**ï¼å¦æåç¬¦ä¸²å¸¸éæ± ä¸å·²ç»æä¸ä¸ªä¸è°ç¨ `intern()` æ¹æ³çå符串å
容ç¸åç `String` 对象ï¼`intern()` æ¹æ³ä¼ç´æ¥è¿å叏鿱 ä¸è¯¥å¯¹è±¡çå¼ç¨ã
2. **叏鿱 䏿²¡æç¸åå
容çå符串对象**ï¼å¦æåç¬¦ä¸²å¸¸éæ± ä¸è¿æ²¡æä¸ä¸ªä¸è°ç¨ `intern()` æ¹æ³çå符串å
容ç¸åç对象ï¼`intern()` æ¹æ³ä¼å°å½åå符串对象çå¼ç¨æ·»å å°åç¬¦ä¸²å¸¸éæ± ä¸ï¼å¹¶è¿å该å¼ç¨ã
æ»ç»ï¼
- `intern()` æ¹æ³ç主è¦ä½ç¨æ¯ç¡®ä¿å符串å¼ç¨å¨å¸¸éæ± ä¸çå¯ä¸æ§ã
- å½è°ç¨ `intern()` æ¶ï¼å¦æå¸¸éæ± ä¸å·²ç»åå¨ç¸åå
容çå符串ï¼åè¿å叏鿱 ä¸å·²æå¯¹è±¡çå¼ç¨ï¼å¦åï¼å°è¯¥å符串添å å°å¸¸éæ± å¹¶è¿åå
¶å¼ç¨ã
示ä¾ä»£ç ï¼JDK 1.8ï¼ :
```java
// s1 æååç¬¦ä¸²å¸¸éæ± ä¸ç "Java" 对象
String s1 = "Java";
// s2 乿ååç¬¦ä¸²å¸¸éæ± ä¸ç "Java" 对象ï¼å s1 æ¯åä¸ä¸ªå¯¹è±¡
String s2 = s1.intern();
// å¨å ä¸å建ä¸ä¸ªæ°ç "Java" 对象ï¼s3 æåå®
String s3 = new String("Java");
// s4 æååç¬¦ä¸²å¸¸éæ± ä¸ç "Java" 对象ï¼å s1 æ¯åä¸ä¸ªå¯¹è±¡
String s4 = s3.intern();
// s1 å s2 æåçæ¯åä¸ä¸ªå¸¸éæ± ä¸ç对象
System.out.println(s1 == s2); // true
// s3 æåå ä¸ç对象ï¼s4 æå叏鿱 ä¸çå¯¹è±¡ï¼æä»¥ä¸å
System.out.println(s3 == s4); // false
// s1 å s4 齿å叏鿱 ä¸çåä¸ä¸ªå¯¹è±¡
System.out.println(s1 == s4); // true
```
### String ç±»åçåéå常éåâ+âè¿ç®æ¶åçäºä»ä¹ï¼
å
æ¥çå符串ä¸å `final` å
³é®åæ¼æ¥çæ
åµï¼JDK1.8ï¼ï¼
```java
String str1 = "str";
String str2 = "ing";
String str3 = "str" + "ing";
String str4 = str1 + str2;
String str5 = "string";
System.out.println(str3 == str4);//false
System.out.println(str3 == str5);//true
System.out.println(str4 == str5);//false
```
> **注æ**ï¼æ¯è¾ String å符串ç弿¯å¦ç¸çï¼å¯ä»¥ä½¿ç¨ `equals()` æ¹æ³ã `String` ä¸ç `equals` æ¹æ³æ¯è¢«éåè¿çã `Object` ç `equals` æ¹æ³æ¯æ¯è¾ç对象çå
åå°åï¼è `String` ç `equals` æ¹æ³æ¯è¾çæ¯å符串ç弿¯å¦ç¸çãå¦æä½ ä½¿ç¨ `==` æ¯è¾ä¸¤ä¸ªå符串æ¯å¦ç¸ççè¯ï¼IDEA è¿æ¯æç¤ºä½ ä½¿ç¨ `equals()` æ¹æ³æ¿æ¢ã

**对äºç¼è¯æå¯ä»¥ç¡®å®å¼çå符串ï¼ä¹å°±æ¯å¸¸éå符串 ï¼jvm ä¼å°å
¶åå
¥åç¬¦ä¸²å¸¸éæ± ãå¹¶ä¸ï¼åç¬¦ä¸²å¸¸éæ¼æ¥å¾å°çå符串常éå¨ç¼è¯é¶æ®µå°±å·²ç»è¢«åæ¾åç¬¦ä¸²å¸¸éæ± ï¼è¿ä¸ªå¾çäºç¼è¯å¨çä¼åã**
å¨ç¼è¯è¿ç¨ä¸ï¼Javac ç¼è¯å¨ï¼ä¸æä¸ç»ç§°ä¸ºç¼è¯å¨ï¼ä¼è¿è¡ä¸ä¸ªå«å **常éæå (Constant Folding)** ç代ç ä¼åããæ·±å
¥çè§£ Java èææºã䏿¯ä¹æä»ç»å°ï¼

常éæå 伿叏é表达å¼ç弿±åºæ¥ä½ä¸ºå¸¸éåµå¨æç»çæç代ç ä¸ï¼è¿æ¯ Javac ç¼è¯å¨ä¼å¯¹æºä»£ç åçæå°éä¼åæªæ½ä¹ä¸(代ç ä¼åå ä¹é½å¨å³æ¶ç¼è¯å¨ä¸è¿è¡)ã
å¯¹äº `String str3 = "str" + "ing";` ç¼è¯å¨ä¼ç»ä½ ä¼åæ `String str3 = "string";` ã
并䏿¯ææç常éé½ä¼è¿è¡æå ï¼åªæç¼è¯å¨å¨ç¨åºç¼è¯æå°±å¯ä»¥ç¡®å®å¼ç常éæå¯ä»¥ï¼
- åºæ¬æ°æ®ç±»å( `byte`ã`boolean`ã`short`ã`char`ã`int`ã`float`ã`long`ã`double`)以åå符串常éã
- `final` 修饰çåºæ¬æ°æ®ç±»ååå符串åé
- å符串éè¿ â+âæ¼æ¥å¾å°çå符串ãåºæ¬æ°æ®ç±»åä¹é´ç®æ°è¿ç®ï¼å åä¹é¤ï¼ãåºæ¬æ°æ®ç±»åçä½è¿ç®ï¼<<ã\>>ã\>>> ï¼
**å¼ç¨çå¼å¨ç¨åºç¼è¯ææ¯æ æ³ç¡®å®çï¼ç¼è¯å¨æ æ³å¯¹å
¶è¿è¡ä¼åã**
对象å¼ç¨åâ+âçåç¬¦ä¸²æ¼æ¥æ¹å¼ï¼å®é
䏿¯éè¿ `StringBuilder` è°ç¨ `append()` æ¹æ³å®ç°çï¼æ¼æ¥å®æä¹åè°ç¨ `toString()` å¾å°ä¸ä¸ª `String` 对象 ã
```java
String str4 = new StringBuilder().append(str1).append(str2).toString();
```
æä»¬å¨å¹³æ¶å代ç çæ¶åï¼å°½éé¿å
å¤ä¸ªåç¬¦ä¸²å¯¹è±¡æ¼æ¥ï¼å ä¸ºè¿æ ·ä¼éæ°å建对象ã妿éè¦æ¹åå符串çè¯ï¼å¯ä»¥ä½¿ç¨ `StringBuilder` æè
`StringBuffer`ã
ä¸è¿ï¼åç¬¦ä¸²ä½¿ç¨ `final` å
³é®å声æä¹åï¼å¯ä»¥è®©ç¼è¯å¨å½å叏鿥å¤çã
示ä¾ä»£ç ï¼
```java
final String str1 = "str";
final String str2 = "ing";
// ä¸é¢ä¸¤ä¸ªè¡¨è¾¾å¼å
¶å®æ¯çä»·ç
String c = "str" + "ing";// 叏鿱 ä¸ç对象
String d = str1 + str2; // 叏鿱 ä¸ç对象
System.out.println(c == d);// true
```
被 `final` å
³é®å修饰ä¹åç `String` ä¼è¢«ç¼è¯å¨å½å叏鿥å¤çï¼ç¼è¯å¨å¨ç¨åºç¼è¯æå°±å¯ä»¥ç¡®å®å®çå¼ï¼å
¶ææå°±ç¸å½äºè®¿é®å¸¸éã
妿 ï¼ç¼è¯å¨å¨è¿è¡æ¶æè½ç¥éå
¶ç¡®åå¼çè¯ï¼å°±æ æ³å¯¹å
¶ä¼åã
示ä¾ä»£ç ï¼`str2` å¨è¿è¡æ¶æè½ç¡®å®å
¶å¼ï¼ï¼
```java
final String str1 = "str";
final String str2 = getStr();
String c = "str" + "ing";// 叏鿱 ä¸ç对象
String d = str1 + str2; // å¨å ä¸åå»ºçæ°ç对象
System.out.println(c == d);// false
public static String getStr() {
return "ing";
}
```
## å¼å¸¸
**Java å¼å¸¸ç±»å±æ¬¡ç»æå¾æ¦è§**ï¼

### Exception å Error æä»ä¹åºå«ï¼
å¨ Java ä¸ï¼ææçå¼å¸¸é½æä¸ä¸ªå
±åçç¥å
`java.lang` å
ä¸ç `Throwable` ç±»ã`Throwable` ç±»æä¸¤ä¸ªéè¦çåç±»:
- **`Exception`** :ç¨åºæ¬èº«å¯ä»¥å¤ççå¼å¸¸ï¼å¯ä»¥éè¿ `catch` æ¥è¿è¡æè·ã`Exception` åå¯ä»¥å为 Checked Exception (忣æ¥å¼å¸¸ï¼å¿
é¡»å¤ç) å Unchecked Exception (ä¸åæ£æ¥å¼å¸¸ï¼å¯ä»¥ä¸å¤ç)ã
- **`Error`**ï¼`Error` å±äºç¨åºæ æ³å¤ççé误 ï¼~~æä»¬æ²¡åæ³éè¿ `catch` æ¥è¿è¡æè·~~ä¸å»ºè®®éè¿`catch`æè· ãä¾å¦ Java èææºè¿è¡é误ï¼`Virtual MachineError`ï¼ãèææºå
åä¸å¤é误(`OutOfMemoryError`)ãç±»å®ä¹é误ï¼`NoClassDefFoundError`ï¼ç ãè¿äºå¼å¸¸åçæ¶ï¼Java èææºï¼JVMï¼ä¸è¬ä¼éæ©çº¿ç¨ç»æ¢ã
### âï¸Checked Exception å Unchecked Exception æä»ä¹åºå«ï¼
**Checked Exception** å³ åæ£æ¥å¼å¸¸ ï¼Java 代ç å¨ç¼è¯è¿ç¨ä¸ï¼å¦æåæ£æ¥å¼å¸¸æ²¡æè¢« `catch`æè
`throws` å
³é®åå¤ççè¯ï¼å°±æ²¡åæ³éè¿ç¼è¯ã
æ¯å¦ä¸é¢è¿æ®µ IO æä½ç代ç ï¼

é¤äº`RuntimeException`åå
¶å类以å¤ï¼å
¶ä»ç`Exception`ç±»åå
¶åç±»é½å±äºåæ£æ¥å¼å¸¸ ã常è§ç忣æ¥å¼å¸¸æï¼IO ç¸å
³çå¼å¸¸ã`ClassNotFoundException`ã`SQLException`...ã
**Unchecked Exception** å³ **ä¸åæ£æ¥å¼å¸¸** ï¼Java 代ç å¨ç¼è¯è¿ç¨ä¸ ï¼æä»¬å³ä½¿ä¸å¤çä¸åæ£æ¥å¼å¸¸ä¹å¯ä»¥æ£å¸¸éè¿ç¼è¯ã
`RuntimeException` åå
¶åç±»é½ç»ç§°ä¸ºé忣æ¥å¼å¸¸ï¼å¸¸è§çæï¼å»ºè®®è®°ä¸æ¥ï¼æ¥å¸¸å¼åä¸ä¼ç»å¸¸ç¨å°ï¼ï¼
- `NullPointerException`(空æéé误)
- `IllegalArgumentException`(åæ°é误æ¯å¦æ¹æ³å
¥åç±»åé误)
- `NumberFormatException`ï¼å符串转æ¢ä¸ºæ°åæ ¼å¼é误ï¼`IllegalArgumentException`çåç±»ï¼
- `ArrayIndexOutOfBoundsException`ï¼æ°ç»è¶çé误ï¼
- `ClassCastException`ï¼ç±»å转æ¢é误ï¼
- `ArithmeticException`ï¼ç®æ¯é误ï¼
- `SecurityException` ï¼å®å
¨é误æ¯å¦æéä¸å¤ï¼
- `UnsupportedOperationException`(䏿¯æçæä½é误æ¯å¦éå¤å建åä¸ç¨æ·)
- â¦â¦

### ä½ æ´å¾åäºä½¿ç¨ Checked Exception è¿æ¯ Unchecked Exceptionï¼
é»è®¤ä½¿ç¨ Unchecked Exceptionï¼åªå¨å¿
è¦æ¶æç¨ Checked Exceptionã
æä»¬å¯ä»¥æ Unchecked Exceptionï¼æ¯å¦ `NullPointerException`ï¼ç使¯ä»£ç Bugã对å¾
Bugï¼æå¥½çæ¹å¼æ¯è®©å®æ´é²åºæ¥ç¶åå»ä¿®å¤ä»£ç ï¼è䏿¯ç¨ `try-catch` 廿©çå®ã
ä¸è¬æ¥è¯´ï¼åªå¨ä¸ç§æ
åµä¸ä½¿ç¨ Checked Exceptionï¼å½è¿ä¸ªå¼å¸¸æ¯ä¸å¡é»è¾çä¸é¨åï¼å¹¶ä¸è°ç¨æ¹å¿
é¡»å¤ç宿¶ãæ¯å¦è¯´ï¼ä¸ä¸ªä½é¢ä¸è¶³å¼å¸¸ãè¿ä¸æ¯ bugï¼èæ¯ä¸ä¸ªæ£å¸¸çä¸å¡åæ¯ï¼æéè¦ç¨ Checked Exception æ¥å¼ºå¶è°ç¨è
å»å¤çè¿ç§æ
åµï¼æ¯å¦æç¤ºç¨æ·å»å
å¼ãè¿æ ·å°±è½å¨ä¿è¯å
³é®ä¸å¡é»è¾å®æ´æ§çåæ¶ï¼è®©ä»£ç å°½å¯è½ä¿æç®æ´ã
### try-catch-finally å¦ä½ä½¿ç¨ï¼
- `try`åï¼ç¨äºæè·å¼å¸¸ãå
¶å坿¥é¶ä¸ªæå¤ä¸ª `catch` åï¼å¦ææ²¡æ `catch` åï¼åå¿
é¡»è·ä¸ä¸ª `finally` åã
- `catch`åï¼ç¨äºå¤ç try æè·å°çå¼å¸¸ã
- `finally` åï¼æ 论æ¯å¦æè·æå¤çå¼å¸¸ï¼`finally` åéçè¯å¥é½ä¼è¢«æ§è¡ãå½å¨ `try` åæ `catch` åä¸éå° `return` è¯å¥æ¶ï¼`finally` è¯å¥åå°å¨æ¹æ³è¿åä¹å被æ§è¡ã
代ç 示ä¾ï¼
```java
try {
System.out.println("Try to do something");
throw new RuntimeException("RuntimeException");
} catch (Exception e) {
System.out.println("Catch Exception -> " + e.getMessage());
} finally {
System.out.println("Finally");
}
```
è¾åºï¼
```plain
Try to do something
Catch Exception -> RuntimeException
Finally
```
**注æï¼ä¸è¦å¨ finally è¯å¥åä¸ä½¿ç¨ return!** å½ try è¯å¥å finally è¯å¥ä¸é½æ return è¯å¥æ¶ï¼try è¯å¥åä¸ç return è¯å¥ä¼è¢«å¿½ç¥ãè¿æ¯å 为 try è¯å¥ä¸ç return è¿åå¼ä¼å
被æåå¨ä¸ä¸ªæ¬å°åéä¸ï¼å½æ§è¡å° finally è¯å¥ä¸ç return ä¹åï¼è¿ä¸ªæ¬å°åéçå¼å°±åä¸ºäº finally è¯å¥ä¸ç return è¿åå¼ã
代ç 示ä¾ï¼
```java
public static void main(String[] args) {
System.out.println(f(2));
}
public static int f(int value) {
try {
return value * value;
} finally {
if (value == 2) {
return 0;
}
}
}
```
è¾åºï¼
```plain
0
```
### finally ä¸ç代ç ä¸å®ä¼æ§è¡åï¼
ä¸ä¸å®çï¼å¨æäºæ
åµä¸ï¼finally ä¸ç代ç ä¸ä¼è¢«æ§è¡ã
å°±æ¯å¦è¯´ finally ä¹åèææºè¢«ç»æ¢è¿è¡çè¯ï¼finally ä¸ç代ç å°±ä¸ä¼è¢«æ§è¡ã
```java
try {
System.out.println("Try to do something");
throw new RuntimeException("RuntimeException");
} catch (Exception e) {
System.out.println("Catch Exception -> " + e.getMessage());
// ç»æ¢å½åæ£å¨è¿è¡çJavaèææº
System.exit(1);
} finally {
System.out.println("Finally");
}
```
è¾åºï¼
```plain
Try to do something
Catch Exception -> RuntimeException
```
å¦å¤ï¼å¨ä»¥ä¸ 2 ç§ç¹æ®æ
åµä¸ï¼`finally` åç代ç ä¹ä¸ä¼è¢«æ§è¡ï¼
1. ç¨åºæå¨ççº¿ç¨æ»äº¡ã
2. å
³é CPUã
ç¸å
³ issueï¼ã
ð§ð» è¿é¶ä¸ä¸ï¼ä»åèç è§åº¦åæ`try catch finally`è¿ä¸ªè¯æ³ç³èåçå®ç°åçã
### âï¸å¼å¸¸ä½¿ç¨æåªäºéè¦æ³¨æçå°æ¹ï¼
- ä¸è¦æå¼å¸¸å®ä¹ä¸ºéæåéï¼å ä¸ºè¿æ ·ä¼å¯¼è´å¼å¸¸æ ä¿¡æ¯éä¹±ãæ¯æ¬¡æå¨æåºå¼å¸¸ï¼æä»¬é½éè¦æå¨ new ä¸ä¸ªå¼å¸¸å¯¹è±¡æåºã
- æåºçå¼å¸¸ä¿¡æ¯ä¸å®è¦ææä¹ã
- 建议æåºæ´å å
·ä½çå¼å¸¸ï¼æ¯å¦å符串转æ¢ä¸ºæ°åæ ¼å¼éè¯¯çæ¶ååºè¯¥æåº`NumberFormatException`è䏿¯å
¶ç¶ç±»`IllegalArgumentException`ã
- é¿å
éå¤è®°å½æ¥å¿ï¼å¦æå¨æè·å¼å¸¸çå°æ¹å·²ç»è®°å½äºè¶³å¤çä¿¡æ¯ï¼å
æ¬å¼å¸¸ç±»åãé误信æ¯åå æ è·è¸ªçï¼ï¼é£ä¹å¨ä¸å¡ä»£ç ä¸å次æåºè¿ä¸ªå¼å¸¸æ¶ï¼å°±ä¸åºè¯¥å次记å½ç¸åçé误信æ¯ãéå¤è®°å½æ¥å¿ä¼ä½¿å¾æ¥å¿æä»¶è¨èï¼å¹¶ä¸å¯è½ä¼æ©çé®é¢çå®é
åå ï¼ä½¿å¾é®é¢æ´é¾ä»¥è¿½è¸ªåè§£å³ã
- â¦â¦
## æ³å
### ä»ä¹æ¯æ³åï¼æä»ä¹ä½ç¨ï¼
**Java æ³åï¼Genericsï¼** æ¯ JDK 5 ä¸å¼å
¥çä¸ä¸ªæ°ç¹æ§ãä½¿ç¨æ³ååæ°ï¼å¯ä»¥å¢å¼ºä»£ç çå¯è¯»æ§ä»¥åç¨³å®æ§ã
ç¼è¯å¨å¯ä»¥å¯¹æ³ååæ°è¿è¡æ£æµï¼å¹¶ä¸éè¿æ³ååæ°å¯ä»¥æå®ä¼ å
¥ç对象类åãæ¯å¦ `ArrayList persons = new ArrayList()` è¿è¡ä»£ç å°±ææäºè¯¥ `ArrayList` 对象åªè½ä¼ å
¥ `Person` 对象ï¼å¦æä¼ å
¥å
¶ä»ç±»åçå¯¹è±¡å°±ä¼æ¥éã
```java
ArrayList extends AbstractList
```
å¹¶ä¸ï¼åç `List` è¿åç±»åæ¯ `Object` ï¼éè¦æå¨è½¬æ¢ç±»åæè½ä½¿ç¨ï¼ä½¿ç¨æ³ååç¼è¯å¨èªå¨è½¬æ¢ã
### æ³åçä½¿ç¨æ¹å¼æåªå ç§ï¼
æ³åä¸è¬æä¸ç§ä½¿ç¨æ¹å¼:**æ³åç±»**ã**æ³åæ¥å£**ã**æ³åæ¹æ³**ã
**1.æ³åç±»**ï¼
```java
//æ¤å¤Tå¯ä»¥é便åä¸ºä»»ææ è¯ï¼å¸¸è§çå¦TãEãKãVçå½¢å¼ç忰叏ç¨äºè¡¨ç¤ºæ³å
//å¨å®ä¾åæ³åç±»æ¶ï¼å¿
é¡»æå®Tçå
·ä½ç±»å
public class Generic{
private T key;
public Generic(T key) {
this.key = key;
}
public T getKey(){
return key;
}
}
```
å¦ä½å®ä¾åæ³åç±»ï¼
```java
Generic genericInteger = new Generic(123456);
```
**2.æ³åæ¥å£**ï¼
```java
public interface Generator {
public T method();
}
```
å®ç°æ³åæ¥å£ï¼ä¸æå®ç±»åï¼
```java
class GeneratorImpl implements Generator{
@Override
public T method() {
return null;
}
}
```
å®ç°æ³åæ¥å£ï¼æå®ç±»åï¼
```java
class GeneratorImpl implements Generator {
@Override
public String method() {
return "hello";
}
}
```
**3.æ³åæ¹æ³**ï¼
```java
public static < E > void printArray( E[] inputArray )
{
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
```
使ç¨ï¼
```java
// å建ä¸åç±»åæ°ç»ï¼Integer, Double å Character
Integer[] intArray = { 1, 2, 3 };
String[] stringArray = { "Hello", "World" };
printArray( intArray );
printArray( stringArray );
```
> 注æ: `public static < E > void printArray( E[] inputArray )` ä¸è¬è¢«ç§°ä¸ºéææ³åæ¹æ³;å¨ java 䏿³ååªæ¯ä¸ä¸ªå ä½ç¬¦ï¼å¿
é¡»å¨ä¼ éç±»ååæè½ä½¿ç¨ãç±»å¨å®ä¾åæ¶æè½çæ£çä¼ éç±»ååæ°ï¼ç±äºéææ¹æ³çå è½½å
äºç±»çå®ä¾åï¼ä¹å°±æ¯è¯´ç±»ä¸çæ³åè¿æ²¡æä¼ éçæ£çç±»ååæ°ï¼éæçæ¹æ³çå 载就已ç»å®æäºï¼æä»¥éææ³åæ¹æ³æ¯æ²¡æåæ³ä½¿ç¨ç±»ä¸å£°æçæ³åçãåªè½ä½¿ç¨èªå·±å£°æç ``
### 项ç®ä¸åªéç¨å°äºæ³åï¼
- èªå®ä¹æ¥å£éç¨è¿åç»æ `CommonResult` éè¿åæ° `T` 坿 ¹æ®å
·ä½çè¿åç±»å卿æå®ç»æçæ°æ®ç±»å
- å®ä¹ `Excel` å¤çç±» `ExcelUtil` ç¨äºå¨ææå® `Excel` 导åºçæ°æ®ç±»å
- æå»ºéåå·¥å
·ç±»ï¼åè `Collections` ä¸ç `sort`, `binarySearch` æ¹æ³ï¼ã
- â¦â¦
## âï¸åå°
å
³äºåå°ç详ç»è§£è¯»ï¼è¯·çè¿ç¯æç« [Java åå°æºå¶è¯¦è§£](https://javaguide.cn/java/basis/reflection.html) ã
### ä»ä¹æ¯åå°ï¼
ç®åæ¥è¯´ï¼Java åå° (Reflection) æ¯ä¸ç§**å¨ç¨åºè¿è¡æ¶ï¼å¨æå°è·åç±»çä¿¡æ¯å¹¶æä½ç±»æå¯¹è±¡ï¼æ¹æ³ã屿§ï¼çè½å**ã
é常æ
åµä¸ï¼æä»¬åç代ç å¨ç¼è¯æ¶ç±»å就已ç»ç¡®å®äºï¼è¦è°ç¨åªä¸ªæ¹æ³ã访é®åªä¸ªåæ®µé½æ¯æç¡®çãä½åå°å
许æä»¬å¨**è¿è¡æ¶**æå»æ¢ç¥ä¸ä¸ªç±»æåªäºæ¹æ³ãåªäºå±æ§ãå®çæé 彿°æ¯ææ ·çï¼çè³å¯ä»¥å¨æå°å建对象ãè°ç¨æ¹æ³æä¿®æ¹å±æ§ï¼åªæè¿äºæ¹æ³æå±æ§æ¯ç§æçã
æ£æ¯è¿ç§å¨è¿è¡æ¶âåè§èªèº«âå¹¶è¿è¡æä½çè½åï¼ä½¿å¾åå°æä¸ºè®¸å¤**éç¨æ¡æ¶ååºçåºç³**ãå®è®©ä»£ç æ´å çµæ´»ï¼è½å¤å¤çå¨ç¼è¯æ¶æªç¥çç±»åã
### åå°æä»ä¹ä¼ç¼ºç¹ï¼
**ä¼ç¹ï¼**
1. **çµæ´»æ§å卿æ§**ï¼åå°å
许ç¨åºå¨è¿è¡æ¶å¨æå°å 载类ãå建对象ãè°ç¨æ¹æ³å访é®å段ãè¿æ ·å¯ä»¥æ ¹æ®å®é
éæ±ï¼å¦é
ç½®æä»¶ãç¨æ·è¾å
¥ã注解çï¼å¨æå°éåºåæ©å±ç¨åºçè¡ä¸ºï¼æ¾èæé«äºç³»ç»ççµæ´»æ§åéåºæ§ã
2. **æ¡æ¶å¼åçåºç¡**ï¼è®¸å¤ç°ä»£ Java æ¡æ¶ï¼å¦ SpringãHibernateãMyBatisï¼é½å¤§é使ç¨åå°æ¥å®ç°ä¾èµæ³¨å
¥ï¼DIï¼ãé¢ååé¢ç¼ç¨ï¼AOPï¼ã对象å
³ç³»æ å°ï¼ORMï¼ã注解å¤ççæ ¸å¿åè½ãåå°æ¯å®ç°è¿äºâéæ³âåè½ä¸å¯æç¼ºçåºç¡å·¥å
·ã
3. **è§£è¦ååéç¨æ§**ï¼éè¿åå°ï¼å¯ä»¥ç¼åæ´éç¨ãå¯éç¨åé«åº¦è§£è¦ç代ç ï¼é使¨¡åä¹é´çä¾èµãä¾å¦ï¼å¯ä»¥éè¿åå°å®ç°éç¨ç对象æ·è´ãåºååãBean å·¥å
·çã
**缺ç¹ï¼**
1. **æ§è½å¼é**ï¼åå°æä½é常æ¯ç´æ¥ä»£ç è°ç¨è¦æ
¢ãå 为æ¶åå°å¨æç±»åè§£æãæ¹æ³æ¥æ¾ä»¥å JIT ç¼è¯å¨çä¼ååéçå ç´ ãä¸è¿ï¼å¯¹äºå¤§å¤æ°æ¡æ¶åºæ¯ï¼è¿ç§æ§è½æèé常æ¯å¯ä»¥æ¥åçï¼æè
æ¡æ¶æ¬èº«ä¼åä¸äºç¼åä¼åã
2. **å®å
¨æ§é®é¢**ï¼åå°å¯ä»¥ç»è¿ Java è¯è¨çè®¿é®æ§å¶æºå¶ï¼å¦è®¿é® `private` åæ®µåæ¹æ³ï¼ï¼ç ´åäºå°è£
æ§ï¼å¯è½å¯¼è´æ°æ®æ³é²æç¨åºè¢«æ¶æç¯¡æ¹ãæ¤å¤ï¼è¿å¯ä»¥ç»è¿æ³åæ£æ¥ï¼å¸¦æ¥ç±»åå®å
¨éæ£ã
3. **代ç å¯è¯»æ§åç»´æ¤æ§**ï¼è¿åº¦ä½¿ç¨åå°ä¼ä½¿ä»£ç åå¾å¤æãé¾ä»¥çè§£åè°è¯ãé误é常å¨è¿è¡æ¶æä¼æ´é²ï¼ä¸åç¼è¯æéè¯¯é£æ ·å®¹æåç°ã
ç¸å
³é
读ï¼[Java Reflection: Why is it so slow?](https://stackoverflow.com/questions/1392351/java-reflection-why-is-it-so-slow) ã
### åå°çåºç¨åºæ¯ï¼
æä»¬å¹³æ¶åä¸å¡ä»£ç å¯è½å¾å°ç´æ¥è· Java çåå°ï¼Reflectionï¼æäº¤éãä½ä½ å¯è½æ²¡æè¯å°ï¼ä½ 天天é½å¨äº«ååå°å¸¦æ¥ç便å©ï¼**å¾å¤æµè¡çæ¡æ¶ï¼æ¯å¦ Spring/Spring BootãMyBatis çï¼åºå±é½å¤§éè¿ç¨äºåå°æºå¶**ï¼è¿æè®©å®ä»¬è½å¤é£ä¹çµæ´»å强大ã
ä¸é¢ç®åå举å 个æåºæ¯çåºæ¯å¸®å©å¤§å®¶çè§£ã
**1.ä¾èµæ³¨å
¥ä¸æ§å¶å转ï¼IoCï¼**
以 Spring/Spring Boot 为代表ç IoC æ¡æ¶ï¼ä¼å¨å¯å¨æ¶æ«æå¸¦æç¹å®æ³¨è§£ï¼å¦ `@Component`, `@Service`, `@Repository`, `@Controller`ï¼çç±»ï¼å©ç¨åå°å®ä¾å对象ï¼Beanï¼ï¼å¹¶éè¿åå°æ³¨å
¥ä¾èµï¼å¦ `@Autowired`ãæé 卿³¨å
¥çï¼ã
**2.注解å¤ç**
注解æ¬èº«åªæ¯ä¸ªâæ è®°âï¼å¾æäººå»è¯»è¿ä¸ªæ è®°æç¥éè¦åä»ä¹ãåå°å°±æ¯é£ä¸ªâ读åå¨âãæ¡æ¶éè¿åå°æ£æ¥ç±»ãæ¹æ³ãåæ®µä¸ææ²¡æç¹å®ç注解ï¼ç¶åæ ¹æ®æ³¨è§£ä¿¡æ¯æ§è¡ç¸åºçé»è¾ãæ¯å¦ï¼çå° `@Value`ï¼å°±ç¨åå°è¯»å注解å
容ï¼å»é
ç½®æä»¶æ¾å¯¹åºçå¼ï¼åç¨åå°æå¼è®¾ç½®ç»å段ã
**3.卿代çä¸ AOP**
æ³å¨è°ç¨æä¸ªæ¹æ³ååèªå¨å ç¹æï¼æ¯å¦ææ¥å¿ãå¼äºå¡ãåæéæ£æ¥ï¼ï¼AOPï¼é¢ååé¢ç¼ç¨ï¼å°±æ¯å¹²è¿ä¸ªçï¼èå¨æä»£çæ¯å®ç° AOP çå¸¸ç¨ææ®µãJDK èªå¸¦ç卿代çï¼Proxy å InvocationHandlerï¼å°±ç¦»ä¸å¼åå°ã代ç对象å¨å
é¨è°ç¨çå®å¯¹è±¡çæ¹æ³æ¶ï¼å°±æ¯éè¿åå°ç `Method.invoke` æ¥å®æçã
```java
public class DebugInvocationHandler implements InvocationHandler {
private final Object target; // çå®å¯¹è±¡
public DebugInvocationHandler(Object target) { this.target = target; }
// proxy: 代ç对象, method: 被è°ç¨çæ¹æ³, args: æ¹æ³åæ°
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("åé¢é»è¾ï¼è°ç¨æ¹æ³ " + method.getName() + " ä¹å");
// éè¿åå°è°ç¨çå®å¯¹è±¡çååæ¹æ³
Object result = method.invoke(target, args);
System.out.println("åé¢é»è¾ï¼è°ç¨æ¹æ³ " + method.getName() + " ä¹å");
return result;
}
}
```
**4.对象å
³ç³»æ å°ï¼ORMï¼**
å MyBatisãHibernate è¿ç§æ¡æ¶ï¼è½å¸®ä½ ææ°æ®åºæ¥åºæ¥çä¸è¡è¡æ°æ®ï¼èªå¨åæä¸ä¸ªä¸ª Java 对象ã宿¯æä¹ç¥éæ°æ®åºå段对åºåªä¸ª Java 屿§çï¼è¿æ¯é åå°ãå®éè¿åå°è·å Java ç±»ç屿§å表ï¼ç¶åææ¥è¯¢ç»ææååæé
置对åºèµ·æ¥ï¼åç¨åå°è°ç¨ setter æç´æ¥ä¿®æ¹å段å¼ãåè¿æ¥ï¼ä¿åå¯¹è±¡å°æ°æ®åºæ¶ï¼ä¹æ¯ç¨åå°è¯»å屿§å¼æ¥æ¼ SQLã
## 代ç
å
³äº Java 代çç详ç»ä»ç»ï¼å¯ä»¥ççç¬è
åç [Java ä»£çæ¨¡å¼è¯¦è§£](https://javaguide.cn/java/basis/proxy.html "Java ä»£çæ¨¡å¼è¯¦è§£")è¿ç¯æç« ã
### å¦ä½å®ç°å¨æä»£çï¼
å¨æä»£çæ¯ä¸ç§é常强大ç设计模å¼ï¼å®å
许æä»¬å¨**ä¸ä¿®æ¹æºä»£ç **çæ
åµä¸ï¼å¯¹ä¸ä¸ªç±»æå¯¹è±¡çæ¹æ³è¿è¡**åè½å¢å¼ºï¼Enhancementï¼**ã
å¨ Java ä¸ï¼å®ç°å¨æä»£çæä¸»æµçæ¹å¼æä¸¤ç§ï¼**JDK 卿代ç** å **CGLIB 卿代ç**ã
**第ä¸ç§ï¼JDK 卿代ç**
Java 宿¹æä¾çï¼å
¶æ ¸å¿è¦æ±æ¯ç®æ ç±»å¿
é¡»å®ç°ä¸ä¸ªæå¤ä¸ªæ¥å£ãJDK 卿代çå¨è¿è¡æ¶ï¼ä¼å©ç¨ `Proxy.newProxyInstance()` æ¹æ³ï¼å¨æå°å建ä¸ä¸ªå®ç°äºè¿äºæ¥å£ç代çç±»çå®ä¾ãè¿ä¸ªä»£çç±»å¨å
åä¸çæï¼ä½ çä¸å°å®ç `.java` æ `.class` æä»¶ã
å½ä½ è°ç¨ä»£ç对象çä»»ä½ä¸ä¸ªæ¹æ³æ¶ï¼è¿ä¸ªè°ç¨é½ä¼è¢«è½¬å尿们æä¾çä¸ä¸ª `InvocationHandler` æ¥å£ç `invoke` æ¹æ³ä¸ãå¨ `invoke` æ¹æ³éï¼æä»¬å°±å¯ä»¥å¨è°ç¨åå§æ¹æ³ï¼ç®æ æ¹æ³ï¼ä¹åæä¹åï¼å å
¥æä»¬èªå·±çå¢å¼ºé»è¾ã
**第äºç§ï¼CGLIB 卿代ç**
CGLIB æ¯ä¸ä¸ªç¬¬ä¸æ¹ç代ç çæåºãå®çåçä¸ JDK å®å
¨ä¸åï¼å®ä¸è¦æ±è¢«ä»£ççç±»å®ç°æ¥å£ãå®å¨è¿è¡æ¶ï¼å¨æçæç®æ ç±»çåç±»ä½ä¸ºä»£çç±»ï¼éè¿ ASM åèç æä½ææ¯ï¼ãç¶åï¼å®ä¼éåç¶ç±»ï¼ä¹å°±æ¯è¢«ä»£çç±»ï¼ä¸ææé `final`ã`private` å `static` çæ¹æ³ã
å½ä½ è°ç¨ä»£ç对象çä»»ä½ä¸ä¸ªæ¹æ³æ¶ï¼è¿ä¸ªè°ç¨ä¼è¢« CGLIB ç `MethodInterceptor` æ¥å£ç `intercept` æ¹æ³æ¦æªãå `InvocationHandler` ç `invoke` æ¹æ³ä¸æ ·ï¼æä»¬å¯ä»¥å¨ `intercept` æ¹æ³éï¼å¨è°ç¨åå§çç¶ç±»æ¹æ³ä¹åæä¹åï¼å å
¥æä»¬çå¢å¼ºé»è¾ã
### éæä»£çå卿代çæä»ä¹åºå«ï¼
éæä»£çå卿代ççæ ¸å¿å·®å¼å¨äº **代çå
³ç³»çç¡®å®æ¶æºãå®ç°çµæ´»æ§åç»´æ¤ææ¬** ã
| 对æ¯ç»´åº¦ | éæä»£ç (Static Proxy) | 卿代ç (Dynamic Proxy) |
| ---------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 代çå
³ç³»ç¡®å®æ¶æº | ç¼è¯æï¼ç¼è¯åçæåºå®ç `.class` åèç æä»¶ï¼ | è¿è¡æ¶ï¼å¨æçæä»£çç±»åèç å¹¶å è½½å° JVMï¼ |
| å®ç°æ¹å¼ | æå¨ç¼å代çç±»ï¼éä¸ç®æ ç±»å®ç°å䏿¥å£ï¼ä¸å¯¹ä¸ç»å® | æ éæå¨ç¼å代çç±»ï¼éè¿ `Handler`/`Interceptor` å°è£
å¢å¼ºé»è¾ï¼ä¸å¯¹å¤å¤ç¨ |
| æ¥å£ä¾èµ | å¿
é¡»å®ç°æ¥å£ï¼ä»£çç±»ä¸ç®æ ç±»éµå¾ªå䏿¥å£è§èï¼ | æ¯æä»£çæ¥å£æç´æ¥ä»£çå®ç°ç±» |
| 代ç éä¸ç»´æ¤æ§ | 代ç é大ï¼ç®æ ç±»è¶å¤ï¼ä»£çç±»è¶å¤ï¼ï¼ç»´æ¤ææ¬é«ï¼æ¥å£æ°å¢æ¹æ³æ¶ï¼ç®æ ç±»ä¸ä»£çç±»éåæ¥ä¿®æ¹ | 代ç éæå°ï¼éç¨å¢å¼ºé»è¾å¯å¤ç¨ï¼ï¼ç»´æ¤æ§å¥½ï¼ä¸æ¥å£è§£è¦ï¼æ¥å£åæ´ä¸å½±å代çé»è¾ |
| æ ¸å¿ä¼å¿ | å®ç°ç®åãé»è¾ç´è§ï¼æ é¢å¤æ¡æ¶ä¾èµ | çµæ´»æ§å¼ºãå¤ç¨æ§é«ï¼éä½éå¤ç¼ç ï¼éé
å¤æåºæ¯ |
| å
¸ååºç¨åºæ¯ | ç®åçè£
饰卿¨¡å¼ãå°éåºå®ç±»çå¢å¼ºéæ± | Spring AOPãRPC æ¡æ¶ï¼å¦ Dubboï¼ãORM æ¡æ¶ |
### âï¸JDK 卿代çå CGLIB 卿代çæä»ä¹åºå«ï¼
1. JDK å¨æä»£çæ¯å®æ¹çï¼å®è¦æ±è¢«ä»£ççç±»å¿
é¡»å®ç°æ¥å£ãå®çåçæ¯å¨æçæä¸ä¸ªæ¥å£çå®ç°ç±»æ¥ä½ä¸ºä»£çãCGLIB æ¯ç¬¬ä¸æ¹çï¼å®ä¸éè¦æ¥å£ãå®çåçæ¯å¨æçæä¸ä¸ªè¢«ä»£çç±»çåç±»æ¥ä½ä¸ºä»£çãä½ä¹æ£å 为æ¯ç»§æ¿ï¼æä»¥å®ä¸è½ä»£ç `final` çç±»ï¼è¢«ä»£ççæ¹æ³ä¹ä¸è½æ¯ `final` æ `private` ã
2. å°±äºè
çæçæ¥è¯´ï¼å¤§é¨åæ
åµé½æ¯ JDK å¨æä»£çæ´ä¼ç§ï¼éç JDK çæ¬çå级ï¼è¿ä¸ªä¼å¿æ´å ææ¾ã
### âï¸ä»ç»ä¸ä¸å¨æä»£ç卿¡æ¶ä¸çå®é
åºç¨åºæ¯
卿代çæå
¸åçåºç¨åºæ¯å°±æ¯**Spring AOP**ã
AOP(Aspect-Oriented Programming:é¢ååé¢ç¼ç¨)è½å¤å°é£äºä¸ä¸å¡æ å
³ï¼å´ä¸ºä¸å¡æ¨¡åæå
±åè°ç¨çé»è¾æè´£ä»»ï¼ä¾å¦äºå¡å¤çãæ¥å¿ç®¡çãæéæ§å¶çï¼å°è£
èµ·æ¥ï¼ä¾¿äºåå°ç³»ç»çéå¤ä»£ç ï¼é使¨¡åé´çè¦å度ï¼å¹¶æå©äºæªæ¥ç坿屿§åå¯ç»´æ¤æ§ã
Spring AOP å°±æ¯åºäºå¨æä»£ççï¼å¦æè¦ä»£çç对象ï¼å®ç°äºæä¸ªæ¥å£ï¼é£ä¹ Spring AOP ä¼ä½¿ç¨ **JDK Proxy**ï¼å»å建代ç对象ï¼èå¯¹äºæ²¡æå®ç°æ¥å£ç对象ï¼å°±æ æ³ä½¿ç¨ JDK Proxy å»è¿è¡ä»£çäºï¼è¿æ¶å Spring AOP ä¼ä½¿ç¨ **Cglib** çæä¸ä¸ªè¢«ä»£ç对象çåç±»æ¥ä½ä¸ºä»£çï¼å¦ä¸å¾æç¤ºï¼

## 注解
### ä½è°æ³¨è§£ï¼
`Annotation` ï¼æ³¨è§£ï¼ æ¯ Java5 å¼å§å¼å
¥çæ°ç¹æ§ï¼å¯ä»¥ç使¯ä¸ç§ç¹æ®ç注éï¼ä¸»è¦ç¨äºä¿®é¥°ç±»ãæ¹æ³æè
åéï¼æä¾æäºä¿¡æ¯ä¾ç¨åºå¨ç¼è¯æè
è¿è¡æ¶ä½¿ç¨ã
注解æ¬è´¨æ¯ä¸ä¸ªç»§æ¿äº`Annotation` çç¹æ®æ¥å£ï¼
```java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
public interface Override extends Annotation{
}
```
JDK æä¾äºå¾å¤å
ç½®çæ³¨è§£ï¼æ¯å¦ `@Override`ã`@Deprecated`ï¼ï¼åæ¶ï¼æä»¬è¿å¯ä»¥èªå®ä¹æ³¨è§£ã
### 注解çè§£ææ¹æ³æåªå ç§ï¼
æ³¨è§£åªæè¢«è§£æä¹åæä¼çæï¼å¸¸è§çè§£ææ¹æ³æä¸¤ç§ï¼
- **ç¼è¯æç´æ¥æ«æ**ï¼ç¼è¯å¨å¨ç¼è¯ Java 代ç çæ¶åæ«æå¯¹åºç注解并å¤çï¼æ¯å¦æä¸ªæ¹æ³ä½¿ç¨`@Override` 注解ï¼ç¼è¯å¨å¨ç¼è¯çæ¶å就伿£æµå½åçæ¹æ³æ¯å¦éåäºç¶ç±»å¯¹åºçæ¹æ³ã
- **è¿è¡æéè¿åå°å¤ç**ï¼åæ¡æ¶ä¸èªå¸¦ç注解(æ¯å¦ Spring æ¡æ¶ç `@Value`ã`@Component`)齿¯éè¿åå°æ¥è¿è¡å¤ççã
## âï¸SPI
å
³äº SPI ç详ç»è§£è¯»ï¼è¯·çè¿ç¯æç« [Java SPI æºå¶è¯¦è§£](https://javaguide.cn/java/basis/spi.html) ã
### ä½è° SPI?
SPI å³ Service Provider Interface ï¼å颿æå°±æ¯ï¼âæå¡æä¾è
çæ¥å£âï¼æççè§£æ¯ï¼ä¸é¨æä¾ç»æå¡æä¾è
æè
æ©å±æ¡æ¶åè½çå¼åè
å»ä½¿ç¨çä¸ä¸ªæ¥å£ã
SPI 尿塿¥å£åå
·ä½çæå¡å®ç°åç¦»å¼æ¥ï¼å°æå¡è°ç¨æ¹åæå¡å®ç°è
è§£è¦ï¼è½å¤æåç¨åºçæ©å±æ§ãå¯ç»´æ¤æ§ãä¿®æ¹æè
æ¿æ¢æå¡å®ç°å¹¶ä¸éè¦ä¿®æ¹è°ç¨æ¹ã
å¾å¤æ¡æ¶é½ä½¿ç¨äº Java ç SPI æºå¶ï¼æ¯å¦ï¼Spring æ¡æ¶ãæ°æ®åºå 载驱å¨ãæ¥å¿æ¥å£ã以å Dubbo çæ©å±å®ç°ççã
### SPI å API æä»ä¹åºå«ï¼
**é£ SPI å API æå¥åºå«ï¼**
è¯´å° SPI å°±ä¸å¾ä¸è¯´ä¸ä¸ APIï¼Application Programming Interfaceï¼ äºï¼ä»å¹¿ä¹ä¸æ¥è¯´å®ä»¬é½å±äºæ¥å£ï¼èä¸å¾å®¹ææ··æ·ãä¸é¢å
ç¨ä¸å¼ å¾è¯´æä¸ä¸ï¼

ä¸è¬æ¨¡åä¹é´é½æ¯éè¿æ¥å£è¿è¡é讯ï¼å æ¤æä»¬å¨æå¡è°ç¨æ¹åæå¡å®ç°æ¹ï¼ä¹ç§°æå¡æä¾è
ï¼ä¹é´å¼å
¥ä¸ä¸ªâæ¥å£âã
- å½å®ç°æ¹æä¾äºæ¥å£åå®ç°ï¼æä»¬å¯ä»¥éè¿è°ç¨å®ç°æ¹çæ¥å£ä»èæ¥æå®ç°æ¹ç»æä»¬æä¾çè½åï¼è¿å°±æ¯ **API**ãè¿ç§æ
åµä¸ï¼æ¥å£åå®ç°é½æ¯æ¾å¨å®ç°æ¹çå
ä¸ãè°ç¨æ¹éè¿æ¥å£è°ç¨å®ç°æ¹çåè½ï¼èä¸éè¦å
³å¿å
·ä½çå®ç°ç»èã
- 彿¥å£åå¨äºè°ç¨æ¹è¿è¾¹æ¶ï¼è¿å°±æ¯ **SPI** ãç±æ¥å£è°ç¨æ¹ç¡®å®æ¥å£è§åï¼ç¶åç±ä¸åçååæ ¹æ®è¿ä¸ªè§å对è¿ä¸ªæ¥å£è¿è¡å®ç°ï¼ä»èæä¾æå¡ã
举个éä¿ææçä¾åï¼å
¬å¸ H æ¯ä¸å®¶ç§æå
¬å¸ï¼æ°è®¾è®¡äºä¸æ¬¾è¯çï¼ç¶åç°å¨éè¦é产äºï¼èå¸é¢ä¸æå¥½å å®¶è¯çå¶é ä¸å
¬å¸ï¼è¿ä¸ªæ¶åï¼åªè¦ H å
¬å¸æå®å¥½äºè¿è¯ççäº§çæ åï¼å®ä¹å¥½äºæ¥å£æ åï¼ï¼é£ä¹è¿äºåä½çè¯çå
¬å¸ï¼æå¡æä¾è
ï¼å°±æç
§æ å交ä»èªå®¶ç¹è²çè¯çï¼æä¾ä¸åæ¹æ¡çå®ç°ï¼ä½æ¯ç»åºæ¥çç»ææ¯ä¸æ ·çï¼ã
### SPI çä¼ç¼ºç¹ï¼
éè¿ SPI æºå¶è½å¤å¤§å¤§å°æé«æ¥å£è®¾è®¡ççµæ´»æ§ï¼ä½æ¯ SPI æºå¶ä¹åå¨ä¸äºç¼ºç¹ï¼æ¯å¦ï¼
- éè¦éåå è½½ææçå®ç°ç±»ï¼ä¸è½åå°æéå è½½ï¼è¿æ ·æçè¿æ¯ç¸å¯¹è¾ä½çã
- å½å¤ä¸ª `ServiceLoader` åæ¶ `load` æ¶ï¼ä¼æå¹¶åé®é¢ã
## âï¸åºåååååºåå
å
³äºåºåååååºååç详ç»è§£è¯»ï¼è¯·çè¿ç¯æç« [Java åºåå详解](https://javaguide.cn/java/basis/serialization.html) ï¼é颿¶åå°çç¥è¯ç¹åé¢è¯é¢æ´å
¨é¢ã
### ä»ä¹æ¯åºåå?ä»ä¹æ¯ååºåå?
妿æä»¬éè¦æä¹
å Java 对象æ¯å¦å° Java 对象ä¿å卿件ä¸ï¼æè
å¨ç½ç»ä¼ è¾ Java 对象ï¼è¿äºåºæ¯é½éè¦ç¨å°åºååã
ç®åæ¥è¯´ï¼
- **åºåå**ï¼å°æ°æ®ç»ææå¯¹è±¡è½¬æ¢æå¯ä»¥åå¨æä¼ è¾çå½¢å¼ï¼é常æ¯äºè¿å¶åèæµï¼ä¹å¯ä»¥æ¯ JSON, XML çææ¬æ ¼å¼
- **ååºåå**ï¼å°å¨åºååè¿ç¨ä¸æçæçæ°æ®è½¬æ¢ä¸ºåå§æ°æ®ç»ææè
对象çè¿ç¨
å¯¹äº Java è¿ç§é¢å对象ç¼ç¨è¯è¨æ¥è¯´ï¼æä»¬åºååç齿¯å¯¹è±¡ï¼Objectï¼ä¹å°±æ¯å®ä¾ååçç±»(Class)ï¼ä½æ¯å¨ C++è¿ç§åé¢å对象çè¯è¨ä¸ï¼struct(ç»æä½)å®ä¹çæ¯æ°æ®ç»æç±»åï¼è class 对åºçæ¯å¯¹è±¡ç±»åã
ä¸é¢æ¯åºåååååºåå常è§åºç¨åºæ¯ï¼
- 对象å¨è¿è¡ç½ç»ä¼ è¾ï¼æ¯å¦è¿ç¨æ¹æ³è°ç¨ RPC çæ¶åï¼ä¹åéè¦å
被åºååï¼æ¥æ¶å°åºååç对象ä¹åéè¦åè¿è¡ååºååï¼
- å°å¯¹è±¡åå¨å°æä»¶ä¹åéè¦è¿è¡åºååï¼å°å¯¹è±¡ä»æä»¶ä¸è¯»ååºæ¥éè¦è¿è¡ååºååï¼
- å°å¯¹è±¡åå¨å°æ°æ®åºï¼å¦ Redisï¼ä¹åéè¦ç¨å°åºååï¼å°å¯¹è±¡ä»ç¼åæ°æ®åºä¸è¯»ååºæ¥éè¦ååºååï¼
- å°å¯¹è±¡åå¨å°å
åä¹åéè¦è¿è¡åºååï¼ä»å
åä¸è¯»ååºæ¥ä¹åéè¦è¿è¡ååºååã
ç»´åºç¾ç§æ¯å¦æ¯ä»ç»åºååçï¼
> **åºåå**ï¼serializationï¼å¨è®¡ç®æºç§å¦çæ°æ®å¤çä¸ï¼æ¯æå°æ°æ®ç»ææå¯¹è±¡ç¶æè½¬æ¢æå¯åç¨æ ¼å¼ï¼ä¾å¦åææä»¶ï¼åäºç¼å²ï¼æç»ç±ç½ç»ä¸åéï¼ï¼ä»¥çå¾
åç»å¨ç¸åæå¦ä¸å°è®¡ç®æºç¯å¢ä¸ï¼è½æ¢å¤åå
ç¶æçè¿ç¨ãä¾ç
§åºååæ ¼å¼éæ°è·ååèçç»ææ¶ï¼å¯ä»¥å©ç¨å®æ¥äº§çä¸åå§å¯¹è±¡ç¸åè¯ä¹ç坿¬ã对äºè®¸å¤å¯¹è±¡ï¼åæ¯ä½¿ç¨å¤§éå¼ç¨çå¤æå¯¹è±¡ï¼è¿ç§åºååé建çè¿ç¨å¹¶ä¸å®¹æãé¢å对象ä¸ç对象åºååï¼å¹¶ä¸æ¦æ¬ä¹ååå§å¯¹è±¡æå
³ç³»ç彿°ãè¿ç§è¿ç¨ä¹ç§°ä¸ºå¯¹è±¡ç¼ç»ï¼marshallingï¼ãä»ä¸ç³»ååèæåæ°æ®ç»æçååæä½ï¼æ¯ååºååï¼ä¹ç§°ä¸ºè§£ç¼ç»ãdeserializationãunmarshallingï¼ã
综ä¸ï¼**åºååç主è¦ç®çæ¯éè¿ç½ç»ä¼ è¾å¯¹è±¡æè
说æ¯å°å¯¹è±¡åå¨å°æä»¶ç³»ç»ãæ°æ®åºãå
åä¸ã**

https://www.corejavaguru.com/java/serialization/interview-questions-1
**åºååå议对åºäº TCP/IP 4 屿¨¡åçåªä¸å±ï¼**
æä»¬ç¥éç½ç»éä¿¡çåæ¹å¿
é¡»è¦éç¨åéµå®ç¸åçåè®®ãTCP/IP å屿¨¡åæ¯ä¸é¢è¿æ ·çï¼åºåååè®®å±äºåªä¸å±å¢ï¼
1. åºç¨å±
2. ä¼ è¾å±
3. ç½ç»å±
4. ç½ç»æ¥å£å±

å¦ä¸å¾æç¤ºï¼OSI ä¸å±å议模åä¸ï¼è¡¨ç¤ºå±åçäºæ
主è¦å°±æ¯å¯¹åºç¨å±çç¨æ·æ°æ®è¿è¡å¤ç转æ¢ä¸ºäºè¿å¶æµãåè¿æ¥çè¯ï¼å°±æ¯å°äºè¿å¶æµè½¬æ¢æåºç¨å±çç¨æ·æ°æ®ãè¿ä¸å°±å¯¹åºçæ¯åºåååååºååä¹ï¼
å 为ï¼OSI ä¸å±å议模åä¸çåºç¨å±ã表示å±åä¼è¯å±å¯¹åºç齿¯ TCP/IP å屿¨¡åä¸çåºç¨å±ï¼æä»¥åºåååè®®å±äº TCP/IP åè®®åºç¨å±çä¸é¨åã
### 妿æäºåæ®µä¸æ³è¿è¡åºååæä¹åï¼
对äºä¸æ³è¿è¡åºååçåéï¼ä½¿ç¨ `transient` å
³é®å修饰ã
`transient` å
³é®åçä½ç¨æ¯ï¼é»æ¢å®ä¾ä¸é£äºç¨æ¤å
³é®å修饰ççåéåºååï¼å½å¯¹è±¡è¢«ååºååæ¶ï¼è¢« `transient` 修饰çåéå¼ä¸ä¼è¢«æä¹
å忢å¤ã
å
³äº `transient` è¿æå ç¹æ³¨æï¼
- `transient` åªè½ä¿®é¥°åéï¼ä¸è½ä¿®é¥°ç±»åæ¹æ³ã
- `transient` 修饰çåéï¼å¨ååºååååéå¼å°ä¼è¢«ç½®æç±»åçé»è®¤å¼ãä¾å¦ï¼å¦ææ¯ä¿®é¥° `int` ç±»åï¼é£ä¹ååºååç»æå°±æ¯ `0`ã
- `static` åéå 为ä¸å±äºä»»ä½å¯¹è±¡(Object)ï¼æä»¥æ è®ºææ²¡æ `transient` å
³é®å修饰ï¼åä¸ä¼è¢«åºååã
### 常è§åºåååè®®æåªäºï¼
JDK èªå¸¦çåºååæ¹å¼ä¸è¬ä¸ä¼ç¨ ï¼å 为åºååæçä½å¹¶ä¸åå¨å®å
¨é®é¢ãæ¯è¾å¸¸ç¨çåºåååè®®æ HessianãKryoãProtobufãProtoStuffï¼è¿äºé½æ¯åºäºäºè¿å¶çåºåååè®®ã
å JSON å XML è¿ç§å±äºææ¬ç±»åºååæ¹å¼ãè½ç¶å¯è¯»æ§æ¯è¾å¥½ï¼ä½æ¯æ§è½è¾å·®ï¼ä¸è¬ä¸ä¼éæ©ã
### 为ä»ä¹ä¸æ¨èä½¿ç¨ JDK èªå¸¦çåºååï¼
æä»¬å¾å°æè
说å ä¹ä¸ä¼ç´æ¥ä½¿ç¨ JDK èªå¸¦çåºååæ¹å¼ï¼ä¸»è¦åå æä¸é¢è¿äºåå ï¼
- **䏿¯æè·¨è¯è¨è°ç¨** : 妿è°ç¨çæ¯å
¶ä»è¯è¨å¼åçæå¡çæ¶å就䏿¯æäºã
- **æ§è½å·®**ï¼ç¸æ¯äºå
¶ä»åºååæ¡æ¶æ§è½æ´ä½ï¼ä¸»è¦åå æ¯åºååä¹åçåèæ°ç»ä½ç§¯è¾å¤§ï¼å¯¼è´ä¼ è¾ææ¬å 大ã
- **åå¨å®å
¨é®é¢**ï¼åºåååååºååæ¬èº«å¹¶ä¸åå¨é®é¢ãä½å½è¾å
¥çååºååçæ°æ®å¯è¢«ç¨æ·æ§å¶ï¼é£ä¹æ»å»è
å³å¯éè¿æé æ¶æè¾å
¥ï¼è®©ååºåå产çé颿ç对象ï¼å¨æ¤è¿ç¨ä¸æ§è¡æé çä»»æä»£ç ãç¸å
³é
读ï¼[åºç¨å®å
¨ï¼JAVA ååºååæ¼æ´ä¹æ®](https://cryin.github.io/blog/secure-development-java-deserialization-vulnerability/) ã
## I/O
### Java IO æµäºè§£åï¼
IO å³ `Input/Output`ï¼è¾å
¥åè¾åºãæ°æ®è¾å
¥å°è®¡ç®æºå
åçè¿ç¨å³è¾å
¥ï¼åä¹è¾åºå°å¤é¨åå¨ï¼æ¯å¦æ°æ®åºï¼æä»¶ï¼è¿ç¨ä¸»æºï¼çè¿ç¨å³è¾åºãæ°æ®ä¼ è¾è¿ç¨ç±»ä¼¼äºæ°´æµï¼å æ¤ç§°ä¸º IO æµãIO æµå¨ Java ä¸å为è¾å
¥æµåè¾åºæµï¼èæ ¹æ®æ°æ®çå¤çæ¹å¼åå为åèæµåå符æµã
Java IO æµç 40 å¤ä¸ªç±»é½æ¯ä»å¦ä¸ 4 个æ½è±¡ç±»åºç±»ä¸æ´¾çåºæ¥çã
- `InputStream`/`Reader`: ææçè¾å
¥æµçåºç±»ï¼åè
æ¯åèè¾å
¥æµï¼åè
æ¯å符è¾å
¥æµã
- `OutputStream`/`Writer`: ææè¾åºæµçåºç±»ï¼åè
æ¯åèè¾åºæµï¼åè
æ¯å符è¾åºæµã
### I/O æµä¸ºä»ä¹è¦å为åèæµåå符æµå¢?
é®é¢æ¬è´¨æ³é®ï¼**ä¸ç®¡æ¯æä»¶è¯»åè¿æ¯ç½ç»å鿥æ¶ï¼ä¿¡æ¯çæå°åå¨åå
齿¯åèï¼é£ä¸ºä»ä¹ I/O æµæä½è¦å为åèæµæä½ååç¬¦æµæä½å¢ï¼**
ä¸ªäººè®¤ä¸ºä¸»è¦æä¸¤ç¹åå ï¼
- åç¬¦æµæ¯ç± Java èææºå°åè转æ¢å¾å°çï¼è¿ä¸ªè¿ç¨è¿ç®æ¯æ¯è¾èæ¶ï¼
- 妿æä»¬ä¸ç¥éç¼ç ç±»åçè¯ï¼ä½¿ç¨åèæµçè¿ç¨ä¸å¾å®¹æåºç°ä¹±ç é®é¢ã
### Java IO ä¸çè®¾è®¡æ¨¡å¼æåªäºï¼
åèçæ¡ï¼[Java IO è®¾è®¡æ¨¡å¼æ»ç»](https://javaguide.cn/java/io/io-design-patterns.html)
### âï¸BIOãNIO å AIO çåºå«ï¼
åèçæ¡ï¼[Java IO 模å详解](https://javaguide.cn/java/io/io-model.html)