---
sidebar: heading
copy:
disableCopy: true
---

## Javaçç¹ç¹
**Javaæ¯ä¸é¨é¢å对象çç¼ç¨è¯è¨**ãé¢å对象åé¢åè¿ç¨çåºå«åèä¸ä¸ä¸ªé®é¢ã
**Javaå
·æå¹³å°ç¬ç«æ§åç§»æ¤æ§**ã
- Javaæä¸å¥å£å·ï¼`Write once, run anywhere`ï¼ä¸æ¬¡ç¼åãå°å¤è¿è¡ãè¿ä¹æ¯Javaçé
åæå¨ãèå®ç°è¿ç§ç¹æ§çæ£æ¯JavaèææºJVMãå·²ç¼è¯çJavaç¨åºå¯ä»¥å¨ä»»ä½å¸¦æJVMçå¹³å°ä¸è¿è¡ãä½ å¯ä»¥å¨windowså¹³å°ç¼å代ç ï¼ç¶åæ¿å°linuxä¸è¿è¡ãåªè¦ä½ å¨ç¼åå®ä»£ç åï¼å°ä»£ç ç¼è¯æ.classæä»¶ï¼åæclassæä»¶ææJavaå
ï¼è¿ä¸ªjarå
å°±å¯ä»¥å¨ä¸åçå¹³å°ä¸è¿è¡äºã
**Javaå
·æç¨³å¥æ§**ã
- Javaæ¯ä¸ä¸ªå¼ºç±»åè¯è¨ï¼å®å
许æ©å±ç¼è¯æ¶æ£æ¥æ½å¨ç±»åä¸å¹é
é®é¢çåè½ãJavaè¦æ±æ¾å¼çæ¹æ³å£°æï¼å®ä¸æ¯æC飿 ¼çéå¼å£°æãè¿äºä¸¥æ ¼çè¦æ±ä¿è¯ç¼è¯ç¨åºè½ææè°ç¨é误ï¼è¿å°±å¯¼è´æ´å¯é çç¨åºã
- å¼å¸¸å¤çæ¯Javaä¸ä½¿å¾ç¨åºæ´ç¨³å¥çå¦ä¸ä¸ªç¹å¾ãå¼å¸¸æ¯æç§ç±»ä¼¼äºé误çå¼å¸¸æ¡ä»¶åºç°çä¿¡å·ã使ç¨`try/catch/finally`è¯å¥ï¼ç¨åºåå¯ä»¥æ¾å°åºéçå¤ç代ç ï¼è¿å°±ç®åäºåºéå¤ç忢å¤çä»»å¡ã
## Java ä¸ C++ çåºå«
- Java æ¯çº¯ç²¹çé¢å对象è¯è¨ï¼ææç对象é½ç»§æ¿èª java.lang.Objectï¼C++ å
¼å®¹ C ï¼ä¸ä½æ¯æé¢åå¯¹è±¡ä¹æ¯æé¢åè¿ç¨ã
- Java éè¿èææºä»èå®ç°è·¨å¹³å°ç¹æ§ï¼ C++ ä¾èµäºç¹å®çå¹³å°ã
- Java 没ææéï¼å®çå¼ç¨å¯ä»¥ç解为å®å
¨æéï¼è C++ å
·æå C 䏿 ·çæéã
- Java æ¯æèªå¨åå¾åæ¶ï¼è C++ éè¦æå¨åæ¶ã
- Java 䏿¯æå¤éç»§æ¿ï¼åªè½éè¿å®ç°å¤ä¸ªæ¥å£æ¥è¾¾å°ç¸åç®çï¼è C++ æ¯æå¤éç»§æ¿ã
## é¢å对象åé¢åè¿ç¨çåºå«ï¼
é¢å对象åé¢åè¿ç¨æ¯ä¸ç§è½¯ä»¶å¼åææ³ã
- é¢åè¿ç¨å°±æ¯åæåºè§£å³é®é¢æéè¦çæ¥éª¤ï¼ç¶åç¨å½æ°æè¿äºæ¥éª¤å®ç°ï¼ä½¿ç¨çæ¶å便¬¡è°ç¨å°±å¯ä»¥äºã
- é¢åå¯¹è±¡æ¯æææé®é¢äºå¡åè§£æå个对象ï¼åå«è®¾è®¡è¿äºå¯¹è±¡ï¼ç¶åå°ä»ä»¬ç»è£
ææå®æ´åè½çç³»ç»ãé¢åè¿ç¨åªç¨å½æ°å®ç°ï¼é¢å对象æ¯ç¨ç±»å®ç°å个åè½æ¨¡åã
以äºåæ£ä¸ºä¾ï¼é¢åè¿ç¨ç设计æè·¯å°±æ¯é¦å
åæé®é¢çæ¥éª¤ï¼
1ãå¼å§æ¸¸æï¼2ãé»åå
èµ°ï¼3ãç»å¶ç»é¢ï¼4ã夿è¾èµ¢ï¼5ãè½®å°ç½åï¼6ãç»å¶ç»é¢ï¼7ã夿è¾èµ¢ï¼8ãè¿åæ¥éª¤2ï¼9ãè¾åºæåç»æã
æä¸é¢æ¯ä¸ªæ¥éª¤ç¨åå«ç彿°æ¥å®ç°ï¼é®é¢å°±è§£å³äºã
èé¢å对象çè®¾è®¡åæ¯ä»å¦å¤çæè·¯æ¥è§£å³é®é¢ãæ´ä¸ªäºåæ£å¯ä»¥å为ï¼
1. é»ç½åæ¹
2. æ£çç³»ç»ï¼è´è´£ç»å¶ç»é¢
3. è§åç³»ç»ï¼è´è´£å¤å®è¯¸å¦ç¯è§ãè¾èµ¢çã
é»ç½åæ¹è´è´£æ¥åç¨æ·çè¾å
¥ï¼å¹¶åç¥æ£çç³»ç»æ£åå¸å±åçååï¼æ£çç³»ç»æ¥æ¶å°äºæ£åçååçä¿¡æ¯å°±è´è´£å¨å±å¹ä¸é¢æ¾ç¤ºåºè¿ç§ååï¼åæ¶å©ç¨è§åç³»ç»æ¥å¯¹æ£å±è¿è¡å¤å®ã
## JDK/JRE/JVMä¸è
çå
³ç³»
**JVM**
è±æåç§°ï¼Java Virtual Machineï¼ï¼å°±æ¯æä»¬è³çè½è¯¦ç Java èææºãJava è½å¤è·¨å¹³å°è¿è¡çæ ¸å¿å¨äº JVM ã

ææçjavaç¨åºä¼é¦å
被ç¼è¯ä¸º.classçç±»æä»¶ï¼è¿ç§ç±»æä»¶å¯ä»¥å¨èææºä¸æ§è¡ãä¹å°±æ¯è¯´classæä»¶å¹¶ä¸ç´æ¥ä¸æºå¨çæä½ç³»ç»äº¤äºï¼èæ¯ç»è¿èææºé´æ¥ä¸æä½ç³»ç»äº¤äºï¼ç±èææºå°ç¨åºè§£éç»æ¬å°ç³»ç»æ§è¡ã
é对ä¸åçç³»ç»æä¸åç jvm å®ç°ï¼æ Linux çæ¬ç jvm å®ç°ï¼ä¹æWindows çæ¬ç jvm å®ç°ï¼ä½æ¯å䏿®µä»£ç å¨ç¼è¯åçåèç æ¯ä¸æ ·çãè¿å°±æ¯Javaè½å¤è·¨å¹³å°ï¼å®ç°ä¸æ¬¡ç¼åï¼å¤å¤è¿è¡çåå æå¨ã
**JRE**
è±æåç§°ï¼Java Runtime Environmentï¼ï¼å°±æ¯Java è¿è¡æ¶ç¯å¢ãæä»¬ç¼åçJavaç¨åºå¿
é¡»è¦å¨JREæè½è¿è¡ãå®ä¸»è¦å
å«ä¸¤ä¸ªé¨åï¼JVM å Java æ ¸å¿ç±»åºã

JREæ¯Javaçè¿è¡ç¯å¢ï¼å¹¶ä¸æ¯ä¸ä¸ªå¼åç¯å¢ï¼æä»¥æ²¡æå
å«ä»»ä½å¼åå·¥å
·ï¼å¦ç¼è¯å¨åè°è¯å¨çã
å¦æä½ åªæ¯æ³è¿è¡Javaç¨åºï¼è䏿¯å¼åJavaç¨åºçè¯ï¼é£ä¹ä½ åªéè¦å®è£
JREå³å¯ã
**JDK**
è±æåç§°ï¼Java Development Kitï¼ï¼å°±æ¯ Java å¼åå·¥å
·å
å¦è¿Javaçåå¦ï¼é½åºè¯¥å®è£
è¿JDKã彿们å®è£
å®JDKä¹åï¼ç®å½ç»ææ¯è¿æ ·ç

å¯ä»¥çå°ï¼JDKç®å½ä¸æä¸ªJREï¼ä¹å°±æ¯JDKä¸å·²ç»éæäº JREï¼ä¸ç¨åç¬å®è£
JREã
å¦å¤ï¼JDKä¸è¿æä¸äºå¥½ç¨çå·¥å
·ï¼å¦jinfoï¼jpsï¼jstackçã

æåï¼æ»ç»ä¸ä¸JDK/JRE/JVMï¼ä»ä»¬ä¸è
çå
³ç³»
**JRE = JVM + Java æ ¸å¿ç±»åº**
**JDK = JRE + Javaå·¥å
· + ç¼è¯å¨ + è°è¯å¨**

## é¢å对象æåªäºç¹æ§ï¼
é¢å对象åå¤§ç¹æ§ï¼å°è£
ï¼ç»§æ¿ï¼å¤æï¼æ½è±¡
1ãå°è£
å°±æ¯å°ç±»çä¿¡æ¯éèå¨ç±»å
é¨ï¼ä¸å
许å¤é¨ç¨åºç´æ¥è®¿é®ï¼èæ¯éè¿è¯¥ç±»çæ¹æ³å®ç°å¯¹éèä¿¡æ¯çæä½å访é®ã è¯å¥½çå°è£
è½å¤åå°è¦åã
2ãç»§æ¿æ¯ä»å·²æçç±»ä¸æ´¾çåºæ°çç±»ï¼æ°ç类继æ¿ç¶ç±»ç屿§åè¡ä¸ºï¼å¹¶è½æ©å±æ°çè½åï¼å¤§å¤§å¢å ç¨åºçéç¨æ§åæç»´æ¤æ§ãå¨Java䏿¯åç»§æ¿çï¼ä¹å°±æ¯è¯´ä¸ä¸ªåç±»åªæä¸ä¸ªç¶ç±»ã
3ã夿æ¯åä¸ä¸ªè¡ä¸ºå
·æå¤ä¸ªä¸å表ç°å½¢å¼çè½åãå¨ä¸ä¿®æ¹ç¨åºä»£ç çæ
åµä¸æ¹åç¨åºè¿è¡æ¶ç»å®ç代ç ãå®ç°å¤æçä¸è¦ç´ ï¼ç»§æ¿ãéåãç¶ç±»å¼ç¨æåå类对象ã
- éæå¤ææ§ï¼éè¿éè½½å®ç°ï¼ç¸åçæ¹æ³æä¸åçåæ°å表ï¼å¯ä»¥æ ¹æ®åæ°çä¸åï¼ååºä¸åçå¤çã
- 卿夿æ§ï¼å¨åç±»ä¸éåç¶ç±»çæ¹æ³ãè¿è¡æé´å¤ææå¼ç¨å¯¹è±¡çå®é
ç±»åï¼æ ¹æ®å
¶å®é
ç±»åè°ç¨ç¸åºçæ¹æ³ã
4ãæ½è±¡ãæå®¢è§äºç©ç¨ä»£ç æ½è±¡åºæ¥ã
## Javaçåºæ¬æ°æ®ç±»åæåªäºï¼
- byteï¼8bit
- charï¼16bit
- shortï¼16bit
- intï¼32bit
- floatï¼32bit
- longï¼64bit
- doubleï¼64bit
- booleanï¼åªæä¸¤ä¸ªå¼ï¼trueãfalseï¼å¯ä»¥ä½¿â½¤ç¨ 1 bit æ¥åå¨
| ç®åç±»å | boolean | byte | char | short | Int | long | float | double |
| ---------- | ------- | ---- | --------- | ----- | ------- | ---- | ----- | ------ |
| äºè¿å¶ä½æ° | 1 | 8 | 16 | 16 | 32 | 64 | 32 | 64 |
| å
è£
ç±» | Boolean | Byte | Character | Short | Integer | Long | Float | Double |
å¨Javaè§èä¸ï¼æ²¡ææç¡®æåºbooleanç大å°ãå¨ãJavaèææºè§èãç»åºäºå个booleanå 4个åèï¼åbooleanæ°ç»1个åèçå®ä¹ï¼å
·ä½ **è¿è¦çèææºå®ç°æ¯å¦æç
§è§èæ¥**ï¼å æ¤booleanå ç¨1个åèæè
4个åè齿¯æå¯è½çã
## 为ä»ä¹ä¸è½ç¨æµ®ç¹å表示éé¢ï¼
ç±äºè®¡ç®æºä¸ä¿åçå°æ°å
¶å®æ¯åè¿å¶çå°æ°çè¿ä¼¼å¼ï¼å¹¶ä¸æ¯åç¡®å¼ï¼æä»¥ï¼åä¸ä¸è¦å¨ä»£ç ä¸ä½¿ç¨æµ®ç¹æ°æ¥è¡¨ç¤ºéé¢çéè¦çææ ã
建议使ç¨BigDecimalæè
Longæ¥è¡¨ç¤ºéé¢ã
## ä»ä¹æ¯å¼ä¼ éåå¼ç¨ä¼ éï¼
- å¼ä¼ éæ¯å¯¹åºæ¬ååéèè¨çï¼ä¼ éçæ¯è¯¥åéçä¸ä¸ªå¯æ¬ï¼æ¹å坿¬ä¸å½±åååéã
- å¼ç¨ä¼ éä¸è¬æ¯å¯¹äºå¯¹è±¡ååéèè¨çï¼ä¼ éçæ¯è¯¥å¯¹è±¡å°åçä¸ä¸ªå¯æ¬ï¼å¹¶ä¸æ¯å对象æ¬èº«ï¼ä¸¤è
æååä¸çå
å空é´ãæä»¥å¯¹å¼ç¨å¯¹è±¡è¿è¡æä½ä¼åæ¶æ¹åå对象ã
**javaä¸ä¸åå¨å¼ç¨ä¼ éï¼åªæå¼ä¼ é**ãå³ä¸åå¨åéaæååébï¼åébæå对象çè¿ç§æ
åµã
## äºè§£Javaçå
è£
ç±»ååï¼ä¸ºä»ä¹éè¦å
è£
ç±»ï¼
Java æ¯ä¸ç§é¢å对象è¯è¨ï¼å¾å¤å°æ¹é½éè¦ä½¿ç¨å¯¹è±¡è䏿¯åºæ¬æ°æ®ç±»åãæ¯å¦ï¼å¨éåç±»ä¸ï¼æä»¬æ¯æ æ³å° int ãdouble çç±»åæ¾è¿å»çãå 为éåç容å¨è¦æ±å
ç´ æ¯ Object ç±»åã
为äºè®©åºæ¬ç±»åä¹å
·æå¯¹è±¡çç¹å¾ï¼å°±åºç°äºå
è£
ç±»åãç¸å½äºå°åºæ¬ç±»åå
è£
èµ·æ¥ï¼ä½¿å¾å®å
·æäºå¯¹è±¡çæ§è´¨ï¼å¹¶ä¸ä¸ºå
¶æ·»å äºå±æ§åæ¹æ³ï¼ä¸°å¯äºåºæ¬ç±»åçæä½ã
## èªå¨è£
ç®±åæç®±
Javaä¸åºç¡æ°æ®ç±»åä¸å®ä»¬å¯¹åºçå
è£
ç±»è§ä¸è¡¨ï¼
| åå§ç±»å | å
è£
ç±»å |
| :------- | :-------- |
| boolean | Boolean |
| byte | Byte |
| char | Character |
| float | Float |
| int | Integer |
| long | Long |
| short | Short |
| double | Double |
è£
ç®±ï¼å°åºç¡ç±»å转å为å
è£
ç±»åã
æç®±ï¼å°å
è£
ç±»å转å为åºç¡ç±»åã
å½åºç¡ç±»åä¸å®ä»¬çå
è£
ç±»æå¦ä¸å ç§æ
嵿¶ï¼ç¼è¯å¨ä¼**èªå¨**帮æä»¬è¿è¡è£
ç®±ææç®±ï¼
- èµå¼æä½ï¼è£
ç®±ææç®±ï¼
- è¿è¡å åä¹é¤æ··åè¿ç® ï¼æç®±ï¼
- è¿è¡>,<,==æ¯è¾è¿ç®ï¼æç®±ï¼
- è°ç¨equalsè¿è¡æ¯è¾ï¼è£
ç®±ï¼
- ArrayListãHashMapçéå类添å åºç¡ç±»åæ°æ®æ¶ï¼è£
ç®±ï¼
示ä¾ä»£ç ï¼
```java
Integer x = 1; // è£
ç®± è°â½¤ Integer.valueOf(1)
int y = x; // æç®± è°â½¤ï¦º X.intValue()
```
ä¸é¢çä¸é常è§çé¢è¯é¢ï¼
```java
Integer a = 100;
Integer b = 100;
System.out.println(a == b);
Integer c = 200;
Integer d = 200;
System.out.println(c == d);
```
è¾åºï¼
```java
true
false
```
为ä»ä¹ç¬¬ä¸ä¸ªè¾åºæ¯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);
}
```
`Integer c = 200;` ä¼è°ç¨ è°â½¤`Integer.valueOf(200)`ãèä»IntegerçvalueOf()æºç å¯ä»¥çå°ï¼è¿éçå®ç°å¹¶ä¸æ¯ç®åçnew Integerï¼èæ¯ç¨IntegerCacheåä¸ä¸ªcacheã
```java
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
}
...
}
```
è¿æ¯IntegerCacheéæä»£ç åä¸ç䏿®µï¼é»è®¤Integer cache çä¸éæ¯-128ï¼ä¸éé»è®¤127ãå½èµå¼100ç»Integeræ¶ï¼å好å¨è¿ä¸ªèå´å
ï¼æä»¥ä»cacheä¸å对åºçIntegerå¹¶è¿åï¼æä»¥aåbè¿åçæ¯åä¸ä¸ªå¯¹è±¡ï¼æä»¥==æ¯è¾æ¯ç¸ççï¼å½èµå¼200ç»Integeræ¶ï¼ä¸å¨cache çèå´å
ï¼æä»¥ä¼new Integerå¹¶è¿åï¼å½ç¶==æ¯è¾çç»ææ¯ä¸ç¸ççã
## String 为ä»ä¹ä¸å¯åï¼
å
ççä»ä¹æ¯ä¸å¯åç对象ã
妿ä¸ä¸ªå¯¹è±¡ï¼å¨å®åå»ºå®æä¹åï¼ä¸è½åæ¹åå®çç¶æï¼é£ä¹è¿ä¸ªå¯¹è±¡å°±æ¯ä¸å¯åçãä¸è½æ¹åç¶æçæææ¯ï¼ä¸è½æ¹å对象å
çæååéï¼å
æ¬åºæ¬æ°æ®ç±»åçå¼ä¸è½æ¹åï¼å¼ç¨ç±»åçåéä¸è½æåå
¶ä»ç对象ï¼å¼ç¨ç±»åæåç对象çç¶æä¹ä¸è½æ¹åã
æ¥çæ¥çJava8 Stringç±»çæºç ï¼
```java
public final class String
implements java.io.Serializable, Comparable, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
}
```
仿ºç å¯ä»¥çåºï¼String对象å
¶å®å¨å
é¨å°±æ¯ä¸ä¸ªä¸ªå符ï¼åå¨å¨è¿ä¸ªvalueæ°ç»éé¢çã
valueæ°ç»ç¨final修饰ï¼final 修饰çåéï¼å¼ä¸è½è¢«ä¿®æ¹ãå æ¤valueä¸å¯ä»¥æåå
¶ä»å¯¹è±¡ã
Stringç±»å
鍿æçåæ®µé½æ¯ç§æçï¼ä¹å°±æ¯è¢«private修饰ãèä¸String没æå¯¹å¤æä¾ä¿®æ¹å
é¨ç¶æçæ¹æ³ï¼å æ¤valueæ°ç»ä¸è½æ¹åã
æä»¥ï¼Stringæ¯ä¸å¯åçã
é£ä¸ºä»ä¹Stringè¦è®¾è®¡æä¸å¯åçï¼
ä¸»è¦æä»¥ä¸å ç¹åå ï¼
1. **线ç¨å®å
¨**ãåä¸ä¸ªå符串å®ä¾å¯ä»¥è¢«å¤ä¸ªçº¿ç¨å
±äº«ï¼å 为å符串ä¸å¯åï¼æ¬èº«å°±æ¯çº¿ç¨å®å
¨çã
2. **æ¯æhashæ å°åç¼åã**å 为Stringçhashå¼ç»å¸¸ä¼ä½¿ç¨å°ï¼æ¯å¦ä½ä¸º Map çé®ï¼ä¸å¯åçç¹æ§ä½¿å¾ hash å¼ä¹ä¸ä¼åï¼ä¸éè¦éæ°è®¡ç®ã
3. **åºäºå®å
¨èè**ãç½ç»å°åURLãæä»¶è·¯å¾pathãå¯ç é常æ
åµä¸é½æ¯ä»¥Stringç±»åä¿åï¼åè¥String䏿¯åºå®ä¸åçï¼å°ä¼å¼èµ·åç§å®å
¨éæ£ãæ¯å¦å°å¯ç ç¨Stringçç±»åä¿åï¼é£ä¹å®å°ä¸ç´çå¨å
åä¸ï¼ç´å°å徿¶é卿宿¸
é¤ãåå¦Stringç±»ä¸æ¯åºå®ä¸åçï¼é£ä¹è¿ä¸ªå¯ç å¯è½ä¼è¢«æ¹åï¼å¯¼è´åºç°å®å
¨éæ£ã
3. **åç¬¦ä¸²å¸¸éæ± ä¼å**ãString对象å建ä¹åï¼ä¼ç¼åå°åç¬¦ä¸²å¸¸éæ± ä¸ï¼ä¸æ¬¡éè¦åå»ºåæ ·ç对象æ¶ï¼å¯ä»¥ç´æ¥è¿åç¼åçå¼ç¨ã
æ¢ç¶æä»¬çStringæ¯ä¸å¯åçï¼å®å
é¨è¿æå¾å¤substringï¼ replaceï¼ replaceAllè¿äºæä½çæ¹æ³ãè¿äºæ¹æ³å¥½å伿¹åStringå¯¹è±¡ï¼æä¹è§£éå¢ï¼
å
¶å®ä¸æ¯çï¼æä»¬æ¯æ¬¡è°ç¨replaceçæ¹æ³ï¼å
¶å®ä¼å¨å å
åä¸å建äºä¸ä¸ªæ°ç对象ãç¶åå
¶valueæ°ç»å¼ç¨æåä¸åç对象ã
## String, StringBuffer å StringBuilderåºå«
**1. å¯åæ§**
- String ä¸å¯å
- StringBuffer å StringBuilder å¯å
**2. 线ç¨å®å
¨**
- String ä¸å¯åï¼å æ¤æ¯çº¿ç¨å®å
¨ç
- StringBuilder 䏿¯çº¿ç¨å®å
¨ç
- StringBuffer æ¯çº¿ç¨å®å
¨çï¼å
é¨ä½¿ç¨ synchronized è¿è¡åæ¥
## ä»ä¹æ¯StringJoinerï¼
StringJoineræ¯ Java 8 æ°å¢çä¸ä¸ª APIï¼å®åºäº StringBuilder å®ç°ï¼ç¨äºå®ç°å¯¹å符串ä¹é´éè¿åéç¬¦æ¼æ¥çåºæ¯ã
StringJoiner æä¸¤ä¸ªæé æ¹æ³ï¼ç¬¬ä¸ä¸ªæé è¦æ±ä¾æ¬¡ä¼ å
¥åé符ãåç¼ååç¼ã第äºä¸ªæé ååªè¦æ±ä¼ å
¥åé符å³å¯ï¼åç¼ååç¼é»è®¤ä¸ºç©ºå符串ï¼ã
```java
StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
StringJoiner(CharSequence delimiter)
```
æäºåç¬¦ä¸²æ¼æ¥åºæ¯ï¼ä½¿ç¨ StringBuffer æ StringBuilder 忾徿¯è¾ç¹çã
æ¯å¦ä¸é¢çä¾åï¼
```java
List values = Arrays.asList(1, 3, 5);
StringBuilder sb = new StringBuilder("(");
for (int i = 0; i < values.size(); i++) {
sb.append(values.get(i));
if (i != values.size() -1) {
sb.append(",");
}
}
sb.append(")");
```
èéè¿StringJoineræ¥å®ç°æ¼æ¥Listçå个å
ç´ ï¼ä»£ç çèµ·æ¥æ´å ç®æ´ã
```java
List values = Arrays.asList(1, 3, 5);
StringJoiner sj = new StringJoiner(",", "(", ")");
for (Integer value : values) {
sj.add(value.toString());
}
```
å¦å¤ï¼åå¹³æ¶ç»å¸¸ä½¿ç¨çCollectors.joining(",")ï¼åºå±å°±æ¯éè¿StringJoinerå®ç°çã
æºç å¦ä¸ï¼
```java
public static Collector joining(
CharSequence delimiter,CharSequence prefix,CharSequence suffix) {
return new CollectorImpl<>(
() -> new StringJoiner(delimiter, prefix, suffix),
StringJoiner::add, StringJoiner::merge,
StringJoiner::toString, CH_NOID);
}
```
## String ç±»çå¸¸ç¨æ¹æ³æåªäºï¼
- indexOf()ï¼è¿åæå®å符çç´¢å¼ã
- charAt()ï¼è¿åæå®ç´¢å¼å¤çå符ã
- replace()ï¼åç¬¦ä¸²æ¿æ¢ã
- trim()ï¼å»é¤å符串两端空ç½ã
- split()ï¼åå²å符串ï¼è¿åä¸ä¸ªåå²åçå符串æ°ç»ã
- getBytes()ï¼è¿åå符串ç byte ç±»åæ°ç»ã
- length()ï¼è¿åå符串é¿åº¦ã
- toLowerCase()ï¼å°å符串转æå°å忝ã
- toUpperCase()ï¼å°å符串转æå¤§åå符ã
- substring()ï¼æªåå符串ã
- equals()ï¼å符串æ¯è¾ã
## new String("dabin")ä¼å建å 个对象ï¼
使ç¨è¿ç§æ¹å¼ä¼å建两个å符串对象ï¼åææ¯åç¬¦ä¸²å¸¸éæ± 䏿²¡æ "dabin" è¿ä¸ªå符串对象ï¼ã
- "dabin" å±äºå符串åé¢éï¼å æ¤ç¼è¯æ¶æä¼å¨åç¬¦ä¸²å¸¸éæ± ä¸å建ä¸ä¸ªåç¬¦ä¸²å¯¹è±¡ï¼æåè¿ä¸ª "dabin" å符串åé¢éï¼
- ä½¿ç¨ new çæ¹å¼ä¼å¨å ä¸å建ä¸ä¸ªå符串对象ã
## ä»ä¹æ¯åç¬¦ä¸²å¸¸éæ± ï¼
åç¬¦ä¸²å¸¸éæ± ï¼String Poolï¼ä¿åçææå符串åé¢éï¼è¿äºåé¢éå¨ç¼è¯æ¶æå°±ç¡®å®ãåç¬¦ä¸²å¸¸éæ± ä½äºå å
åä¸ï¼ä¸é¨ç¨æ¥åå¨å符串常éãå¨å建å符串æ¶ï¼JVMé¦å
伿£æ¥åç¬¦ä¸²å¸¸éæ± ï¼å¦æè¯¥å符串已ç»å卿± ä¸ï¼åè¿åå
¶å¼ç¨ï¼å¦æä¸åå¨ï¼åå建æ¤å符串并æ¾å
¥æ± ä¸ï¼å¹¶è¿åå
¶å¼ç¨ã
## Objectå¸¸ç¨æ¹æ³æåªäºï¼
Javaé¢è¯ç»å¸¸ä¼åºç°çä¸éé¢ç®ï¼Objectçå¸¸ç¨æ¹æ³ãä¸é¢ç»å¤§å®¶æ´çä¸ä¸ã
Objectå¸¸ç¨æ¹æ³æï¼`toString()`ã`equals()`ã`hashCode()`ã`clone()`çã
**toString**
é»è®¤è¾åºå¯¹è±¡å°åã
```java
public class Person {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public static void main(String[] args) {
System.out.println(new Person(18, "ç¨åºå大彬").toString());
}
//output
//me.tyson.java.core.Person@4554617c
}
```
å¯ä»¥éåtoStringæ¹æ³ï¼æç
§éåé»è¾è¾åºå¯¹è±¡å¼ã
```java
public class Person {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return name + ":" + age;
}
public static void main(String[] args) {
System.out.println(new Person(18, "ç¨åºå大彬").toString());
}
//output
//ç¨åºå大彬:18
}
```
**equals**
é»è®¤æ¯è¾ä¸¤ä¸ªå¼ç¨å鿝妿ååä¸ä¸ªå¯¹è±¡ï¼å
åå°åï¼ã
```java
public class Person {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public static void main(String[] args) {
String name = "ç¨åºå大彬";
Person p1 = new Person(18, name);
Person p2 = new Person(18, name);
System.out.println(p1.equals(p2));
}
//output
//false
}
```
å¯ä»¥éåequalsæ¹æ³ï¼æç
§ageånameæ¯å¦ç¸çæ¥å¤æï¼
```java
public class Person {
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (o instanceof Person) {
Person p = (Person) o;
return age == p.age && name.equals(p.name);
}
return false;
}
public static void main(String[] args) {
String name = "ç¨åºå大彬";
Person p1 = new Person(18, name);
Person p2 = new Person(18, name);
System.out.println(p1.equals(p2));
}
//output
//true
}
```
**hashCode**
å°ä¸å¯¹è±¡ç¸å
³çä¿¡æ¯æ å°æä¸ä¸ªåå¸å¼ï¼é»è®¤çå®ç°hashCode弿¯æ ¹æ®å
åå°åæ¢ç®åºæ¥ã
```java
public class Cat {
public static void main(String[] args) {
System.out.println(new Cat().hashCode());
}
//out
//1349277854
}
```
**clone**
Javaèµå¼æ¯å¤å¶å¯¹è±¡å¼ç¨ï¼å¦ææä»¬æ³è¦å¾å°ä¸ä¸ªå¯¹è±¡ç坿¬ï¼ä½¿ç¨èµå¼æä½æ¯æ æ³è¾¾å°ç®ççãObject对象æä¸ªclone()æ¹æ³ï¼å®ç°äºå¯¹
象ä¸åä¸ªå±æ§çå¤å¶ï¼ä½å®çå¯è§èå´æ¯protectedçã
```java
protected native Object clone() throws CloneNotSupportedException;
```
æä»¥å®ä½ç±»ä½¿ç¨å
éçåææ¯ï¼
- å®ç°Cloneableæ¥å£ï¼è¿æ¯ä¸ä¸ªæ è®°æ¥å£ï¼èªèº«æ²¡ææ¹æ³ï¼è¿åºè¯¥æ¯ä¸ç§çº¦å®ãè°ç¨cloneæ¹æ³æ¶ï¼ä¼å¤æææ²¡æå®ç°Cloneableæ¥å£ï¼æ²¡æå®ç°Cloneableçè¯ä¼æå¼å¸¸CloneNotSupportedExceptionã
- è¦çclone()æ¹æ³ï¼å¯è§æ§æå为publicã
```java
public class Cat implements Cloneable {
private String name;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
Cat c = new Cat();
c.name = "ç¨åºå大彬";
Cat cloneCat = (Cat) c.clone();
c.name = "大彬";
System.out.println(cloneCat.name);
}
//output
//ç¨åºå大彬
}
```
**getClass**
è¿åæ¤ Object çè¿è¡æ¶ç±»ï¼å¸¸ç¨äºjavaåå°æºå¶ã
```java
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public static void main(String[] args) {
Person p = new Person("ç¨åºå大彬");
Class clz = p.getClass();
System.out.println(clz);
//è·åç±»å
System.out.println(clz.getName());
}
/**
* class com.tyson.basic.Person
* com.tyson.basic.Person
*/
}
```
**wait**
å½å线ç¨è°ç¨å¯¹è±¡çwait()æ¹æ³ä¹åï¼å½å线ç¨ä¼éæ¾å¯¹è±¡éï¼è¿å
¥çå¾
ç¶æãçå¾
å
¶ä»çº¿ç¨è°ç¨æ¤å¯¹è±¡çnotify()/notifyAll()å¤éæè
çå¾
è¶
æ¶æ¶é´wait(long timeout)èªå¨å¤éã线ç¨éè¦è·åobj对象éä¹åæè½è°ç¨ obj.wait()ã
**notify**
obj.notify()å¤é卿¤å¯¹è±¡ä¸çå¾
çå个线ç¨ï¼éæ©æ¯ä»»ææ§çãnotifyAll()å¤é卿¤å¯¹è±¡ä¸çå¾
çææçº¿ç¨ã
## 讲讲深æ·è´åæµ
æ·è´ï¼
**æµ
æ·è´**ï¼æ·â»å¯¹è±¡ååå§å¯¹è±¡çå¼â½¤ç±»åå¼ç¨åâ¼ä¸ªå¯¹è±¡ã
以ä¸ä¾åï¼Cat对象éé¢æä¸ªPerson对象ï¼è°ç¨cloneä¹åï¼å
é对象åå对象çPersonå¼ç¨çæ¯åä¸ä¸ªå¯¹è±¡ï¼è¿å°±æ¯æµ
æ·è´ã
```java
public class Cat implements Cloneable {
private String name;
private Person owner;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
Cat c = new Cat();
Person p = new Person(18, "ç¨åºå大彬");
c.owner = p;
Cat cloneCat = (Cat) c.clone();
p.setName("大彬");
System.out.println(cloneCat.owner.getName());
}
//output
//大彬
}
```
**æ·±æ·è´**ï¼æ·è´å¯¹è±¡ååå§å¯¹è±¡çå¼ç¨ç±»åå¼ç¨ä¸åç对象ã
以ä¸ä¾åï¼å¨clone彿°ä¸ä¸ä»
è°ç¨äºsuper.cloneï¼èä¸è°ç¨Person对象çcloneæ¹æ³ï¼Personä¹è¦å®ç°Cloneableæ¥å£å¹¶éåcloneæ¹æ³ï¼ï¼ä»èå®ç°äºæ·±æ·è´ãå¯ä»¥çå°ï¼æ·è´å¯¹è±¡çå¼ä¸ä¼åå°å对象çå½±åã
```java
public class Cat implements Cloneable {
private String name;
private Person owner;
@Override
protected Object clone() throws CloneNotSupportedException {
Cat c = null;
c = (Cat) super.clone();
c.owner = (Person) owner.clone();//æ·è´Person对象
return c;
}
public static void main(String[] args) throws CloneNotSupportedException {
Cat c = new Cat();
Person p = new Person(18, "ç¨åºå大彬");
c.owner = p;
Cat cloneCat = (Cat) c.clone();
p.setName("大彬");
System.out.println(cloneCat.owner.getName());
}
//output
//ç¨åºå大彬
}
```
## 两个对象çhashCode()ç¸åï¼å equals()æ¯å¦ä¹ä¸å®ä¸º trueï¼
equalsä¸hashcodeçå
³ç³»ï¼
1. å¦æä¸¤ä¸ªå¯¹è±¡è°ç¨equalsæ¯è¾è¿åtrueï¼é£ä¹å®ä»¬çhashCodeå¼ä¸å®è¦ç¸åï¼
2. å¦æä¸¤ä¸ªå¯¹è±¡çhashCodeç¸åï¼å®ä»¬å¹¶ä¸ä¸å®ç¸åã
hashcodeæ¹æ³ä¸»è¦æ¯ç¨æ¥**æå对象æ¯è¾çæç**ï¼å
è¿è¡hashcode()çæ¯è¾ï¼å¦æä¸ç¸åï¼é£å°±ä¸å¿
å¨è¿è¡equalsçæ¯è¾ï¼è¿æ ·å°±å¤§å¤§åå°äºequalsæ¯è¾ç次æ°ï¼å½æ¯è¾å¯¹è±¡çæ°éå¾å¤§çæ¶åè½æåæçã
乿以éå`equals()`è¦éå`hashcode()`ï¼æ¯ä¸ºäºä¿è¯`equals()`æ¹æ³è¿åtrueçæ
åµä¸hashcodeå¼ä¹è¦ä¸è´ï¼å¦æéåäº`equals()`没æéå`hashcode()`ï¼å°±ä¼åºç°ä¸¤ä¸ªå¯¹è±¡ç¸çä½`hashcode()`ä¸ç¸ççæ
åµãè¿æ ·ï¼å½ç¨å
¶ä¸çä¸ä¸ªå¯¹è±¡ä½ä¸ºé®ä¿åå°hashMapãhashTableæhashSetä¸ï¼å以å¦ä¸ä¸ªå¯¹è±¡ä½ä¸ºé®å¼å»æ¥æ¾ä»ä»¬çæ¶åï¼å伿¥æ¾ä¸å°ã
## Javaå建对象æå ç§æ¹å¼ï¼
Javaå建对象æä»¥ä¸å ç§æ¹å¼ï¼
- ç¨newè¯å¥å建对象ã
- 使ç¨åå°ï¼ä½¿ç¨Class.newInstance()å建对象ã
- è°ç¨å¯¹è±¡çclone()æ¹æ³ã
- è¿ç¨ååºååææ®µï¼è°ç¨java.io.ObjectInputStream对象çreadObject()æ¹æ³ã
## 说说类å®ä¾åç顺åº
Javaä¸ç±»å®ä¾å顺åºï¼
1. éæå±æ§ï¼éæä»£ç åã
2. æ®é屿§ï¼æ®é代ç åã
3. æé æ¹æ³ã
```java
public class LifeCycle {
// éæå±æ§
private static String staticField = getStaticField();
// éæä»£ç å
static {
System.out.println(staticField);
System.out.println("éæä»£ç ååå§å");
}
// æ®é屿§
private String field = getField();
// æ®é代ç å
{
System.out.println(field);
System.out.println("æ®é代ç ååå§å");
}
// æé æ¹æ³
public LifeCycle() {
System.out.println("æé æ¹æ³åå§å");
}
// éææ¹æ³
public static String getStaticField() {
String statiFiled = "éæå±æ§åå§å";
return statiFiled;
}
// æ®éæ¹æ³
public String getField() {
String filed = "æ®é屿§åå§å";
return filed;
}
public static void main(String[] argc) {
new LifeCycle();
}
/**
* éæå±æ§åå§å
* éæä»£ç ååå§å
* æ®é屿§åå§å
* æ®é代ç ååå§å
* æé æ¹æ³åå§å
*/
}
```
## equalså==æä»ä¹åºå«ï¼
- 对äºåºæ¬æ°æ®ç±»åï¼==æ¯è¾çæ¯ä»ä»¬çå¼ãåºæ¬æ°æ®ç±»å没æequalæ¹æ³ï¼
- 对äºå¤åæ°æ®ç±»åï¼==æ¯è¾çæ¯å®ä»¬çåæ¾å°å(æ¯å¦æ¯åä¸ä¸ªå¯¹è±¡)ã`equals()`é»è®¤æ¯è¾å°åå¼ï¼éåçè¯æç
§éåé»è¾å»æ¯è¾ã
## 常è§çå
³é®åæåªäºï¼
**static**
staticå¯ä»¥ç¨æ¥ä¿®é¥°ç±»çæåæ¹æ³ãç±»çæååéã
staticåéä¹ç§°ä½**éæåé**ï¼éæåéåééæåéçåºå«æ¯ï¼éæåé被ææç对象æå
±äº«ï¼å¨å
åä¸åªæä¸ä¸ªå¯æ¬ï¼å®å½ä¸ä»
å½å¨ç±»å次å è½½æ¶ä¼è¢«åå§åãèééæåéæ¯å¯¹è±¡ææ¥æçï¼å¨åå»ºå¯¹è±¡çæ¶å被åå§åï¼åå¨å¤ä¸ªå¯æ¬ï¼åä¸ªå¯¹è±¡æ¥æç坿¬äºä¸å½±åã
以ä¸ä¾åï¼age为ééæåéï¼åp1æå°ç»ææ¯ï¼`Name:zhangsan, Age:10`ï¼è¥age使ç¨static修饰ï¼åp1æå°ç»ææ¯ï¼`Name:zhangsan, Age:12`ï¼å 为staticåéå¨å
ååªæä¸ä¸ªå¯æ¬ã
```java
public class Person {
String name;
int age;
public String toString() {
return "Name:" + name + ", Age:" + age;
}
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "zhangsan";
p1.age = 10;
Person p2 = new Person();
p2.name = "lisi";
p2.age = 12;
System.out.println(p1);
System.out.println(p2);
}
/**Output
* Name:zhangsan, Age:10
* Name:lisi, Age:12
*///~
}
```
staticæ¹æ³ä¸è¬ç§°ä½**éææ¹æ³**ãéææ¹æ³ä¸ä¾èµäºä»»ä½å¯¹è±¡å°±å¯ä»¥è¿è¡è®¿é®ï¼éè¿ç±»åå³å¯è°ç¨éææ¹æ³ã
```java
public class Utils {
public static void print(String s) {
System.out.println("hello world: " + s);
}
public static void main(String[] args) {
Utils.print("ç¨åºå大彬");
}
}
```
**éæä»£ç å**åªä¼å¨ç±»å è½½çæ¶åæ§è¡ä¸æ¬¡ã以ä¸ä¾åï¼startDateåendDateå¨ç±»å è½½çæ¶åè¿è¡èµå¼ã
```java
class Person {
private Date birthDate;
private static Date startDate, endDate;
static{
startDate = Date.valueOf("2008");
endDate = Date.valueOf("2021");
}
public Person(Date birthDate) {
this.birthDate = birthDate;
}
}
```
**éæå
é¨ç±»**
**å¨éææ¹æ³é**ï¼ä½¿ç¨â¾®éæå
é¨ç±»ä¾èµäºå¤é¨ç±»çå®ï¦µï¼ä¹å°±æ¯è¯´éè¦å
å建å¤é¨ç±»å®ï¦µï¼æè½ç¨è¿ä¸ªå®ï¦µå»å建ééæå
é¨ç±»ãâ½½éæå
é¨ç±»ï¥§éè¦ã
```java
public class OuterClass {
class InnerClass {
}
static class StaticInnerClass {
}
public static void main(String[] args) {
// å¨éææ¹æ³éï¼ä¸è½ç´æ¥ä½¿ç¨OuterClass.thiså»å建InnerClassçå®ä¾
// éè¦å
å建OuterClassçå®ä¾oï¼ç¶åéè¿oå建InnerClassçå®ä¾
// InnerClass innerClass = new InnerClass();
OuterClass outerClass = new OuterClass();
InnerClass innerClass = outerClass.new InnerClass();
StaticInnerClass staticInnerClass = new StaticInnerClass();
outerClass.test();
}
public void nonStaticMethod() {
InnerClass innerClass = new InnerClass();
System.out.println("nonStaticMethod...");
}
}
```
**final**
1. **åºæ¬æ°æ®**ç±»åç¨final修饰ï¼åä¸è½ä¿®æ¹ï¼æ¯å¸¸éï¼**对象å¼ç¨**ç¨final修饰ï¼åå¼ç¨åªè½æå该对象ï¼ä¸è½æåå«ç对象ï¼ä½æ¯å¯¹è±¡æ¬èº«å¯ä»¥ä¿®æ¹ã
2. finalä¿®é¥°çæ¹æ³ä¸è½è¢«åç±»éå
3. final修饰çç±»ä¸è½è¢«ç»§æ¿ã
**this**
`this.屿§åç§°`æè®¿é®ç±»ä¸çæååéï¼å¯ä»¥ç¨æ¥åºåæååéåå±é¨åéãå¦ä¸ä»£ç æç¤ºï¼`this.name`访é®ç±»Personå½åå®ä¾çåéã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-08-17 00:29
*/
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
```
`this.æ¹æ³åç§°`ç¨æ¥è®¿é®æ¬ç±»çæ¹æ³ã以ä¸ä»£ç ä¸ï¼`this.born()`è°ç¨ç±» Person çå½åå®ä¾çæ¹æ³ã
```java
/**
* @description:
* @author: ç¨åºå大彬
* @time: 2021-08-17 00:29
*/
public class Person {
String name;
int age;
public Person(String name, int age) {
this.born();
this.name = name;
this.age = age;
}
void born() {
}
}
```
**super**
super å
³é®åç¨äºå¨åç±»ä¸è®¿é®ç¶ç±»çåéåæ¹æ³ã
```java
class A {
protected String name = "大彬";
public void getName() {
System.out.println("ç¶ç±»:" + name);
}
}
public class B extends A {
@Override
public void getName() {
System.out.println(super.name);
super.getName();
}
public static void main(String[] args) {
B b = new B();
b.getName();
}
/**
* 大彬
* ç¶ç±»:大彬
*/
}
```
å¨åç±»Bä¸ï¼æä»¬éåäºç¶ç±»ç`getName()`æ¹æ³ï¼å¦æå¨éåç`getName()`æ¹æ³ä¸æä»¬è¦è°ç¨ç¶ç±»çç¸åæ¹æ³ï¼å¿
é¡»è¦éè¿superå
³é®åæ¾å¼æåºã
## final, finally, finalize çåºå«
- final ç¨äºä¿®é¥°å±æ§ãæ¹æ³åç±», åå«è¡¨ç¤ºå±æ§ä¸è½è¢«éæ°èµå¼ï¼æ¹æ³ä¸å¯è¢«è¦çï¼ç±»ä¸å¯è¢«ç»§æ¿ã
- finally æ¯å¼å¸¸å¤çè¯å¥ç»æçä¸é¨åï¼ä¸è¬ä»¥`try-catch-finally`åºç°ï¼`finally`代ç åè¡¨ç¤ºæ»æ¯è¢«æ§è¡ã
- finalize æ¯Objectç±»çä¸ä¸ªæ¹æ³ï¼è¯¥æ¹æ³ä¸è¬ç±åå¾åæ¶å¨æ¥è°ç¨ï¼å½æä»¬è°ç¨`System.gc()`æ¹æ³çæ¶åï¼ç±åå¾åæ¶å¨è°ç¨`finalize()`æ¹æ³ï¼åæ¶åå¾ï¼JVMå¹¶ä¸ä¿è¯æ¤æ¹æ³æ»è¢«è°ç¨ã
## finalå
³é®åçä½ç¨ï¼
- final 修饰çç±»ä¸è½è¢«ç»§æ¿ã
- final ä¿®é¥°çæ¹æ³ä¸è½è¢«éåã
- final 修饰çåéå«å¸¸éï¼å¸¸éå¿
é¡»åå§åï¼åå§åä¹åå¼å°±ä¸è½è¢«ä¿®æ¹ã
## æ¹æ³éè½½åéåçåºå«ï¼
**å个类ä¸çå¤ä¸ªæ¹æ³å¯ä»¥æç¸åçæ¹æ³åç§°ï¼ä½æ¯æä¸åçåæ°å表ï¼è¿å°±ç§°ä¸ºæ¹æ³éè½½ã**åæ°å表åå«åæ°ç¾åï¼å
æ¬åæ°çç±»åãåæ°ç个æ°ãåæ°ç顺åºï¼åªè¦æä¸ä¸ªä¸åå°±å«ååæ°å表ä¸åã
éè½½æ¯é¢å对象çä¸ä¸ªåºæ¬ç¹æ§ã
```java
public class OverrideTest {
void setPerson() { }
void setPerson(String name) {
//set name
}
void setPerson(String name, int age) {
//set name and age
}
}
```
**æ¹æ³çéåæè¿°çæ¯ç¶ç±»ååç±»ä¹é´çãå½ç¶ç±»çåè½æ æ³æ»¡è¶³åç±»çéæ±ï¼å¯ä»¥å¨åç±»å¯¹æ¹æ³è¿è¡éåã**æ¹æ³éåæ¶ï¼ æ¹æ³åä¸å½¢åå表å¿
é¡»ä¸è´ã
å¦ä¸ä»£ç ï¼Person为ç¶ç±»ï¼Student为åç±»ï¼å¨Studentä¸éåäºdailyTaskæ¹æ³ã
```java
public class Person {
private String name;
public void dailyTask() {
System.out.println("work eat sleep");
}
}
public class Student extends Person {
@Override
public void dailyTask() {
System.out.println("study eat sleep");
}
}
```
## æ¥å£ä¸æ½è±¡ç±»åºå«ï¼
1ã**è¯æ³å±é¢**ä¸çåºå«
- æ½è±¡ç±»å¯ä»¥ææ¹æ³å®ç°ï¼èæ¥å£çæ¹æ³ä¸åªè½æ¯æ½è±¡æ¹æ³ï¼Java 8 å¼å§æ¥å£æ¹æ³å¯ä»¥æé»è®¤å®ç°ï¼ï¼
- æ½è±¡ç±»ä¸çæååéå¯ä»¥æ¯åç§ç±»åçï¼æ¥å£ä¸çæååéåªè½æ¯public static finalç±»åï¼
- æ¥å£ä¸ä¸è½å«æéæä»£ç å以åéææ¹æ³ï¼èæ½è±¡ç±»å¯ä»¥æéæä»£ç ååéææ¹æ³ï¼
- ä¸ä¸ªç±»åªè½ç»§æ¿ä¸ä¸ªæ½è±¡ç±»ï¼èä¸ä¸ªç±»å´å¯ä»¥å®ç°å¤ä¸ªæ¥å£ã
2ã**设计å±é¢**ä¸çåºå«
- æ½è±¡å±æ¬¡ä¸åãæ½è±¡ç±»æ¯å¯¹æ´ä¸ªç±»æ´ä½è¿è¡æ½è±¡ï¼å
æ¬å±æ§ãè¡ä¸ºï¼ä½æ¯æ¥å£åªæ¯å¯¹ç±»è¡ä¸ºè¿è¡æ½è±¡ãç»§æ¿æ½è±¡ç±»æ¯ä¸ç§"æ¯ä¸æ¯"çå
³ç³»ï¼èæ¥å£å®ç°åæ¯ "ææ²¡æ"çå
³ç³»ã妿ä¸ä¸ªç±»ç»§æ¿äºæä¸ªæ½è±¡ç±»ï¼ååç±»å¿
宿¯æ½è±¡ç±»çç§ç±»ï¼èæ¥å£å®ç°åæ¯å
·å¤ä¸å
·å¤çå
³ç³»ï¼æ¯å¦é¸æ¯å¦è½é£ã
- ç»§æ¿æ½è±¡ç±»çæ¯å
·æç¸ä¼¼ç¹ç¹çç±»ï¼èå®ç°æ¥å£çå´å¯ä»¥ä¸åçç±»ã
é¨åè¦æ¥çä¾åï¼
```java
class AlarmDoor extends Door implements Alarm {
//code
}
class BMWCar extends Car implements Alarm {
//code
}
```
## 常è§çExceptionæåªäºï¼
常è§çRuntimeExceptionï¼
1. `ClassCastException` //ç±»å转æ¢å¼å¸¸
2. `IndexOutOfBoundsException` //æ°ç»è¶çå¼å¸¸
3. `NullPointerException` //空æé
4. `ArrayStoreException` //æ°ç»åå¨å¼å¸¸
5. `NumberFormatException` //æ°åæ ¼å¼åå¼å¸¸
6. `ArithmeticException` //æ°å¦è¿ç®å¼å¸¸
unchecked Exceptionï¼
1. `NoSuchFieldException` //åå°å¼å¸¸ï¼æ²¡æå¯¹åºçåæ®µ
2. `ClassNotFoundException` //ç±»æ²¡ææ¾å°å¼å¸¸
3. `IllegalAccessException` //å®å
¨æéå¼å¸¸ï¼å¯è½æ¯åå°æ¶è°ç¨äºprivateæ¹æ³
## ErroråExceptionçåºå«ï¼
**Error**ï¼JVM æ æ³è§£å³ç严éé®é¢ï¼å¦æ 溢åº`StackOverflowError`ãå
åæº¢åº`OOM`çãç¨åºæ æ³å¤ççé误ã
**Exception**ï¼å
¶å®å ç¼ç¨é误æå¶ç¶çå¤å¨å ç´ å¯¼è´çä¸è¬æ§é®é¢ãå¯ä»¥å¨ä»£ç ä¸è¿è¡å¤çãå¦ï¼ç©ºæéå¼å¸¸ãæ°ç»ä¸æ è¶ççã
## è¿è¡æ¶å¼å¸¸åéè¿è¡æ¶å¼å¸¸ï¼checkedï¼çåºå«ï¼
`unchecked exception`å
æ¬`RuntimeException`å`Error`ç±»ï¼å
¶ä»ææå¼å¸¸ç§°ä¸ºæ£æ¥ï¼checkedï¼å¼å¸¸ã
1. `RuntimeException`ç±ç¨åºé误导è´ï¼åºè¯¥ä¿®æ£ç¨åºé¿å
è¿ç±»å¼å¸¸åçã
2. `checked Exception`ç±å
·ä½çç¯å¢ï¼è¯»åçæä»¶ä¸å卿æä»¶ä¸ºç©ºæsqlå¼å¸¸ï¼å¯¼è´çå¼å¸¸ãå¿
é¡»è¿è¡å¤çï¼ä¸ç¶ç¼è¯ä¸éè¿ï¼å¯ä»¥catchæè
throwsã
## throwåthrowsçåºå«ï¼
- **throw**ï¼ç¨äºæåºä¸ä¸ªå
·ä½çå¼å¸¸å¯¹è±¡ã
- **throws**ï¼ç¨å¨æ¹æ³ç¾åä¸ï¼ç¨äºå£°æè¯¥æ¹æ³å¯è½æåºçå¼å¸¸ãåç±»æ¹æ³æåºçå¼å¸¸èå´æ´å å°ï¼æè
æ ¹æ¬ä¸æå¼å¸¸ã
## éè¿æ
äºè®²æ¸
æ¥NIO
ä¸é¢éè¿ä¸ä¸ªä¾åæ¥è®²è§£ä¸ã
å设æé¶è¡åªæ10个èåã该é¶è¡çä¸å¡æµç¨å为以ä¸4个æ¥éª¤ï¼
1ï¼ é¡¾å®¢å¡«ç³è¯·è¡¨ï¼5åéï¼ï¼
2ï¼ èåå®¡æ ¸ï¼1åéï¼ï¼
3ï¼ èåå«ä¿å®å»éåºåé±ï¼3åéï¼ï¼
4ï¼ èåæå°ç¥¨æ®ï¼å¹¶å°é±å票æ®è¿åç»é¡¾å®¢ï¼1åéï¼ã
ä¸é¢æä»¬ççé¶è¡ä¸åç工使¹å¼å¯¹å
¶å·¥ä½æçå°åºæä½å½±åã
é¦å
æ¯BIOæ¹å¼ã
æ¯æ¥ä¸ä¸ªé¡¾å®¢ï¼é©¬ä¸ç±ä¸ä½è忥æ¥å¾
å¤çï¼å¹¶ä¸è¿ä¸ªèåéè¦è´è´£ä»¥ä¸4ä¸ªå®æ´æµç¨ãå½è¶
è¿10个顾客æ¶ï¼å©ä½ç顾客éè¦æéçåã
ä¸ä¸ªèåå¤çä¸ä¸ªé¡¾å®¢éè¦10åéï¼5+1+3+1ï¼æ¶é´ãä¸ä¸ªå°æ¶ï¼60åéï¼è½å¤ç6个顾客ï¼ä¸å
±10个èåï¼é£å°±æ¯åªè½å¤ç60个顾客ã
å¯ä»¥çå°é¶è¡èåçå·¥ä½ç¶æå¹¶ä¸é¥±åï¼æ¯å¦å¨ç¬¬1æ¥ï¼å
¶å®æ¯å¤äºçå¾
ä¸ã
è¿ç§å·¥ä½å
¶å®å°±æ¯BIOï¼æ¯æ¬¡æ¥ä¸ä¸ªè¯·æ±ï¼é¡¾å®¢ï¼ï¼å°±åé
å°çº¿ç¨æ± ä¸ç±ä¸ä¸ªçº¿ç¨ï¼èåï¼å¤çï¼å¦æè¶
åºäºçº¿ç¨æ± çæå¤§ä¸éï¼10个ï¼ï¼å°±æå°éåçå¾
ã
é£ä¹å¦ä½æé«é¶è¡çååéå¢ï¼
æè·¯å°±æ¯ï¼**åèæ²»ä¹**ï¼å°ä»»å¡æå弿¥ï¼ç±ä¸é¨ç人è´è´£ä¸é¨çä»»å¡ã
å
·ä½æ¥è®²ï¼é¶è¡ä¸é¨ææ´¾ä¸åèåAï¼Açå·¥ä½å°±æ¯æ¯å½æé¡¾å®¢å°é¶è¡ï¼ä»å°±éä¸è¡¨æ ¼è®©é¡¾å®¢å¡«åãæ¯å½æé¡¾å®¢å¡«å¥½è¡¨åï¼Aå°±å°å
¶éæºææ´¾ç»å©ä½ç9åèå宿åç»æ¥éª¤ã
è¿ç§æ¹å¼ä¸ï¼å设顾客é常å¤ï¼èåAçå·¥ä½å¤äºé¥±åä¸ï¼ä»ä¸æçå°å¡«å¥½è¡¨ç顾客另尿å°å¤çã
æå°ä¸ä¸ªèå5åéè½å¤çå®ä¸ä¸ªé¡¾å®¢ï¼ä¸ä¸ªå°æ¶9åèåè½å¤çï¼9*ï¼60/5ï¼=108ã
å¯è§å·¥ä½æ¹å¼ç转åè½å¸¦æ¥æççæå¤§æåã
è¿ç§å·¥ä½æ¹å¼å
¶å®å°±NIOçæè·¯ã
ä¸å¾æ¯é常ç»å
¸çNIO说æå¾ï¼`mainReactor`线ç¨è´è´£çå¬server socketï¼æ¥æ¶æ°è¿æ¥ï¼å¹¶å°å»ºç«çsocketåæ´¾ç»`subReactor`
`subReactor`å¯ä»¥æ¯ä¸ä¸ªçº¿ç¨ï¼ä¹å¯ä»¥æ¯çº¿ç¨æ± ï¼è´è´£å¤è·¯åç¦»å·²è¿æ¥çsocketï¼è¯»åç½ç»æ°æ®ãè¿éç读åç½ç»æ°æ®å¯ç±»æ¯é¡¾å®¢å¡«è¡¨è¿ä¸èæ¶å¨ä½ï¼å¯¹å
·ä½çä¸å¡å¤çåè½ï¼å
¶æç»workerçº¿ç¨æ± 宿
å¯ä»¥çå°å
¸åNIOæä¸ç±»çº¿ç¨ï¼å嫿¯`mainReactor`线ç¨ã`subReactor`线ç¨ã`work`线ç¨ã
ä¸åç线ç¨å¹²ä¸ä¸çäºæ
ï¼æç»æ¯ä¸ªçº¿ç¨é½æ²¡ç©ºçï¼ç³»ç»çååéèªç¶å°±ä¸å»äºã

**é£è¿ä¸ªæµç¨è¿ææ²¡æä»ä¹å¯ä»¥æé«çå°æ¹å¢ï¼**
å¯ä»¥çå°ï¼å¨è¿ä¸ªä¸å¡æµç¨é边第3个æ¥éª¤ï¼èåå«ä¿å®å»éåºåé±ï¼3åéï¼ãè¿3åéæå°è忝å¨çå¾
ä¸åº¦è¿çï¼å¯ä»¥æè¿3åéå©ç¨èµ·æ¥ã
è¿æ¯åèæ²»ä¹çæè·¯ï¼ææ´¾1个èåBæ¥ä¸é¨è´è´£ç¬¬3æ¥éª¤ã
æ¯å½æå°åå·¥å®æç¬¬2æ¥æ¶ï¼å°±éç¥èåBæ¥è´è´£ä¸ä¿å®æ²éåé±ãè¿æ¶åæå°åå·¥å¯ä»¥ç»§ç»å¤çä¸ä¸ä¸ªé¡¾å®¢ã
å½èåBæ¿å°é±ä¹åï¼éç¥é¡¾å®¢é±å·²ç»å°æå°äºï¼è®©é¡¾å®¢éæ°æéå¤çï¼å½æå°èå忬¡æå¡è¯¥é¡¾å®¢æ¶ï¼åç°è¯¥é¡¾å®¢å3æ¥å·²ç»å®æï¼ç´æ¥æ§è¡ç¬¬4æ¥å³å¯ã
å¨å½ä»webæå¡ä¸ï¼ç»å¸¸éè¦éè¿RPCæè
Httpçæ¹å¼è°ç¨ç¬¬ä¸æ¹æå¡ï¼è¿é对åºçå°±æ¯ç¬¬3æ¥ï¼å¦æè¿æ¥èæ¶è¾é¿ï¼éè¿å¼æ¥æ¹å¼å°è½æå¤§éä½èµæºä½¿ç¨çã
NIO+弿¥çæ¹å¼è½è®©å°éç线ç¨å大éçäºæ
ãè¿éç¨äºå¾å¤åºç¨åºæ¯ï¼æ¯å¦ä»£çæå¡ãapiæå¡ãé¿è¿æ¥æå¡ççãè¿äºåºç¨å¦æç¨åæ¥æ¹å¼å°èè´¹å¤§éæºå¨èµæºã
ä¸è¿è½ç¶NIO+弿¥è½æé«ç³»ç»ååéï¼ä½å
¶å¹¶ä¸è½è®©ä¸ä¸ªè¯·æ±ççå¾
æ¶é´ä¸éï¼ç¸åå¯è½ä¼å¢å çå¾
æ¶é´ã
æåï¼NIOåºæ¬ææ³æ»ç»èµ·æ¥å°±æ¯ï¼**åèæ²»ä¹ï¼å°ä»»å¡æå弿¥ï¼ç±ä¸é¨ç人è´è´£ä¸é¨çä»»å¡**
## BIO/NIO/AIOåºå«çåºå«ï¼
**忥é»å¡IO** : ç¨æ·è¿ç¨åèµ·ä¸ä¸ªIOæä½ä»¥åï¼å¿
é¡»çå¾
IOæä½ççæ£å®æåï¼æè½ç»§ç»è¿è¡ã
**忥éé»å¡IO**: 客æ·ç«¯ä¸æå¡å¨éè¿Channelè¿æ¥ï¼éç¨å¤è·¯å¤ç¨å¨è½®è¯¢æ³¨åç`Channel`ãæé«ååéåå¯é æ§ãç¨æ·è¿ç¨åèµ·ä¸ä¸ªIOæä½ä»¥åï¼å¯åå
¶å®äºæ
ï¼ä½ç¨æ·è¿ç¨éè¦è½®è¯¢IOæä½æ¯å¦å®æï¼è¿æ ·é æä¸å¿
è¦çCPUèµæºæµªè´¹ã
**弿¥éé»å¡IO**: éé»å¡å¼æ¥é信模å¼ï¼NIOçå级çï¼éç¨å¼æ¥ééå®ç°å¼æ¥éä¿¡ï¼å
¶readåwriteæ¹æ³åæ¯å¼æ¥æ¹æ³ãç¨æ·è¿ç¨åèµ·ä¸ä¸ªIOæä½ï¼ç¶åç«å³è¿åï¼çIOæä½çæ£ç宿以åï¼åºç¨ç¨åºä¼å¾å°IOæä½å®æçéç¥ã类似Future模å¼ã
## 宿¤çº¿ç¨æ¯ä»ä¹ï¼
- 宿¤çº¿ç¨æ¯è¿è¡å¨åå°çä¸ç§ç¹æ®è¿ç¨ã
- å®ç¬ç«äºæ§å¶ç»ç«¯å¹¶ä¸å¨ææ§å°æ§è¡æç§ä»»å¡æçå¾
å¤çæäºåççäºä»¶ã
- å¨ Java ä¸åå¾åæ¶çº¿ç¨å°±æ¯ç¹æ®ç宿¤çº¿ç¨ã
## Javaæ¯æå¤ç»§æ¿åï¼
javaä¸ï¼**ç±»ä¸æ¯æ**å¤ç»§æ¿ã**æ¥å£ææ¯æ**å¤ç»§æ¿ãæ¥å£çä½ç¨æ¯æå±å¯¹è±¡åè½ãå½ä¸ä¸ªåæ¥å£ç»§æ¿äºå¤ä¸ªç¶æ¥å£æ¶ï¼è¯´æåæ¥å£æå±äºå¤ä¸ªåè½ãå½ä¸ä¸ªç±»å®ç°è¯¥æ¥å£æ¶ï¼å°±æå±äºå¤ä¸ªçåè½ã
Java䏿¯æå¤ç»§æ¿çåå ï¼
- åºäºå®å
¨æ§çèèï¼å¦æå类继æ¿çå¤ä¸ªç¶ç±»é颿ç¸åçæ¹æ³æè
屿§ï¼åç±»å°ä¸ç¥éå
·ä½è¦ç»§æ¿åªä¸ªã
- Javaæä¾äºæ¥å£åå
é¨ç±»ä»¥è¾¾å°å®ç°å¤ç»§æ¿åè½ï¼å¼¥è¡¥åç»§æ¿ç缺é·ã
## å¦ä½å®ç°å¯¹è±¡å
éï¼
- å®ç°`Cloneable`æ¥å£ï¼éå `clone()` æ¹æ³ãè¿ç§æ¹å¼æ¯æµ
æ·è´ï¼å³å¦æç±»ä¸å±æ§æèªå®ä¹å¼ç¨ç±»åï¼åªæ·è´å¼ç¨ï¼ä¸æ·è´å¼ç¨æåç对象ãå¦æå¯¹è±¡ç屿§çClassä¹å®ç° `Cloneable` æ¥å£ï¼é£ä¹å¨å
é对象æ¶ä¹ä¼å
é屿§ï¼å³æ·±æ·è´ã
- ç»ååºååï¼æ·±æ·è´ã
- éè¿`org.apache.commons`ä¸çå·¥å
·ç±»`BeanUtils`å`PropertyUtils`è¿è¡å¯¹è±¡å¤å¶ã
## 忥å弿¥çåºå«ï¼
忥ï¼ååºä¸ä¸ªè°ç¨æ¶ï¼å¨æ²¡æå¾å°ç»æä¹åï¼è¯¥è°ç¨å°±ä¸è¿åã
弿¥ï¼å¨è°ç¨ååºåï¼è¢«è°ç¨è
è¿åç»æä¹åä¼éç¥è°ç¨è
ï¼æéè¿åè°å½æ°å¤çè¿ä¸ªè°ç¨ã
## é»å¡åéé»å¡çåºå«ï¼
é»å¡åéé»å¡å
³æ³¨çæ¯çº¿ç¨çç¶æã
é»å¡è°ç¨æ¯æè°ç¨ç»æè¿åä¹åï¼å½å线ç¨ä¼è¢«æèµ·ãè°ç¨çº¿ç¨åªæå¨å¾å°ç»æä¹åæä¼æ¢å¤è¿è¡ã
éé»å¡è°ç¨æå¨ä¸è½ç«å»å¾å°ç»æä¹åï¼è¯¥è°ç¨ä¸ä¼é»å¡å½å线ç¨ã
> 举个ä¾åï¼çè§£ä¸åæ¥ãé»å¡ã弿¥ãéé»å¡çåºå«ï¼
>
> 忥就æ¯ç§å¼æ°´ï¼è¦èªå·±æ¥ç弿²¡å¼ï¼å¼æ¥å°±æ¯æ°´å¼äºï¼ç¶å水壶åäºéç¥ä½ æ°´å¼äºï¼åè°éç¥ï¼ãé»å¡æ¯ç§å¼æ°´çè¿ç¨ä¸ï¼ä½ ä¸è½å¹²å
¶ä»äºæ
ï¼å¿
é¡»å¨æè¾¹ççï¼éé»å¡æ¯ç§å¼æ°´çè¿ç¨éå¯ä»¥å¹²å
¶ä»äºæ
ã
## Java8çæ°ç¹æ§æåªäºï¼
- Lambda 表达å¼ï¼Lambdaå
许æå½æ°ä½ä¸ºä¸ä¸ªæ¹æ³çåæ°
- Stream API ï¼æ°æ·»å çStream APIï¼java.util.streamï¼ æçæ£ç彿°å¼ç¼ç¨é£æ ¼å¼å
¥å°Javaä¸
- é»è®¤æ¹æ³ï¼é»è®¤æ¹æ³å°±æ¯ä¸ä¸ªå¨æ¥å£é颿äºä¸ä¸ªå®ç°çæ¹æ³ã
- Optional ç±» ï¼Optional ç±»å·²ç»æä¸º Java 8 ç±»åºçä¸é¨åï¼ç¨æ¥è§£å³ç©ºæéå¼å¸¸ã
- Date Time API ï¼å å¼ºå¯¹æ¥æä¸æ¶é´çå¤çã
> [Java8 æ°ç¹æ§æ»ç»]([Java-learning/Java8.md at master · Tyson0314/Java-learning (github.com)](https://github.com/Tyson0314/Java-learning/blob/master/Java/Java8.md))
## ä»ä¹æ¯åºåååååºååï¼
åºååï¼æå
åä¸ç对象转æ¢ä¸ºåèåºåçè¿ç¨ã
ååºååï¼æåèåºåæ¢å¤ä¸ºJava对象çè¿ç¨ã
## å¦ä½å®ç°åºåå
å®ç°`Serializable`æ¥å£å³å¯ãåºååçæ¶åï¼å¦`objectOutputStream.writeObject(user)`ï¼ï¼ä¼å¤æuseræ¯å¦å®ç°äº`Serializable`ï¼å¦æå¯¹è±¡æ²¡æå®ç°`Serializable`æ¥å£ï¼å¨åºååçæ¶å伿åº`NotSerializableException`å¼å¸¸ãæºç å¦ä¸ï¼
```java
// remaining cases
if (obj instanceof String) {
writeString((String) obj, unshared);
} else if (cl.isArray()) {
writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
writeEnum((Enum>) obj, desc, unshared);
} else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "\n" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
```
## transientå
³é®åçä½ç¨ï¼
Javaè¯è¨çå
³é®åï¼åé修饰符ï¼å¦æç¨transient声æä¸ä¸ªå®ä¾åéï¼å½å¯¹è±¡å卿¶ï¼å®çå¼ä¸éè¦ç»´æã
ä¹å°±æ¯è¯´è¢«transient修饰çæååéï¼å¨åºååçæ¶åå
¶å¼ä¼è¢«å¿½ç¥ï¼å¨è¢«ååºåååï¼ transient åéçå¼è¢«è®¾ä¸ºåå§å¼ï¼ å¦ int åçæ¯ 0ï¼å¯¹è±¡åçæ¯ nullã
## ä»ä¹æ¯åå°ï¼
卿è·åçä¿¡æ¯ä»¥å卿è°ç¨å¯¹è±¡çæ¹æ³çåè½ç§°ä¸ºJavaè¯è¨çåå°æºå¶ã
å¨è¿è¡ç¶æä¸ï¼å¯¹äºä»»æä¸ä¸ªç±»ï¼è½å¤ç¥éè¿ä¸ªç±»çææå±æ§åæ¹æ³ã对äºä»»æä¸ä¸ªå¯¹è±¡ï¼è½å¤è°ç¨å®çä»»æä¸ä¸ªæ¹æ³å屿§ã
## åå°æåªäºåºç¨åºæ¯å¢ï¼
1. JDBCè¿æ¥æ°æ®åºæ¶ä½¿ç¨`Class.forName()`éè¿åå°å è½½æ°æ®åºç驱å¨ç¨åº
2. EclispeãIDEAçå¼åå·¥å
·å©ç¨åå°å¨æè§£æå¯¹è±¡çç±»åä¸ç»æï¼å¨ææç¤ºå¯¹è±¡ç屿§åæ¹æ³
3. Webæå¡å¨ä¸å©ç¨åå°è°ç¨äºSevletç`service`æ¹æ³
4. JDK卿代çåºå±ä¾èµåå°å®ç°
## 讲讲ä»ä¹æ¯æ³åï¼
Javaæ³åæ¯JDK 5ä¸å¼â¼çâ¼ä¸ªæ°ç¹æ§ï¼ å
许å¨å®ä¹ç±»åæ¥å£çæ¶å使⽤类ååæ°ã声æçç±»ååæ°å¨ä½¿â½¤æ¶â½¤å
·ä½çç±»åæ¥æ¿æ¢ã
æ³åæâ¼¤ç好夿¯å¯ä»¥æâ¾¼ä»£ç çå¤â½¤æ§ã以Listæ¥å£ä¸ºä¾ï¼æä»¬å¯ä»¥å°Stringã Integerçç±»åæ¾â¼Listä¸ï¼ å¦ä¸â½¤æ³åï¼ åæ¾Stringç±»åè¦åâ¼ä¸ªListæ¥å£ï¼ åæ¾Integerè¦åå¦å¤â¼ä¸ªListæ¥å£ï¼ æ³åå¯ä»¥å¾å¥½çè§£å³è¿ä¸ªé®é¢ã
## String为ä»ä¹ä¸å¯åï¼
å
ççä»ä¹æ¯ä¸å¯åç对象ã
妿ä¸ä¸ªå¯¹è±¡ï¼å¨å®åå»ºå®æä¹åï¼ä¸è½åæ¹åå®çç¶æï¼é£ä¹è¿ä¸ªå¯¹è±¡å°±æ¯ä¸å¯åçã
ä¸è½æ¹åç¶æçæææ¯ï¼ä¸è½æ¹å对象å
çæååéï¼å
æ¬åºæ¬æ°æ®ç±»åçå¼ä¸è½æ¹åï¼å¼ç¨ç±»åçåéä¸è½æåå
¶ä»ç对象ï¼å¼ç¨ç±»åæåç对象çç¶æä¹ä¸è½æ¹åã
æ¥çæ¥çJava8 Stringç±»çæºç ï¼
```java
public final class String
implements java.io.Serializable, Comparable, CharSequence {
/ The value is used for character storage. */
private final char value[];
/ Cache the hash code for the string */
private int hash; // Default to 0
}
```
仿ºç å¯ä»¥çåºï¼String对象å
¶å®å¨å
é¨å°±æ¯ä¸ä¸ªä¸ªå符ï¼åå¨å¨è¿ä¸ªvalueæ°ç»éé¢çã
valueæ°ç»ç¨final修饰ï¼final 修饰çåéï¼å¼ä¸è½è¢«ä¿®æ¹ãå æ¤valueä¸å¯ä»¥æåå
¶ä»å¯¹è±¡ã
Stringç±»å
鍿æçåæ®µé½æ¯ç§æçï¼ä¹å°±æ¯è¢«private修饰ãèä¸String没æå¯¹å¤æä¾ä¿®æ¹å
é¨ç¶æçæ¹æ³ï¼å æ¤valueæ°ç»ä¸è½æ¹åã
æä»¥ï¼Stringæ¯ä¸å¯åçã
é£ä¸ºä»ä¹Stringè¦è®¾è®¡æä¸å¯åçï¼
ä¸»è¦æä»¥ä¸å ç¹åå ï¼
1. 线ç¨å®å
¨ãåä¸ä¸ªå符串å®ä¾å¯ä»¥è¢«å¤ä¸ªçº¿ç¨å
±äº«ï¼å 为å符串ä¸å¯åï¼æ¬èº«å°±æ¯çº¿ç¨å®å
¨çã
2. æ¯æhashæ å°åç¼åãå 为Stringçhashå¼ç»å¸¸ä¼ä½¿ç¨å°ï¼æ¯å¦ä½ä¸º Map çé®ï¼ä¸å¯åçç¹æ§ä½¿å¾ hash å¼ä¹ä¸ä¼åï¼ä¸éè¦éæ°è®¡ç®ã
3. åºäºå®å
¨èèãç½ç»å°åURLãæä»¶è·¯å¾pathãå¯ç é常æ
åµä¸é½æ¯ä»¥Stringç±»åä¿åï¼åè¥String䏿¯åºå®ä¸åçï¼å°ä¼å¼èµ·åç§å®å
¨éæ£ãæ¯å¦å°å¯ç ç¨Stringçç±»åä¿åï¼é£ä¹å®å°ä¸ç´çå¨å
åä¸ï¼ç´å°å徿¶é卿宿¸
é¤ãåå¦Stringç±»ä¸æ¯åºå®ä¸åçï¼é£ä¹è¿ä¸ªå¯ç å¯è½ä¼è¢«æ¹åï¼å¯¼è´åºç°å®å
¨éæ£ã
4. åç¬¦ä¸²å¸¸éæ± ä¼åãString对象å建ä¹åï¼ä¼ç¼åå°åç¬¦ä¸²å¸¸éæ± ä¸ï¼ä¸æ¬¡éè¦åå»ºåæ ·ç对象æ¶ï¼å¯ä»¥ç´æ¥è¿åç¼åçå¼ç¨ã
æ¢ç¶æä»¬çStringæ¯ä¸å¯åçï¼é£å®å
é¨è¿æå¾å¤substringï¼ replaceï¼ replaceAllè¿äºæä½çæ¹æ³ã
è¿äºæ¹æ³å¥½å伿¹åStringå¯¹è±¡ï¼æä¹è§£éå¢ï¼
å
¶å®ä¸æ¯çï¼æä»¬æ¯æ¬¡è°ç¨replaceçæ¹æ³ï¼å
¶å®ä¼å¨å å
åä¸å建äºä¸ä¸ªæ°ç对象ãç¶åå
¶valueæ°ç»å¼ç¨æåä¸åç对象ã
## å¦ä½åæ¢ä¸ä¸ªæ£å¨è¿è¡ç线ç¨ï¼
æå ç§æ¹å¼ã
1ã**使ç¨çº¿ç¨çstopæ¹æ³**ã
使ç¨stop()æ¹æ³å¯ä»¥å¼ºå¶ç»æ¢çº¿ç¨ãä¸è¿stopæ¯ä¸ä¸ªè¢«åºå¼æçæ¹æ³ï¼ä¸æ¨è使ç¨ã
使ç¨Stopæ¹æ³ï¼ä¼ä¸ç´åä¸ä¼ æThreadDeathå¼å¸¸ï¼ä»è使å¾ç®æ 线ç¨è§£éææéä½ççè§å¨ï¼å³éæ¾æææç对象éã使å¾ä¹å被éä½ç对象å¾ä¸å°åæ¥çå¤çï¼å æ¤å¯è½ä¼é ææ°æ®ä¸ä¸è´çé®é¢ã
2ã**使ç¨interruptæ¹æ³ä¸æçº¿ç¨**ï¼è¯¥æ¹æ³åªæ¯åè¯çº¿ç¨è¦ç»æ¢ï¼ä½æç»ä½æ¶ç»æ¢åå³äºè®¡ç®æºãè°ç¨interruptæ¹æ³ä»
ä»
æ¯å¨å½å线ç¨ä¸æäºä¸ä¸ªåæ¢çæ è®°ï¼å¹¶ä¸æ¯ççåæ¢çº¿ç¨ã
æ¥çè°ç¨ Thread.currentThread().isInterrupted()æ¹æ³ï¼å¯ä»¥ç¨æ¥å¤æå½åçº¿ç¨æ¯å¦è¢«ç»æ¢ï¼éè¿è¿ä¸ªå¤ææä»¬å¯ä»¥åä¸äºä¸å¡é»è¾å¤çï¼é叏妿isInterruptedè¿åtrueçè¯ï¼ä¼æä¸ä¸ªä¸æå¼å¸¸ï¼ç¶åéè¿try-catchæè·ã
3ã**设置æ å¿ä½**
设置æ å¿ä½ï¼å½æ è¯ä½ä¸ºæä¸ªå¼æ¶ï¼ä½¿çº¿ç¨æ£å¸¸éåºã设置æ å¿ä½æ¯ç¨å°äºå
±äº«åéçæ¹å¼ï¼ä¸ºäºä¿è¯å
±äº«åéå¨å
åä¸çå¯è§æ§ï¼å¯ä»¥ä½¿ç¨volatile修饰å®ï¼è¿æ ·çè¯ï¼åéåå¼å§ç»ä¼ä»ä¸»åä¸è·åææ°å¼ã
使¯è¿ç§volatileæ è®°å
±äº«åéçæ¹å¼ï¼å¨çº¿ç¨åçé»å¡æ¶æ¯æ æ³å®æååºçãæ¯å¦è°ç¨Thread.sleep() æ¹æ³ä¹åï¼çº¿ç¨å¤äºä¸å¯è¿è¡ç¶æï¼å³ä¾¿æ¯ä¸»çº¿ç¨ä¿®æ¹äºå
±äº«åéçå¼ï¼è¯¥çº¿ç¨æ¤æ¶æ ¹æ¬æ æ³æ£æ¥å¾ªç¯æ å¿ï¼æä»¥ä¹å°±æ æ³å®ç°çº¿ç¨ä¸æã
å æ¤ï¼interrupt() å 䏿卿å¼å¸¸çæ¹å¼æ¯ç®å䏿ä¸ä¸ªæ£å¨è¿è¡ç线ç¨**æä¸ºæ£ç¡®**çæ¹å¼äºã
## ä»ä¹æ¯è·¨åï¼
ç®åæ¥è®²ï¼è·¨åæ¯æä»ä¸ä¸ªååçç½é¡µå»è¯·æ±å¦ä¸ä¸ªååçèµæºãç±äºæ**åæºçç¥**çå
³ç³»ï¼ä¸è¬æ¯ä¸å
许è¿ä¹ç´æ¥è®¿é®çã使¯ï¼å¾å¤åºæ¯ç»å¸¸ä¼æè·¨å访é®çéæ±ï¼æ¯å¦ï¼å¨åå端åç¦»çæ¨¡å¼ä¸ï¼åå端çå忝ä¸ä¸è´çï¼æ¤æ¶å°±ä¼åçè·¨åé®é¢ã
**é£ä»ä¹æ¯åæºçç¥å¢**ï¼
æè°åæºæ¯æ"åè®®+åå+端å£"ä¸è
ç¸åï¼å³ä¾¿ä¸¤ä¸ªä¸åçååæååä¸ä¸ªipå°åï¼ä¹éåæºã
åæºçç¥éå¶ä»¥ä¸å ç§è¡ä¸ºï¼
```mipsasm
1. CookieãLocalStorage å IndexDB æ æ³è¯»å
2. DOM å Jså¯¹è±¡æ æ³è·å¾
3. AJAX 请æ±ä¸è½åé
```
**为ä»ä¹è¦æåæºçç¥**ï¼
举个ä¾åï¼åå¦ä½ ååå¨ç½é¶è¾å
¥è´¦å·å¯ç ï¼æ¥çäºèªå·±çä½é¢ï¼ç¶ååå»è®¿é®å
¶ä»å¸¦é¢è²çç½ç«ï¼è¿ä¸ªç½ç«å¯ä»¥è®¿é®ååçç½é¶ç«ç¹ï¼å¹¶ä¸è·åè´¦å·å¯ç ï¼é£åæå¯æ³èç¥ãå æ¤ï¼ä»å®å
¨çè§åº¦æ¥è®²ï¼åæºçç¥æ¯æå©äºä¿æ¤ç½ç«ä¿¡æ¯çã
## è·¨åé®é¢æä¹è§£å³å¢ï¼
å¯ï¼æä»¥ä¸å ç§æ¹æ³ï¼
**CORS**ï¼è·¨åèµæºå
񄧮
CORSï¼Cross-origin resource sharingï¼ï¼è·¨åèµæºå
±äº«ãCORS å
¶å®æ¯æµè§å¨å¶å®çä¸ä¸ªè§èï¼æµè§å¨ä¼èªå¨è¿è¡ CORS éä¿¡ï¼å®çå®ç°ä¸»è¦å¨æå¡ç«¯ï¼éè¿ä¸äº HTTP Header æ¥éå¶å¯ä»¥è®¿é®çåï¼ä¾å¦é¡µé¢ A éè¦è®¿é® B æå¡å¨ä¸çæ°æ®ï¼å¦æ B æå¡å¨ ä¸å£°æäºå
许 A çåå访é®ï¼é£ä¹ä» A å° B çè·¨å请æ±å°±å¯ä»¥å®æã
**@CrossOrigin注解**
妿项ç®ä½¿ç¨çæ¯Springbootï¼å¯ä»¥å¨Controllerç±»ä¸æ·»å ä¸ä¸ª @CrossOrigin(origins ="*") 注解就å¯ä»¥å®ç°å¯¹å½åcontroller çè·¨å访é®äºï¼å½ç¶è¿ä¸ªæ ç¾ä¹å¯ä»¥å å°æ¹æ³ä¸ï¼æè
ç´æ¥å å°å
¥å£ç±»ä¸å¯¹æææ¥å£è¿è¡è·¨åå¤çãæ³¨æSpringMVCççæ¬è¦å¨4.2æä»¥ä¸çæ¬ææ¯æ@CrossOriginã
**nginxååä»£çæ¥å£è·¨å**
nginxåå代çè·¨ååçå¦ä¸ï¼ é¦å
åæºçç¥æ¯æµè§å¨çå®å
¨çç¥ï¼ä¸æ¯HTTPåè®®çä¸é¨åãæå¡å¨ç«¯è°ç¨HTTPæ¥å£åªæ¯ä½¿ç¨HTTPåè®®ï¼ä¸ä¼æ§è¡JSèæ¬ï¼ä¸éè¦åæºçç¥ï¼ä¹å°±ä¸åå¨è·¨è¶é®é¢ã
nginxååä»£çæ¥å£è·¨åå®ç°æè·¯å¦ä¸ï¼éè¿nginxé
ç½®ä¸ä¸ªä»£çæå¡å¨ï¼ååä¸domain1ç¸åï¼ç«¯å£ä¸åï¼åè·³æ¿æºï¼åå代ç访é®domain2æ¥å£ï¼å¹¶ä¸å¯ä»¥é¡ºä¾¿ä¿®æ¹cookieä¸domainä¿¡æ¯ï¼æ¹ä¾¿å½ååcookieåå
¥ï¼å®ç°è·¨åç»å½ã
```js
// proxyæå¡å¨
server {
listen 81;
server_name www.domain1.com;
location / {
proxy_pass http://www.domain2.com:8080; #åå代ç
proxy_cookie_domain www.domain2.com www.domain1.com; #ä¿®æ¹cookieéåå
index index.html index.htm;
add_header Access-Control-Allow-Origin http://www.domain1.com;
}
}
```
è¿æ ·æä»¬çå端代çåªè¦è®¿é® http:www.domain1.com:81/*å°±å¯ä»¥äºã
**éè¿jsonpè·¨å**
é常为äºåè½»webæå¡å¨çè´è½½ï¼æä»¬æjsãcssï¼imgçéæèµæºå离å°å¦ä¸å°ç¬ç«ååçæå¡å¨ä¸ï¼å¨html页é¢ä¸åéè¿ç¸åºçæ ç¾ä»ä¸åååä¸å è½½éæèµæºï¼è¿æ¯æµè§å¨å
许çæä½ï¼åºäºæ¤åçï¼æä»¬å¯ä»¥éè¿å¨æå建scriptï¼å请æ±ä¸ä¸ªå¸¦åç½åå®ç°è·¨åéä¿¡ã
