---
title: Javaåºç¡å¸¸è§é¢è¯é¢æ»ç»(ä¸)
category: Java
tag:
- Javaåºç¡
head:
- - meta
- name: keywords
content: Javaå¼å¸¸,æ³å,åå°,IO,注解
- - meta
- name: description
content: å
¨ç½è´¨éæé«çJavaåºç¡å¸¸è§ç¥è¯ç¹åé¢è¯é¢æ»ç»ï¼å¸æå¯¹ä½ æå¸®å©ï¼
---
## å¼å¸¸
**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`(䏿¯æçæä½é误æ¯å¦éå¤å建åä¸ç¨æ·)
- ......

### Throwable ç±»å¸¸ç¨æ¹æ³æåªäºï¼
- `String getMessage()`: è¿åå¼å¸¸åçæ¶çç®è¦æè¿°
- `String toString()`: è¿åå¼å¸¸åçæ¶ç详ç»ä¿¡æ¯
- `String getLocalizedMessage()`: è¿åå¼å¸¸å¯¹è±¡çæ¬å°åä¿¡æ¯ãä½¿ç¨ `Throwable` çåç±»è¦çè¿ä¸ªæ¹æ³ï¼å¯ä»¥çææ¬å°åä¿¡æ¯ã妿å类没æè¦çè¯¥æ¹æ³ï¼åè¯¥æ¹æ³è¿åçä¿¡æ¯ä¸ `getMessage()`è¿åçç»æç¸å
- `void printStackTrace()`: 卿§å¶å°ä¸æå° `Throwable` 对象å°è£
çå¼å¸¸ä¿¡æ¯
### 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");
}
```
è¾åºï¼
```
Try to do something
Catch Exception -> RuntimeException
Finally
```
**注æï¼ä¸è¦å¨ finally è¯å¥åä¸ä½¿ç¨ return!** å½ try è¯å¥å finally è¯å¥ä¸é½æ return è¯å¥æ¶ï¼try è¯å¥åä¸ç return è¯å¥ä¼è¢«å¿½ç¥ãè¿æ¯å 为 try è¯å¥ä¸ç return è¿åå¼ä¼å
被æåå¨ä¸ä¸ªæ¬å°åéä¸ï¼å½æ§è¡å° finally è¯å¥ä¸ç return ä¹åï¼è¿ä¸ªæ¬å°åéçå¼å°±åä¸ºäº finally è¯å¥ä¸ç return è¿åå¼ã
[jvm 宿¹ææ¡£](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10.2.5)䏿æç¡®æå°ï¼
> If the `try` clause executes a _return_, the compiled code does the following:
>
> 1. Saves the return value (if any) in a local variable.
> 2. Executes a _jsr_ to the code for the `finally` clause.
> 3. Upon return from the `finally` clause, returns the value saved in the local variable.
代ç 示ä¾ï¼
```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;
}
}
}
```
è¾åºï¼
```
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");
}
```
è¾åºï¼
```
Try to do something
Catch Exception -> RuntimeException
```
å¦å¤ï¼å¨ä»¥ä¸ 2 ç§ç¹æ®æ
åµä¸ï¼`finally` åç代ç ä¹ä¸ä¼è¢«æ§è¡ï¼
1. ç¨åºæå¨ççº¿ç¨æ»äº¡ã
2. å
³é CPUã
ç¸å
³ issueï¼ ã
ð§ð» è¿é¶ä¸ä¸ï¼ä»åèç è§åº¦åæ`try catch finally`è¿ä¸ªè¯æ³ç³èåçå®ç°åçã
### å¦ä½ä½¿ç¨ `try-with-resources` 代æ¿`try-catch-finally`ï¼
1. **éç¨èå´ï¼èµæºçå®ä¹ï¼ï¼** ä»»ä½å®ç° `java.lang.AutoCloseable`æè
`java.io.Closeable` ç对象
2. **å
³éèµæºå finally åçæ§è¡é¡ºåºï¼** å¨ `try-with-resources` è¯å¥ä¸ï¼ä»»ä½ catch æ finally åå¨å£°æçèµæºå
³éåè¿è¡
ãEffective Javaãä¸æç¡®æåºï¼
> é¢å¯¹å¿
é¡»è¦å
³éçèµæºï¼æä»¬æ»æ¯åºè¯¥ä¼å
ä½¿ç¨ `try-with-resources` è䏿¯`try-finally`ãéä¹äº§ççä»£ç æ´ç®çï¼æ´æ¸
æ°ï¼äº§ççå¼å¸¸å¯¹æä»¬ä¹æ´æç¨ã`try-with-resources`è¯å¥è®©æä»¬æ´å®¹æç¼åå¿
é¡»è¦å
³éçèµæºç代ç ï¼è¥éç¨`try-finally`åå ä¹åä¸å°è¿ç¹ã
Java ä¸ç±»ä¼¼äº`InputStream`ã`OutputStream` ã`Scanner` ã`PrintWriter`ççèµæºé½éè¦æä»¬è°ç¨`close()`æ¹æ³æ¥æå¨å
³éï¼ä¸è¬æ
åµä¸æä»¬é½æ¯éè¿`try-catch-finally`è¯å¥æ¥å®ç°è¿ä¸ªéæ±ï¼å¦ä¸ï¼
```java
//è¯»åææ¬æä»¶çå
容
Scanner scanner = null;
try {
scanner = new Scanner(new File("D://read.txt"));
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (scanner != null) {
scanner.close();
}
}
```
ä½¿ç¨ Java 7 ä¹åç `try-with-resources` è¯å¥æ¹é ä¸é¢ç代ç :
```java
try (Scanner scanner = new Scanner(new File("test.txt"))) {
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
```
å½ç¶å¤ä¸ªèµæºéè¦å
³éçæ¶åï¼ä½¿ç¨ `try-with-resources` å®ç°èµ·æ¥ä¹é常ç®åï¼å¦æä½ è¿æ¯ç¨`try-catch-finally`å¯è½ä¼å¸¦æ¥å¾å¤é®é¢ã
éè¿ä½¿ç¨åå·åéï¼å¯ä»¥å¨`try-with-resources`åä¸å£°æå¤ä¸ªèµæºã
```java
try (BufferedInputStream bin = new BufferedInputStream(new FileInputStream(new File("test.txt")));
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(new File("out.txt")))) {
int b;
while ((b = bin.read()) != -1) {
bout.write(b);
}
}
catch (IOException e) {
e.printStackTrace();
}
```
### å¼å¸¸ä½¿ç¨æåªäºéè¦æ³¨æçå°æ¹ï¼
- ä¸è¦æå¼å¸¸å®ä¹ä¸ºéæåéï¼å ä¸ºè¿æ ·ä¼å¯¼è´å¼å¸¸æ ä¿¡æ¯éä¹±ãæ¯æ¬¡æå¨æåºå¼å¸¸ï¼æä»¬é½éè¦æå¨ new ä¸ä¸ªå¼å¸¸å¯¹è±¡æåºã
- æåºçå¼å¸¸ä¿¡æ¯ä¸å®è¦ææä¹ã
- 建议æåºæ´å å
·ä½çå¼å¸¸æ¯å¦å符串转æ¢ä¸ºæ°åæ ¼å¼éè¯¯çæ¶ååºè¯¥æåº`NumberFormatException`è䏿¯å
¶ç¶ç±»`IllegalArgumentException`ã
- ä½¿ç¨æ¥å¿æå°å¼å¸¸ä¹åå°±ä¸è¦åæåºå¼å¸¸äºï¼ä¸¤è
ä¸è¦åæ¶åå¨ä¸æ®µä»£ç é»è¾ä¸ï¼ã
- ......
## æ³å
### ä»ä¹æ¯æ³åï¼æä»ä¹ä½ç¨ï¼
**Java æ³åï¼Genericsï¼** æ¯ JDK 5 ä¸å¼å
¥çä¸ä¸ªæ°ç¹æ§ãä½¿ç¨æ³ååæ°ï¼å¯ä»¥å¢å¼ºä»£ç çå¯è¯»æ§ä»¥åç¨³å®æ§ã
ç¼è¯å¨å¯ä»¥å¯¹æ³ååæ°è¿è¡æ£æµï¼å¹¶ä¸éè¿æ³ååæ°å¯ä»¥æå®ä¼ å
¥ç对象类åãæ¯å¦ `ArrayList persons = new ArrayList()` è¿è¡ä»£ç å°±ææäºè¯¥ `ArrayList` 对象åªè½ä¼ å
¥ `Persion` 对象ï¼å¦æä¼ å
¥å
¶ä»ç±»åçå¯¹è±¡å°±ä¼æ¥éã
```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 åå°æºå¶è¯¦è§£](./reflection.md) ã
### ä½è°åå°ï¼
å¦æè¯´å¤§å®¶ç ç©¶è¿æ¡æ¶çåºå±åçæè
å±ä»¬èªå·±åè¿æ¡æ¶çè¯ï¼ä¸å®å¯¹åå°è¿ä¸ªæ¦å¿µä¸éçãåå°ä¹æä»¥è¢«ç§°ä¸ºæ¡æ¶ççµéï¼ä¸»è¦æ¯å 为å®èµäºäºæä»¬å¨è¿è¡æ¶åæç±»ä»¥åæ§è¡ç±»ä¸æ¹æ³çè½åãéè¿åå°ä½ å¯ä»¥è·åä»»æä¸ä¸ªç±»çææå±æ§åæ¹æ³ï¼ä½ è¿å¯ä»¥è°ç¨è¿äºæ¹æ³å屿§ã
### åå°çä¼ç¼ºç¹ï¼
åå°å¯ä»¥è®©æä»¬çä»£ç æ´å çµæ´»ã为åç§æ¡æ¶æä¾å¼ç®±å³ç¨çåè½æä¾äºä¾¿å©ã
ä¸è¿ï¼åå°è®©æä»¬å¨è¿è¡æ¶æäºåææä½ç±»çè½åçåæ¶ï¼ä¹å¢å äºå®å
¨é®é¢ï¼æ¯å¦å¯ä»¥æ è§æ³ååæ°çå®å
¨æ£æ¥ï¼æ³ååæ°çå®å
¨æ£æ¥åçå¨ç¼è¯æ¶ï¼ãå¦å¤ï¼åå°çæ§è½ä¹è¦ç¨å·®ç¹ï¼ä¸è¿ï¼å¯¹äºæ¡æ¶æ¥è¯´å®é
æ¯å½±åä¸å¤§çã
ç¸å
³é
读ï¼[Java Reflection: Why is it so slow?](https://stackoverflow.com/questions/1392351/java-reflection-why-is-it-so-slow) ã
### åå°çåºç¨åºæ¯ï¼
åå±ä»¬å¹³æ¶å¤§é¨åæ¶å齿¯å¨åä¸å¡ä»£ç ï¼å¾å°ä¼æ¥è§¦å°ç´æ¥ä½¿ç¨åå°æºå¶çåºæ¯ã使¯ï¼è¿å¹¶ä¸ä»£è¡¨åå°æ²¡æç¨ãç¸åï¼æ£æ¯å 为åå°ï¼ä½ æè½è¿ä¹è½»æ¾å°ä½¿ç¨åç§æ¡æ¶ãå Spring/Spring BootãMyBatis ççæ¡æ¶ä¸é½å¤§é使ç¨äºåå°æºå¶ã
**è¿äºæ¡æ¶ä¸ä¹å¤§é使ç¨äºå¨æä»£çï¼è卿代ççå®ç°ä¹ä¾èµåå°ã**
æ¯å¦ä¸é¢æ¯éè¿ JDK å®ç°å¨æä»£çç示ä¾ä»£ç ï¼å
¶ä¸å°±ä½¿ç¨äºåå°ç±» `Method` æ¥è°ç¨æå®çæ¹æ³ã
```java
public class DebugInvocationHandler implements InvocationHandler {
/**
* 代çç±»ä¸ççå®å¯¹è±¡
*/
private final Object target;
public DebugInvocationHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
System.out.println("before method " + method.getName());
Object result = method.invoke(target, args);
System.out.println("after method " + method.getName());
return result;
}
}
```
å¦å¤ï¼å Java ä¸çä¸å¤§å©å¨ **注解** çå®ç°ä¹ç¨å°äºåå°ã
为ä»ä¹ä½ ä½¿ç¨ Spring çæ¶å ï¼ä¸ä¸ª`@Component`注解就声æäºä¸ä¸ªç±»ä¸º Spring Bean å¢ï¼ä¸ºä»ä¹ä½ éè¿ä¸ä¸ª `@Value`注解就读åå°é
ç½®æä»¶ä¸çå¼å¢ï¼ç©¶ç«æ¯æä¹èµ·ä½ç¨çå¢ï¼
è¿äºé½æ¯å ä¸ºä½ å¯ä»¥åºäºåå°åæç±»ï¼ç¶åè·åå°ç±»/屿§/æ¹æ³/æ¹æ³çåæ°ä¸ç注解ãä½ è·åå°æ³¨è§£ä¹åï¼å°±å¯ä»¥åè¿ä¸æ¥çå¤çã
## 注解
### ä½è°æ³¨è§£ï¼
`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 æºå¶è¯¦è§£](./spi.md) ã
### ä½è° SPI?
SPI å³ Service Provider Interface ï¼å颿æå°±æ¯ï¼âæå¡æä¾è
çæ¥å£âï¼æççè§£æ¯ï¼ä¸é¨æä¾ç»æå¡æä¾è
æè
æ©å±æ¡æ¶åè½çå¼åè
å»ä½¿ç¨çä¸ä¸ªæ¥å£ã
SPI 尿塿¥å£åå
·ä½çæå¡å®ç°åç¦»å¼æ¥ï¼å°æå¡è°ç¨æ¹åæå¡å®ç°è
è§£è¦ï¼è½å¤æåç¨åºçæ©å±æ§ãå¯ç»´æ¤æ§ãä¿®æ¹æè
æ¿æ¢æå¡å®ç°å¹¶ä¸éè¦ä¿®æ¹è°ç¨æ¹ã
å¾å¤æ¡æ¶é½ä½¿ç¨äº Java ç SPI æºå¶ï¼æ¯å¦ï¼Spring æ¡æ¶ãæ°æ®åºå 载驱å¨ãæ¥å¿æ¥å£ã以å Dubbo çæ©å±å®ç°ççã

### SPI å API æä»ä¹åºå«ï¼
**é£ SPI å API æå¥åºå«ï¼**
è¯´å° SPI å°±ä¸å¾ä¸è¯´ä¸ä¸ API äºï¼ä»å¹¿ä¹ä¸æ¥è¯´å®ä»¬é½å±äºæ¥å£ï¼èä¸å¾å®¹ææ··æ·ãä¸é¢å
ç¨ä¸å¼ å¾è¯´æä¸ä¸ï¼

ä¸è¬æ¨¡åä¹é´é½æ¯éè¿éè¿æ¥å£è¿è¡é讯ï¼é£æä»¬å¨æå¡è°ç¨æ¹åæå¡å®ç°æ¹ï¼ä¹ç§°æå¡æä¾è
ï¼ä¹é´å¼å
¥ä¸ä¸ªâæ¥å£âã
å½å®ç°æ¹æä¾äºæ¥å£åå®ç°ï¼æä»¬å¯ä»¥éè¿è°ç¨å®ç°æ¹çæ¥å£ä»èæ¥æå®ç°æ¹ç»æä»¬æä¾çè½åï¼è¿å°±æ¯ API ï¼è¿ç§æ¥å£åå®ç°é½æ¯æ¾å¨å®ç°æ¹çã
彿¥å£åå¨äºè°ç¨æ¹è¿è¾¹æ¶ï¼å°±æ¯ SPI ï¼ç±æ¥å£è°ç¨æ¹ç¡®å®æ¥å£è§åï¼ç¶åç±ä¸åçåå廿 ¹ç»è¿ä¸ªè§å对è¿ä¸ªæ¥å£è¿è¡å®ç°ï¼ä»èæä¾æå¡ã
举个éä¿ææçä¾åï¼å
¬å¸ H æ¯ä¸å®¶ç§æå
¬å¸ï¼æ°è®¾è®¡äºä¸æ¬¾è¯çï¼ç¶åç°å¨éè¦é产äºï¼èå¸é¢ä¸æå¥½å å®¶è¯çå¶é ä¸å
¬å¸ï¼è¿ä¸ªæ¶åï¼åªè¦ H å
¬å¸æå®å¥½äºè¿è¯ççäº§çæ åï¼å®ä¹å¥½äºæ¥å£æ åï¼ï¼é£ä¹è¿äºåä½çè¯çå
¬å¸ï¼æå¡æä¾è
ï¼å°±æç
§æ å交ä»èªå®¶ç¹è²çè¯çï¼æä¾ä¸åæ¹æ¡çå®ç°ï¼ä½æ¯ç»åºæ¥çç»ææ¯ä¸æ ·çï¼ã
### SPI çä¼ç¼ºç¹ï¼
éè¿ SPI æºå¶è½å¤å¤§å¤§å°æé«æ¥å£è®¾è®¡ççµæ´»æ§ï¼ä½æ¯ SPI æºå¶ä¹åå¨ä¸äºç¼ºç¹ï¼æ¯å¦ï¼
- éè¦éåå è½½ææçå®ç°ç±»ï¼ä¸è½åå°æéå è½½ï¼è¿æ ·æçè¿æ¯ç¸å¯¹è¾ä½çã
- å½å¤ä¸ª `ServiceLoader` åæ¶ `load` æ¶ï¼ä¼æå¹¶åé®é¢ã
## I/O
### ä»ä¹æ¯åºåå?ä»ä¹æ¯ååºåå?
妿æä»¬éè¦æä¹
å Java 对象æ¯å¦å° Java 对象ä¿å卿件ä¸ï¼æè
å¨ç½ç»ä¼ è¾ Java 对象ï¼è¿äºåºæ¯é½éè¦ç¨å°åºååã
ç®åæ¥è¯´ï¼
- **åºåå**ï¼ å°æ°æ®ç»ææå¯¹è±¡è½¬æ¢æäºè¿å¶åèæµçè¿ç¨
- **ååºåå**ï¼å°å¨åºååè¿ç¨ä¸æçæçäºè¿å¶åèæµè½¬æ¢ææ°æ®ç»ææè
对象çè¿ç¨
å¯¹äº Java è¿ç§é¢å对象ç¼ç¨è¯è¨æ¥è¯´ï¼æä»¬åºååç齿¯å¯¹è±¡ï¼Objectï¼ä¹å°±æ¯å®ä¾ååçç±»(Class)ï¼ä½æ¯å¨ C++è¿ç§åé¢å对象çè¯è¨ä¸ï¼struct(ç»æä½)å®ä¹çæ¯æ°æ®ç»æç±»åï¼è class 对åºçæ¯å¯¹è±¡ç±»åã
ç»´åºç¾ç§æ¯å¦æ¯ä»ç»åºååçï¼
> **åºåå**ï¼serializationï¼å¨è®¡ç®æºç§å¦çæ°æ®å¤çä¸ï¼æ¯æå°æ°æ®ç»ææå¯¹è±¡ç¶æè½¬æ¢æå¯åç¨æ ¼å¼ï¼ä¾å¦åææä»¶ï¼åäºç¼å²ï¼æç»ç±ç½ç»ä¸åéï¼ï¼ä»¥çå¾
åç»å¨ç¸åæå¦ä¸å°è®¡ç®æºç¯å¢ä¸ï¼è½æ¢å¤åå
ç¶æçè¿ç¨ãä¾ç
§åºååæ ¼å¼éæ°è·ååèçç»ææ¶ï¼å¯ä»¥å©ç¨å®æ¥äº§çä¸åå§å¯¹è±¡ç¸åè¯ä¹ç坿¬ã对äºè®¸å¤å¯¹è±¡ï¼åæ¯ä½¿ç¨å¤§éå¼ç¨çå¤æå¯¹è±¡ï¼è¿ç§åºååé建çè¿ç¨å¹¶ä¸å®¹æãé¢å对象ä¸ç对象åºååï¼å¹¶ä¸æ¦æ¬ä¹ååå§å¯¹è±¡æå
³ç³»ç彿°ãè¿ç§è¿ç¨ä¹ç§°ä¸ºå¯¹è±¡ç¼ç»ï¼marshallingï¼ãä»ä¸ç³»ååèæåæ°æ®ç»æçååæä½ï¼æ¯ååºååï¼ä¹ç§°ä¸ºè§£ç¼ç»ãdeserializationãunmarshallingï¼ã
综ä¸ï¼**åºååç主è¦ç®çæ¯éè¿ç½ç»ä¼ è¾å¯¹è±¡æè
说æ¯å°å¯¹è±¡åå¨å°æä»¶ç³»ç»ãæ°æ®åºãå
åä¸ã**

https://www.corejavaguru.com/java/serialization/interview-questions-1
### 妿æäºåæ®µä¸æ³è¿è¡åºååæä¹åï¼
对äºä¸æ³è¿è¡åºååçåéï¼ä½¿ç¨ `transient` å
³é®å修饰ã
`transient` å
³é®åçä½ç¨æ¯ï¼é»æ¢å®ä¾ä¸é£äºç¨æ¤å
³é®å修饰ççåéåºååï¼å½å¯¹è±¡è¢«ååºååæ¶ï¼è¢« `transient` 修饰çåéå¼ä¸ä¼è¢«æä¹
å忢å¤ã
å
³äº `transient` è¿æå ç¹æ³¨æï¼
- `transient` åªè½ä¿®é¥°åéï¼ä¸è½ä¿®é¥°ç±»åæ¹æ³ã
- `transient` 修饰çåéï¼å¨ååºååååéå¼å°ä¼è¢«ç½®æç±»åçé»è®¤å¼ãä¾å¦ï¼å¦ææ¯ä¿®é¥° `int` ç±»åï¼é£ä¹ååºååç»æå°±æ¯ `0`ã
- `static` åéå 为ä¸å±äºä»»ä½å¯¹è±¡(Object)ï¼æä»¥æ è®ºææ²¡æ `transient` å
³é®å修饰ï¼åä¸ä¼è¢«åºååã
### Java IO æµäºè§£åï¼
IO å³ `Input/Output`ï¼è¾å
¥åè¾åºãæ°æ®è¾å
¥å°è®¡ç®æºå
åçè¿ç¨å³è¾å
¥ï¼åä¹è¾åºå°å¤é¨åå¨ï¼æ¯å¦æ°æ®åºï¼æä»¶ï¼è¿ç¨ä¸»æºï¼çè¿ç¨å³è¾åºãæ°æ®ä¼ è¾è¿ç¨ç±»ä¼¼äºæ°´æµï¼å æ¤ç§°ä¸º IO æµãIO æµå¨ Java ä¸å为è¾å
¥æµåè¾åºæµï¼èæ ¹æ®æ°æ®çå¤çæ¹å¼åå为åèæµåå符æµã
Java IO æµç 40 å¤ä¸ªç±»é½æ¯ä»å¦ä¸ 4 个æ½è±¡ç±»åºç±»ä¸æ´¾çåºæ¥çã
- `InputStream`/`Reader`: ææçè¾å
¥æµçåºç±»ï¼åè
æ¯åèè¾å
¥æµï¼åè
æ¯å符è¾å
¥æµã
- `OutputStream`/`Writer`: ææè¾åºæµçåºç±»ï¼åè
æ¯åèè¾åºæµï¼åè
æ¯å符è¾åºæµã
ç¸å
³é
读ï¼[Java IO åºç¡ç¥è¯æ»ç»](../io/io-basis.md)ã
### I/O æµä¸ºä»ä¹è¦å为åèæµåå符æµå¢?
é®é¢æ¬è´¨æ³é®ï¼**ä¸ç®¡æ¯æä»¶è¯»åè¿æ¯ç½ç»å鿥æ¶ï¼ä¿¡æ¯çæå°åå¨åå
齿¯åèï¼é£ä¸ºä»ä¹ I/O æµæä½è¦å为åèæµæä½ååç¬¦æµæä½å¢ï¼**
ä¸ªäººè®¤ä¸ºä¸»è¦æä¸¤ç¹åå ï¼
- åç¬¦æµæ¯ç± Java èææºå°åè转æ¢å¾å°çï¼è¿ä¸ªè¿ç¨è¿ç®æ¯æ¯è¾èæ¶ï¼
- 妿æä»¬ä¸ç¥éç¼ç ç±»åçè¯ï¼ä½¿ç¨åèæµçè¿ç¨ä¸å¾å®¹æåºç°ä¹±ç é®é¢ã
### Java IO ä¸çè®¾è®¡æ¨¡å¼æåªäºï¼
[Java IO è®¾è®¡æ¨¡å¼æ»ç»](../io/io-design-patterns.md)
### BIOãNIO å AIO çåºå«ï¼
[Java IO 模å详解](../io/io-model.md)
## è¯æ³ç³
### ä»ä¹æ¯è¯æ³ç³ï¼
**è¯æ³ç³ï¼Syntactic sugarï¼** 代æçæ¯ç¼ç¨è¯è¨ä¸ºäºæ¹ä¾¿ç¨åºåå¼åç¨åºè设计çä¸ç§ç¹æ®è¯æ³ï¼è¿ç§è¯æ³å¯¹ç¼ç¨è¯è¨çåè½å¹¶æ²¡æå½±åãå®ç°ç¸åçåè½ï¼åºäºè¯æ³ç³ååºæ¥ç代ç å¾å¾æ´ç®åç®æ´ä¸æ´æé
读ã
举个ä¾åï¼Java ä¸ç `for-each` å°±æ¯ä¸ä¸ªå¸¸ç¨çè¯æ³ç³ï¼å
¶åçå
¶å®å°±æ¯åºäºæ®éç for 循ç¯åè¿ä»£å¨ã
```java
String[] strs = {"JavaGuide", "å
¬ä¼å·ï¼JavaGuide", "å客ï¼https://javaguide.cn/"};
for (String s : strs) {
System.out.println(s);
}
```
ä¸è¿ï¼JVM å
¶å®å¹¶ä¸è½è¯å«è¯æ³ç³ï¼Java è¯æ³ç³è¦æ³è¢«æ£ç¡®æ§è¡ï¼éè¦å
éè¿ç¼è¯å¨è¿è¡è§£ç³ï¼ä¹å°±æ¯å¨ç¨åºç¼è¯é¶æ®µå°å
¶è½¬æ¢æ JVM 认è¯çåºæ¬è¯æ³ãè¿ä¹ä¾§é¢è¯´æï¼Java ä¸çæ£æ¯æè¯æ³ç³çæ¯ Java ç¼è¯å¨è䏿¯ JVMãå¦æä½ å»ç`com.sun.tools.javac.main.JavaCompiler`çæºç ï¼ä½ ä¼åç°å¨`compile()`䏿ä¸ä¸ªæ¥éª¤å°±æ¯è°ç¨`desugar()`ï¼è¿ä¸ªæ¹æ³å°±æ¯è´è´£è§£è¯æ³ç³çå®ç°çã
### Java 䏿åªäºå¸¸è§çè¯æ³ç³ï¼
Java 䏿叏ç¨çè¯æ³ç³ä¸»è¦ææ³åãèªå¨æè£
ç®±ãåé¿åæ°ãæä¸¾ãå
é¨ç±»ãå¢å¼º for 循ç¯ãtry-with-resources è¯æ³ãlambda 表达å¼çã
å
³äºè¿äºè¯æ³ç³ç详ç»è§£è¯»ï¼è¯·çè¿ç¯æç« [Java è¯æ³ç³è¯¦è§£](./syntactic-sugar.md) ã