---
title: Javaåºç¡ç¥è¯&é¢è¯é¢æ»ç»(ä¸)
category: Java
tag:
- Javaåºç¡
---
## æ³å
#### Java æ³åäºè§£ä¹ï¼ä»ä¹æ¯ç±»åæ¦é¤ï¼ä»ç»ä¸ä¸å¸¸ç¨çéé
符ï¼
**Java æ³åï¼genericsï¼** æ¯ JDK 5 ä¸å¼å
¥çä¸ä¸ªæ°ç¹æ§, æ³åæä¾äºç¼è¯æ¶ç±»åå®å
¨æ£æµæºå¶ï¼è¯¥æºå¶å
许ç¨åºåå¨ç¼è¯æ¶æ£æµå°éæ³çç±»åãæ³åçæ¬è´¨æ¯åæ°åç±»åï¼ä¹å°±æ¯è¯´ææä½çæ°æ®ç±»å被æå®ä¸ºä¸ä¸ªåæ°ã
Java çæ³åæ¯ä¼ªæ³åï¼è¿æ¯å 为 Java å¨è¿è¡æé´ï¼ææçæ³åä¿¡æ¯é½ä¼è¢«æ¦æï¼è¿ä¹å°±æ¯é常æè¯´ç±»åæ¦é¤ ã
```java
List list = new ArrayList<>();
list.add(12);
//è¿éç´æ¥æ·»å 伿¥é
list.add("a");
Class extends List> clazz = list.getClass();
Method add = clazz.getDeclaredMethod("add", Object.class);
//使¯éè¿åå°æ·»å æ¯å¯ä»¥ç
//è¿å°±è¯´æå¨è¿è¡æé´ææçæ³åä¿¡æ¯é½ä¼è¢«æ¦æ
add.invoke(list, "kl");
System.out.println(list);
```
æ³åä¸è¬æä¸ç§ä½¿ç¨æ¹å¼: æ³åç±»ãæ³åæ¥å£ãæ³åæ¹æ³ã
**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 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);
```
#### 常ç¨çéé
符æåªäºï¼
**常ç¨çéé
ç¬¦ä¸ºï¼ Tï¼Eï¼Kï¼Vï¼ï¼**
- ï¼ è¡¨ç¤ºä¸ç¡®å®ç Java ç±»å
- T (type) 表示å
·ä½çä¸ä¸ª Java ç±»å
- K V (key value) åå«ä»£è¡¨ Java é®å¼ä¸ç Key Value
- E (element) 代表 Element
#### ä½ ç项ç®ä¸åªéç¨å°äºæ³åï¼
- å¯ç¨äºå®ä¹éç¨è¿åç»æ `CommonResult` éè¿åæ° `T` 坿 ¹æ®å
·ä½çè¿åç±»å卿æå®ç»æçæ°æ®ç±»å
- å®ä¹ `Excel` å¤çç±» `ExcelUtil` ç¨äºå¨ææå® `Excel` 导åºçæ°æ®ç±»å
- ç¨äºæå»ºéåå·¥å
·ç±»ãåè `Collections` ä¸ç `sort`, `binarySearch` æ¹æ³
- ......
## åå°
### ä½ä¸ºåå°ï¼
å¦æè¯´å¤§å®¶ç ç©¶è¿æ¡æ¶çåºå±åçæè
å±ä»¬èªå·±åè¿æ¡æ¶çè¯ï¼ä¸å®å¯¹åå°è¿ä¸ªæ¦å¿µä¸éçã
åå°ä¹æä»¥è¢«ç§°ä¸ºæ¡æ¶ççµéï¼ä¸»è¦æ¯å 为å®èµäºäºæä»¬å¨è¿è¡æ¶åæç±»ä»¥åæ§è¡ç±»ä¸æ¹æ³çè½åã
éè¿åå°ä½ å¯ä»¥è·åä»»æä¸ä¸ªç±»çææå±æ§åæ¹æ³ï¼ä½ è¿å¯ä»¥è°ç¨è¿äºæ¹æ³å屿§ã
### åå°æºå¶ä¼ç¼ºç¹
- **ä¼ç¹** ï¼ å¯ä»¥è®©å±ä»¬çä»£ç æ´å çµæ´»ã为åç§æ¡æ¶æä¾å¼ç®±å³ç¨çåè½æä¾äºä¾¿å©
- **缺ç¹** ï¼è®©æä»¬å¨è¿è¡æ¶æäºåææä½ç±»çè½åï¼è¿åæ ·ä¹å¢å äºå®å
¨é®é¢ãæ¯å¦å¯ä»¥æ è§æ³ååæ°çå®å
¨æ£æ¥ï¼æ³ååæ°çå®å
¨æ£æ¥åçå¨ç¼è¯æ¶ï¼ãå¦å¤ï¼åå°çæ§è½ä¹è¦ç¨å·®ç¹ï¼ä¸è¿ï¼å¯¹äºæ¡æ¶æ¥è¯´å®é
æ¯å½±åä¸å¤§çã[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{
}
```
æ³¨è§£åªæè¢«è§£æä¹åæä¼çæï¼å¸¸è§çè§£ææ¹æ³æä¸¤ç§ï¼
- **ç¼è¯æç´æ¥æ«æ** ï¼ç¼è¯å¨å¨ç¼è¯ Java 代ç çæ¶åæ«æå¯¹åºç注解并å¤çï¼æ¯å¦æä¸ªæ¹æ³ä½¿ç¨`@Override` 注解ï¼ç¼è¯å¨å¨ç¼è¯çæ¶å就伿£æµå½åçæ¹æ³æ¯å¦éåäºç¶ç±»å¯¹åºçæ¹æ³ã
- **è¿è¡æéè¿åå°å¤ç** ï¼åæ¡æ¶ä¸èªå¸¦ç注解(æ¯å¦ Spring æ¡æ¶ç `@Value` ã`@Component`)齿¯éè¿åå°æ¥è¿è¡å¤ççã
JDK æä¾äºå¾å¤å
ç½®çæ³¨è§£ï¼æ¯å¦ `@Override` ã`@Deprecated`ï¼ï¼åæ¶ï¼æä»¬è¿å¯ä»¥èªå®ä¹æ³¨è§£ã
## å¼å¸¸
**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`/`throw` å¤ççè¯ï¼å°±æ²¡åæ³éè¿ç¼è¯ ã
æ¯å¦ä¸é¢è¿æ®µ IO æä½ç代ç ï¼

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

### 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();
}
```
## I/O
### ä»ä¹æ¯åºåå?ä»ä¹æ¯ååºåå?
妿æä»¬éè¦æä¹
å Java 对象æ¯å¦å° Java 对象ä¿å卿件ä¸ï¼æè
å¨ç½ç»ä¼ è¾ Java 对象ï¼è¿äºåºæ¯é½éè¦ç¨å°åºååã
ç®åæ¥è¯´ï¼
- **åºåå**ï¼ å°æ°æ®ç»ææå¯¹è±¡è½¬æ¢æäºè¿å¶åèæµçè¿ç¨
- **ååºåå**ï¼å°å¨åºååè¿ç¨ä¸æçæçäºè¿å¶åèæµè½¬æ¢ææ°æ®ç»ææè
对象çè¿ç¨
å¯¹äº Java è¿ç§é¢å对象ç¼ç¨è¯è¨æ¥è¯´ï¼æä»¬åºååç齿¯å¯¹è±¡ï¼Objectï¼ä¹å°±æ¯å®ä¾ååçç±»(Class)ï¼ä½æ¯å¨ C++è¿ç§åé¢å对象çè¯è¨ä¸ï¼struct(ç»æä½)å®ä¹çæ¯æ°æ®ç»æç±»åï¼è class 对åºçæ¯å¯¹è±¡ç±»åã
ç»´åºç¾ç§æ¯å¦æ¯ä»ç»åºååçï¼
> **åºåå**ï¼serializationï¼å¨è®¡ç®æºç§å¦çæ°æ®å¤çä¸ï¼æ¯æå°æ°æ®ç»ææå¯¹è±¡ç¶æè½¬æ¢æå¯åç¨æ ¼å¼ï¼ä¾å¦åææä»¶ï¼åäºç¼å²ï¼æç»ç±ç½ç»ä¸åéï¼ï¼ä»¥çå¾
åç»å¨ç¸åæå¦ä¸å°è®¡ç®æºç¯å¢ä¸ï¼è½æ¢å¤åå
ç¶æçè¿ç¨ãä¾ç
§åºååæ ¼å¼éæ°è·ååèçç»ææ¶ï¼å¯ä»¥å©ç¨å®æ¥äº§çä¸åå§å¯¹è±¡ç¸åè¯ä¹ç坿¬ã对äºè®¸å¤å¯¹è±¡ï¼åæ¯ä½¿ç¨å¤§éå¼ç¨çå¤æå¯¹è±¡ï¼è¿ç§åºååé建çè¿ç¨å¹¶ä¸å®¹æãé¢å对象ä¸ç对象åºååï¼å¹¶ä¸æ¦æ¬ä¹ååå§å¯¹è±¡æå
³ç³»ç彿°ãè¿ç§è¿ç¨ä¹ç§°ä¸ºå¯¹è±¡ç¼ç»ï¼marshallingï¼ãä»ä¸ç³»ååèæåæ°æ®ç»æçååæä½ï¼æ¯ååºååï¼ä¹ç§°ä¸ºè§£ç¼ç»ãdeserializationãunmarshallingï¼ã
综ä¸ï¼**åºååç主è¦ç®çæ¯éè¿ç½ç»ä¼ è¾å¯¹è±¡æè
说æ¯å°å¯¹è±¡åå¨å°æä»¶ç³»ç»ãæ°æ®åºãå
åä¸ã**

https://www.corejavaguru.com/java/serialization/interview-questions-1
### Java åºååä¸å¦ææäºåæ®µä¸æ³è¿è¡åºååï¼æä¹åï¼
对äºä¸æ³è¿è¡åºååçåéï¼ä½¿ç¨ `transient` å
³é®å修饰ã
`transient` å
³é®åçä½ç¨æ¯ï¼é»æ¢å®ä¾ä¸é£äºç¨æ¤å
³é®å修饰ççåéåºååï¼å½å¯¹è±¡è¢«ååºååæ¶ï¼è¢« `transient` 修饰çåéå¼ä¸ä¼è¢«æä¹
å忢å¤ã
å
³äº `transient` è¿æå ç¹æ³¨æï¼
- `transient` åªè½ä¿®é¥°åéï¼ä¸è½ä¿®é¥°ç±»åæ¹æ³ã
- `transient` 修饰çåéï¼å¨ååºååååéå¼å°ä¼è¢«ç½®æç±»åçé»è®¤å¼ãä¾å¦ï¼å¦ææ¯ä¿®é¥° `int` ç±»åï¼é£ä¹ååºååç»æå°±æ¯ `0`ã
- `static` åéå 为ä¸å±äºä»»ä½å¯¹è±¡(Object)ï¼æä»¥æ è®ºææ²¡æ `transient` å
³é®å修饰ï¼åä¸ä¼è¢«åºååã
### è·åç¨é®çè¾å
¥å¸¸ç¨çä¸¤ç§æ¹æ³
æ¹æ³ 1ï¼éè¿ `Scanner`
```java
Scanner input = new Scanner(System.in);
String s = input.nextLine();
input.close();
```
æ¹æ³ 2ï¼éè¿ `BufferedReader`
```java
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s = input.readLine();
```
### Java ä¸ IO æµå为å ç§?
- æç
§æµçæµååï¼å¯ä»¥å为è¾å
¥æµåè¾åºæµï¼
- æç
§æä½åå
ååï¼å¯ä»¥åå为åèæµåå符æµï¼
- æç
§æµçè§è²åå为èç¹æµåå¤çæµã
Java IO æµå
±æ¶å 40 å¤ä¸ªç±»ï¼è¿äºç±»çä¸å»å¾æä¹±ï¼ä½å®é
ä¸å¾æè§åï¼èä¸å½¼æ¤ä¹é´åå¨é常紧å¯çèç³»ï¼ Java IO æµç 40 å¤ä¸ªç±»é½æ¯ä»å¦ä¸ 4 个æ½è±¡ç±»åºç±»ä¸æ´¾çåºæ¥çã
- InputStream/Reader: ææçè¾å
¥æµçåºç±»ï¼åè
æ¯åèè¾å
¥æµï¼åè
æ¯å符è¾å
¥æµã
- OutputStream/Writer: ææè¾åºæµçåºç±»ï¼åè
æ¯åèè¾åºæµï¼åè
æ¯å符è¾åºæµã
ææä½æ¹å¼åç±»ç»æå¾ï¼

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

### æ¢ç¶æäºåèæµ,为ä»ä¹è¿è¦æå符æµ?
é®é¢æ¬è´¨æ³é®ï¼**ä¸ç®¡æ¯æä»¶è¯»åè¿æ¯ç½ç»å鿥æ¶ï¼ä¿¡æ¯çæå°åå¨åå
齿¯åèï¼é£ä¸ºä»ä¹ I/O æµæä½è¦å为åèæµæä½ååç¬¦æµæä½å¢ï¼**
åçï¼åç¬¦æµæ¯ç± Java èææºå°åè转æ¢å¾å°çï¼é®é¢å°±åºå¨è¿ä¸ªè¿ç¨è¿ç®æ¯éå¸¸èæ¶ï¼å¹¶ä¸ï¼å¦ææä»¬ä¸ç¥éç¼ç ç±»åå°±å¾å®¹æåºç°ä¹±ç é®é¢ãæä»¥ï¼ I/O æµå°±å¹²èæä¾äºä¸ä¸ªç´æ¥æä½åç¬¦çæ¥å£ï¼æ¹ä¾¿æä»¬å¹³æ¶å¯¹å符è¿è¡æµæä½ã妿é³é¢æä»¶ãå¾ççåªä½æä»¶ç¨åèæµæ¯è¾å¥½ï¼å¦ææ¶åå°å符çè¯ä½¿ç¨åç¬¦æµæ¯è¾å¥½ã