---
title: Javaåºç¡ç¥è¯&é¢è¯é¢æ»ç»(ä¸)
category: Java
tag:
- 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: 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`ï¼ï¼åæ¶ï¼æä»¬è¿å¯ä»¥èªå®ä¹æ³¨è§£ã
## 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 æµå°±å¹²èæä¾äºä¸ä¸ªç´æ¥æä½åç¬¦çæ¥å£ï¼æ¹ä¾¿æä»¬å¹³æ¶å¯¹å符è¿è¡æµæä½ã妿é³é¢æä»¶ãå¾ççåªä½æä»¶ç¨åèæµæ¯è¾å¥½ï¼å¦ææ¶åå°å符çè¯ä½¿ç¨åç¬¦æµæ¯è¾å¥½ã