# SE
## åºç¡
### æ°æ®
#### åéç±»å
| | æååé | å±é¨åé | éæåé |
| :------: | :------------: | :------------------: | :-------------------------: |
| å®ä¹ä½ç½® | å¨ç±»ä¸ï¼æ¹æ³å¤ | æ¹æ³ä¸æè
æ¹æ³çå½¢å | å¨ç±»ä¸ï¼æ¹æ³å¤ |
| åå§åå¼ | æé»è®¤åå§åå¼ | æ ï¼èµå¼åæè½ä½¿ç¨ | æé»è®¤åå§åå¼ |
| è°ç¨æ¹æ³ | 对象è°ç¨ | | 对象è°ç¨ï¼ç±»åè°ç¨ |
| åå¨ä½ç½® | å ä¸ | æ ä¸ | æ¹æ³åºï¼JDK8 以åç§»å°å ä¸ï¼ |
| çå½å¨æ | ä¸å¯¹è±¡å
±å亡 | 䏿¹æ³å
±å亡 | ä¸ç±»å
±å亡 |
| å«å | å®ä¾åé | | ç±»åéï¼éææååé |
éæåéåªæä¸ä¸ªï¼æååéæ¯ç±»ä¸çåéï¼å±é¨åéæ¯æ¹æ³ä¸çåé
å妿¶ç¬è®°å
容åèè§é¢ï¼https://www.bilibili.com/video/BV1TE41177mPï¼éçå¦ä¹ çæ·±å
¥åå¢å å¾å¤ç¥è¯
***
#### æ°æ®ç±»å
##### åºæ¬ç±»å
Java è¯è¨æä¾äºå
«ç§åºæ¬ç±»åãå
ç§æ°åç±»åï¼åä¸ªæ´æ°åï¼ä¸¤ä¸ªæµ®ç¹åï¼ï¼ä¸ç§å符类åï¼è¿æä¸ç§å¸å°å
**byteï¼**
- byte æ°æ®ç±»åæ¯ 8 ä½ãæç¬¦å·çï¼ä»¥äºè¿å¶è¡¥ç è¡¨ç¤ºçæ´æ°ï¼**8 ä½ä¸ä¸ªåè**ï¼é¦ä½æ¯ç¬¦å·ä½
- æå°å¼æ¯ -128ï¼-2^7ï¼ãæå¤§å¼æ¯ 127ï¼2^7-1ï¼
- é»è®¤å¼æ¯ `0`
- byte ç±»åç¨å¨å¤§åæ°ç»ä¸è约空é´ï¼ä¸»è¦ä»£æ¿æ´æ°ï¼byte åéå ç¨ç空é´åªæ int ç±»åçååä¹ä¸
- ä¾åï¼`byte a = 100ï¼byte b = -50`
**shortï¼**
- short æ°æ®ç±»åæ¯ 16 ä½ãæç¬¦å·ç以äºè¿å¶è¡¥ç è¡¨ç¤ºçæ´æ°
- æå°å¼æ¯ -32768ï¼-2^15ï¼ãæå¤§å¼æ¯ 32767ï¼2^15 - 1ï¼
- short æ°æ®ç±»åä¹å¯ä»¥å byte 飿 ·èç空é´ï¼ä¸ä¸ª short å鿝 int ååéæå 空é´çäºåä¹ä¸
- é»è®¤å¼æ¯ `0`
- ä¾åï¼`short s = 1000ï¼short r = -20000`
**intï¼**
- int æ°æ®ç±»åæ¯ 32 ä½ 4 åèãæç¬¦å·ç以äºè¿å¶è¡¥ç è¡¨ç¤ºçæ´æ°
- æå°å¼æ¯ -2,147,483,648ï¼-2^31ï¼ãæå¤§å¼æ¯ 2,147,483,647ï¼2^31 - 1ï¼
- ä¸è¬å°æ´ååéé»è®¤ä¸º int ç±»å
- é»è®¤å¼æ¯ `0`
- ä¾åï¼`int a = 100000, int b = -200000`
**longï¼**
- long æ°æ®ç±»åæ¯ 64 ä½ 8 åèãæç¬¦å·ç以äºè¿å¶è¡¥ç è¡¨ç¤ºçæ´æ°
- æå°å¼æ¯ -9,223,372,036,854,775,808ï¼-2^63ï¼ãæå¤§å¼æ¯ 9,223,372,036,854,775,807ï¼2^63 -1ï¼
- è¿ç§ç±»å主è¦ä½¿ç¨å¨éè¦æ¯è¾å¤§æ´æ°çç³»ç»ä¸
- é»è®¤å¼æ¯ ` 0L`
- ä¾åï¼ `long a = 100000Lï¼Long b = -200000L`ï¼L ç论ä¸ä¸å大å°åï¼ä½æ¯è¥åæ I 容æä¸æ°å 1 æ··æ·ï¼ä¸å®¹æå辩
**floatï¼**
- float æ°æ®ç±»åæ¯å精度ã32 ä½ã符å IEEE 754 æ åçæµ®ç¹æ°
- float å¨å¨å大念®ç¹æ°ç»çæ¶åå¯èçå
å空é´
- é»è®¤å¼æ¯ `0.0f`
- æµ®ç¹æ°ä¸è½ç¨æ¥è¡¨ç¤ºç²¾ç¡®çå¼ï¼å¦è´§å¸
- ä¾åï¼`float f1 = 234.5F`
**doubleï¼**
- double æ°æ®ç±»åæ¯å精度ã64 ä½ã符å IEEE 754 æ åçæµ®ç¹æ°
- æµ®ç¹æ°çé»è®¤ç±»å为 double ç±»å
- double ç±»ååæ ·ä¸è½è¡¨ç¤ºç²¾ç¡®çå¼ï¼å¦è´§å¸
- é»è®¤å¼æ¯ `0.0d`
- ä¾åï¼`double d1 = 123.4`
**booleanï¼**
- boolean æ°æ®ç±»å表示ä¸ä½çä¿¡æ¯
- åªæä¸¤ä¸ªåå¼ï¼true å false
- JVM è§èæåº boolean å½å int å¤çï¼boolean æ°ç»å½å byte æ°ç»å¤çï¼è¿æ ·å¯ä»¥å¾åº boolean ç±»ååç¬ä½¿ç¨å äº 4 个åèï¼å¨æ°ç»ä¸æ¯ 1 个åè
- é»è®¤å¼æ¯ `false`
- ä¾åï¼`boolean one = true`
**charï¼**
- char ç±»åæ¯ä¸ä¸ªåä¸ç 16 ä½**两个åè**ç Unicode å符
- æå°å¼æ¯ `\u0000`ï¼å³ä¸º 0ï¼
- æå¤§å¼æ¯ `\uffff`ï¼å³ä¸º 65535ï¼
- char æ°æ®ç±»åå¯ä»¥**åå¨ä»»ä½å符**
- ä¾åï¼`char c = 'A'`ï¼`char c = 'å¼ '`
****
##### ä¸ä¸è½¬å
* float ä¸ doubleï¼
Java ä¸è½é弿§è¡**åä¸è½¬å**ï¼å 为è¿ä¼ä½¿å¾ç²¾åº¦éä½ï¼ä½æ¯å¯ä»¥åä¸è½¬å
```java
//1.1åé¢éå±äºdoubleç±»åï¼ä¸è½ç´æ¥å°1.1ç´æ¥èµå¼ç» float åéï¼å ä¸ºè¿æ¯åä¸è½¬å
float f = 1.1;//æ¥é
//1.1f åé¢éææ¯ float ç±»å
float f = 1.1f;
```
```java
float f1 = 1.234f;
double d1 = f1;
double d2 = 1.23;
float f2 = (float) d2;//åä¸è½¬åéè¦å¼ºè½¬
```
```java
int i1 = 1245;
long l1 = i1;
long l2 = 1234;
int i2 = (int) l2;
```
* éå¼ç±»å转æ¢ï¼
åé¢é 1 æ¯ int ç±»åï¼æ¯ short ç±»å精度è¦é«ï¼å æ¤ä¸è½éå¼å°å° int ç±»ååä¸è½¬å为 short ç±»å
ä½¿ç¨ += æè
++ è¿ç®ç¬¦ä¼æ§è¡ç±»å转æ¢ï¼
```java
short s1 = 1;
s1 += 1; //s1++;
//ä¸é¢çè¯å¥ç¸å½äºå° s1 + 1 ç计ç®ç»æè¿è¡äºåä¸è½¬å
s1 = (short) (s1 + 1);
```
***
##### å¼ç¨ç±»å
å¼ç¨æ°æ®ç±»åï¼ç±»ï¼æ¥å£ï¼æ°ç»é½æ¯å¼ç¨æ°æ®ç±»åï¼åå«å
è£
ç±»
å
è£
ç±»çä½ç¨ï¼
* å
è£
ç±»ä½ä¸ºç±»é¦å
æ¥æäº Object ç±»çæ¹æ³
* å
è£
ç±»ä½ä¸ºå¼ç¨ç±»åçåéå¯ä»¥**åå¨ null å¼**
```java
åºæ¬æ°æ®ç±»å å
è£
ç±»ï¼å¼ç¨æ°æ®ç±»åï¼
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
```
Java 为å
è£
ç±»åäºä¸äºç¹æ®åè½ï¼å
·ä½æ¥çç¹æ®åè½ä¸»è¦æï¼
* å¯ä»¥æåºæ¬æ°æ®ç±»åçå¼è½¬æ¢æå符串类åçå¼
1. è°ç¨ toString() æ¹æ³
2. è°ç¨ Integer.toString(åºæ¬æ°æ®ç±»åçå¼) å¾å°å符串
3. ç´æ¥æåºæ¬æ°æ®ç±»å + 空å符串就å¾å°äºåç¬¦ä¸²ï¼æ¨è使ç¨ï¼
* æå符串类åçæ°å¼è½¬æ¢æå¯¹åºçåºæ¬æ°æ®ç±»åçå¼ï¼**éè¦**ï¼
1. Xxx.parseXxx("å符串类åçæ°å¼") â `Integer.parseInt(numStr)`
2. Xxx.valueOf("å符串类åçæ°å¼") â `Integer.valueOf(numStr)` ï¼æ¨è使ç¨ï¼
```java
public class PackageClass02 {
public static void main(String[] args) {
// 1.æåºæ¬æ°æ®ç±»åçå¼è½¬æå符串
Integer it = 100 ;
// a.è°ç¨toString()æ¹æ³ã
String itStr = it.toString();
System.out.println(itStr+1);//1001
// b.è°ç¨Integer.toString(åºæ¬æ°æ®ç±»åçå¼)å¾å°å符串ã
String itStr1 = Integer.toString(it);
System.out.println(itStr1+1);//1001
// c.ç´æ¥æåºæ¬æ°æ®ç±»å+空å符串就å¾å°äºå符串ã
String itStr2 = it + "";
System.out.println(itStr2+1);// 1001
// 2.æå符串类åçæ°å¼è½¬æ¢æå¯¹åºçåºæ¬æ°æ®ç±»åçå¼
String numStr = "23";
int numInt = Integer.valueOf(numStr);
System.out.println(numInt+1);//24
String doubleStr = "99.9";
double doubleDb = Double.valueOf(doubleStr);
System.out.println(doubleDb+0.1);//100.0
}
}
```
***
##### ç±»å对æ¯
* æäºåºæ¬æ°æ®ç±»åï¼ä¸ºä»ä¹è¿è¦å¼ç¨æ°æ®ç±»åï¼
> å¼ç¨æ°æ®ç±»åå°è£
äºæ°æ®åå¤çè¯¥æ°æ®çæ¹æ³ï¼æ¯å¦ Integer.parseInt(String) å°±æ¯å° String åç¬¦ç±»åæ°æ®è½¬æ¢ä¸º Integer æ´å
>
> Java ä¸å¤§é¨åç±»åæ¹æ³é½æ¯é对å¼ç¨æ°æ®ç±»åï¼å
æ¬æ³ååéå
* å¼ç¨æ°æ®ç±»åé£ä¹å¥½ï¼ä¸ºä»ä¹è¿ç¨åºæ¬æ°æ®ç±»åï¼
> å¼ç¨ç±»åç对象è¦å¤å¨å对象头ï¼å¯¹åºæ¬æ°æ®ç±»åæ¥è¯´ç©ºé´æµªè´¹ç太é«ãé»è¾ä¸æ¥è®²ï¼Java åªæå
è£
类就å¤äºï¼ä¸ºäºè¿è¡é度ï¼éè¦ç¨å°åºæ¬æ°æ®ç±»åï¼ä¼å
èèè¿è¡æççé®é¢ï¼æä»¥äºè
åæ¶å卿¯å乿
çç
* Java éåä¸è½åæ¾åºæ¬æ°æ®ç±»åï¼åªåæ¾å¯¹è±¡çå¼ç¨ï¼
> ä¸è½æ¾åºæ¬æ°æ®ç±»åæ¯å ä¸ºä¸æ¯ Object çåç±»ãæ³åææ³ï¼å¦æä¸ç¨æ³åè¦åå¾å¤åæ°ç±»åä¸åçä½åè½ç¸åç彿°ï¼æ¹æ³éè½½ï¼
* ==
> == æ¯è¾åºæ¬æ°æ®ç±»åï¼æ¯è¾çæ¯å
·ä½çå¼
> == æ¯è¾å¼ç¨æ°æ®ç±»åï¼æ¯è¾çæ¯å¯¹è±¡å°åå¼
***
#### è£
ç®±æç®±
**èªå¨è£
ç®±**ï¼å¯ä»¥ç´æ¥æåºæ¬æ°æ®ç±»åç弿è
åéèµå¼ç»å
è£
ç±»
**èªå¨æç®±**ï¼å¯ä»¥æå
è£
ç±»çåéç´æ¥èµå¼ç»åºæ¬æ°æ®ç±»å
```java
public class PackegeClass {
public static void main(String[] args) {
int a = 12 ;
Integer a1 = 12 ; // èªå¨è£
ç®±
Integer a2 = a ; // èªå¨è£
ç®±
Integer a3 = null; // å¼ç¨æ°æ®ç±»åçé»è®¤å¼å¯ä»¥ä¸ºnull
Integer c = 100 ;
int c1 = c ; // èªå¨æç®±
Integer it = Integer.valueOf(12); // æå·¥è£
ç®±ï¼
// Integer it1 = new Integer(12); // æå·¥è£
ç®±ï¼
Integer it2 = 12;
Integer it3 = 111 ;
int it33 = it3.intValue(); // æå·¥æç®±
}
}
```
**èªå¨è£
ç®±**åç¼è¯ååºå±è°ç¨ `Integer.valueOf()` å®ç°ï¼æºç ï¼
```java
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
// ãç¼åæ± ãï¼æ¬è´¨ä¸æ¯ä¸ä¸ªæ°ç»
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
```
èªå¨æç®±è°ç¨ `java.lang.Integer#intValue`ï¼æºç ï¼
```java
public int intValue() {
return value;
}
```
***
#### ç¼åæ±
new Integer(123) ä¸ Integer.valueOf(123) çåºå«å¨äºï¼
- new Integer(123)ï¼æ¯æ¬¡é½ä¼æ°å»ºä¸ä¸ªå¯¹è±¡
- Integer.valueOf(123)ï¼ä¼ä½¿ç¨ç¼åæ± ä¸ç对象ï¼å¤æ¬¡è°ç¨åå¾åä¸ä¸ªå¯¹è±¡çå¼ç¨
```java
Integer x = new Integer(123);
Integer y = new Integer(123);
System.out.println(x == y); // false
Integer z = Integer.valueOf(123);
Integer k = Integer.valueOf(123);
System.out.println(z == k); // true
```
valueOf() æ¹æ³çå®ç°æ¯è¾ç®åï¼å°±æ¯å
夿弿¯å¦å¨ç¼åæ± ä¸ï¼å¦æå¨çè¯å°±ç´æ¥è¿åç¼åæ± çå
容ãç¼è¯å¨ä¼å¨èªå¨è£
ç®±è¿ç¨è°ç¨ valueOf() æ¹æ³ï¼å æ¤å¤ä¸ªå¼ç¸åä¸å¼å¨ç¼åæ± èå´å
ç Integer å®ä¾ä½¿ç¨èªå¨è£
ç®±æ¥å建ï¼é£ä¹å°±ä¼å¼ç¨ç¸åç对象
**åºæ¬ç±»å对åºçç¼åæ± å¦ä¸ï¼**
- Boolean values true and false
- all byte values
- Short values between -128 and 127
- Long values between -128 and 127
- Integer values between -128 and 127
- Character in the range \u0000 to \u007F (0 and 127)
å¨ jdk 1.8 ææçæ°å¼ç±»ç¼å²æ± ä¸ï¼**Integer çç¼åæ± IntegerCache å¾ç¹æ®ï¼è¿ä¸ªç¼å²æ± çä¸çæ¯ -128ï¼ä¸çé»è®¤æ¯ 127**ï¼ä½æ¯ä¸çæ¯å¯è°çï¼å¨å¯å¨ JVM æ¶éè¿ `AutoBoxCacheMax=` æ¥æå®è¿ä¸ªç¼å²æ± ç大å°ï¼è¯¥éé¡¹å¨ JVM åå§åçæ¶åä¼è®¾å®ä¸ä¸ªå为 java.lang.IntegerCache.high ç³»ç»å±æ§ï¼ç¶å IntegerCache åå§åçæ¶åå°±ä¼è¯»å该系ç»å±æ§æ¥å³å®ä¸ç
```java
Integer x = 100; // èªå¨è£
ç®±ï¼åºå±è°ç¨ Integer.valueOf(1)
Integer y = 100;
System.out.println(x == y); // true
Integer x = 1000;
Integer y = 1000;
System.out.println(x == y); // falseï¼å 为ç¼åæ± æå¤§127
int x = 1000;
Integer y = 1000;
System.out.println(x == y); // trueï¼å 为 y ä¼è°ç¨ intValue ãèªå¨æç®±ãè¿å int åå§å¼è¿è¡æ¯è¾
```
***
#### è¾å
¥æ°æ®
è¯æ³ï¼`Scanner sc = new Scanner(System.in)`
* next()ï¼éå°äºç©ºæ ¼ï¼å°±ä¸åå½å
¥æ°æ®äºï¼ç»ææ è®°ï¼ç©ºæ ¼ãtab é®
* nextLine()ï¼å¯ä»¥å°æ°æ®å®æ´çæ¥æ¶è¿æ¥ï¼ç»ææ è®°ï¼å车æ¢è¡ç¬¦
ä¸è¬ä½¿ç¨ `sc.nextInt()` æè
`sc.nextLine()` æ¥åæ´ååå符串ï¼ç¶å转æéè¦çæ°æ®ç±»å
* Scannerï¼`BufferedReader br = new BufferedReader(new InputStreamReader(System.in))`
* printï¼`PrintStream.write()`
> 使ç¨å¼ç¨æ°æ®ç±»åçAPI
```java
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String msg = sc.nextLine();
}
}
```
****
### æ°ç»
#### åå§å
æ°ç»å°±æ¯å卿°æ®é¿åº¦åºå®ç容å¨ï¼åå¨å¤ä¸ªæ°æ®çæ°æ®ç±»åè¦ä¸è´ï¼**æ°ç»ä¹æ¯ä¸ä¸ªå¯¹è±¡**
å建æ°ç»ï¼
* æ°æ®ç±»å[] æ°ç»åï¼`int[] arr` ï¼å¸¸ç¨ï¼
* æ°æ®ç±»å æ°ç»å[]ï¼`int arr[]`
éæåå§åï¼
* æ°æ®ç±»å[] æ°ç»å = new æ°æ®ç±»å[]{å
ç´ 1,å
ç´ 2,...}ï¼`int[] arr = new int[]{11,22,33}`
* æ°æ®ç±»å[] æ°ç»å = {å
ç´ 1,å
ç´ 2,...}ï¼`int[] arr = {44,55,66}`
卿åå§å
* æ°æ®ç±»å[] æ°ç»å = new æ°æ®ç±»å[æ°ç»é¿åº¦]ï¼`int[] arr = new int[3]`
#### å
ç´ è®¿é®
* **ç´¢å¼**ï¼æ¯ä¸ä¸ªåå¨å°æ°ç»çå
ç´ ï¼é½ä¼èªå¨çæ¥æä¸ä¸ªç¼å·ï¼ä» **0** å¼å§ãè¿ä¸ªèªå¨ç¼å·ç§°ä¸ºæ°ç»ç´¢å¼ï¼indexï¼ï¼å¯ä»¥éè¿æ°ç»çç´¢å¼è®¿é®å°æ°ç»ä¸çå
ç´
* **è®¿é®æ ¼å¼**ï¼æ°ç»å[ç´¢å¼]ï¼`arr[0]`
* **èµå¼ï¼**`arr[0] = 10`
***
#### å
ååé
å
åæ¯è®¡ç®æºä¸çéè¦å¨ä»¶ï¼ä¸´æ¶åå¨åºåï¼ä½ç¨æ¯è¿è¡ç¨åºãç¼åçç¨åºæ¯åæ¾å¨ç¡¬çä¸ï¼å¨ç¡¬çä¸çç¨åºæ¯ä¸ä¼è¿è¡çï¼å¿
é¡»æ¾è¿å
å䏿è½è¿è¡ï¼è¿è¡å®æ¯å伿¸
空å
åï¼Java èææºè¦è¿è¡ç¨åºï¼å¿
é¡»è¦å¯¹å
åè¿è¡ç©ºé´çåé
å管ç
| åºååç§° | ä½ç¨ |
| ---------- | ---------------------------------------------------------- |
| å¯åå¨ | ç» CPU ä½¿ç¨ |
| æ¬å°æ¹æ³æ | JVM å¨ä½¿ç¨æä½ç³»ç»åè½çæ¶åä½¿ç¨ |
| æ¹æ³åº | åå¨å¯ä»¥è¿è¡ç class æä»¶ |
| å å
å | åå¨å¯¹è±¡æè
æ°ç»ï¼new æ¥å建çï¼é½åå¨å¨å å
å |
| æ¹æ³æ | æ¹æ³è¿è¡æ¶ä½¿ç¨çå
åï¼æ¯å¦ main æ¹æ³è¿è¡ï¼è¿å
¥æ¹æ³æ 䏿§è¡ |
**å
ååé
å¾**ï¼Java å
ååé
* ä¸ä¸ªæ°ç»å
åå¾

* 两个æ°ç»å
åå¾

* å¤ä¸ªæ°ç»æåç¸åå
åå¾

***
#### æ°ç»å¼å¸¸
* ç´¢å¼è¶çå¼å¸¸ï¼ArrayIndexOutOfBoundsException
* 空æéå¼å¸¸ï¼NullPointerException
```java
public class ArrayDemo {
public static void main(String[] args) {
int[] arr = new int[3];
//ænullèµå¼ç»æ°ç»
arr = null;
System.out.println(arr[0]);
}
}
```
arr = nullï¼è¡¨ç¤ºåé arr å°ä¸åä¿åæ°ç»çå
åå°åï¼ä¹å°±ä¸å
许åæä½æ°ç»ï¼å æ¤è¿è¡çæ¶å伿åºç©ºæéå¼å¸¸ãå¨å¼åä¸ï¼ç©ºæéå¼å¸¸æ¯ä¸è½åºç°çï¼ä¸æ¦åºç°äºï¼å°±å¿
é¡»è¦ä¿®æ¹ç¼åç代ç
è§£å³æ¹æ¡ï¼ç»æ°ç»ä¸ä¸ªçæ£çå å
å空é´å¼ç¨å³å¯
***
#### äºç»´æ°ç»
äºç»´æ°ç»ä¹æ¯ä¸ç§å®¹å¨ï¼ä¸åäºä¸ç»´æ°ç»ï¼è¯¥å®¹å¨åå¨ç齿¯ä¸ç»´æ°ç»å®¹å¨
åå§åï¼
* 卿åå§åï¼æ°æ®ç±»å[][] åéå = new æ°æ®ç±»å[m] [n]ï¼`int[][] arr = new int[3][3]`
* m 表示è¿ä¸ªäºç»´æ°ç»ï¼å¯ä»¥åæ¾å¤å°ä¸ªä¸ç»´æ°ç»ï¼è¡
* n 表示æ¯ä¸ä¸ªä¸ç»´æ°ç»ï¼å¯ä»¥åæ¾å¤å°ä¸ªå
ç´ ï¼å
* éæåå§å
* æ°æ®ç±»å[][] åéå = new æ°æ®ç±»å [][]{{å
ç´ 1, å
ç´ 2...} , {å
ç´ 1, å
ç´ 2...}
* æ°æ®ç±»å[][] åéå = {{å
ç´ 1, å
ç´ 2...}, {å
ç´ 1, å
ç´ 2...}...}
* `int[][] arr = {{11,22,33}, {44,55,66}}`
éåï¼
```java
public class Test1 {
/*
æ¥éª¤:
1. éåäºç»´æ°ç»ï¼ååºé颿¯ä¸ä¸ªä¸ç»´æ°ç»
2. å¨éåçè¿ç¨ä¸ï¼å¯¹æ¯ä¸ä¸ªä¸ç»´æ°ç»ç»§ç»å®æéåï¼è·åå
é¨åå¨çæ¯ä¸ä¸ªå
ç´
*/
public static void main(String[] args) {
int[][] arr = {{11, 22, 33}, {33, 44, 55}};
// 1. éåäºç»´æ°ç»ï¼ååºé颿¯ä¸ä¸ªä¸ç»´æ°ç»
for (int i = 0; i < arr.length; i++) {
//System.out.println(arr[i]);
// 2. å¨éåçè¿ç¨ä¸ï¼å¯¹æ¯ä¸ä¸ªä¸ç»´æ°ç»ç»§ç»å®æéåï¼è·åå
é¨åå¨çæ¯ä¸ä¸ªå
ç´
//int[] temp = arr[i];
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
}
}
```
****
### è¿ç®
* i++ ä¸ ++i çåºå«ï¼
i++ 表示å
å° i æ¾å¨è¡¨è¾¾å¼ä¸è¿ç®ï¼ç¶ååå 1ï¼++i 表示å
å° i å 1ï¼ç¶ååæ¾å¨è¡¨è¾¾å¼ä¸è¿ç®
* || å |ï¼&& å& çåºå«ï¼é»è¾è¿ç®ç¬¦
**& å| 称为å¸å°è¿ç®ç¬¦ï¼ä½è¿ç®ç¬¦ï¼&& å || 称为æ¡ä»¶å¸å°è¿ç®ç¬¦ï¼ä¹å«çè·¯è¿ç®ç¬¦**
妿 && è¿ç®ç¬¦ç第ä¸ä¸ªæä½æ°æ¯ falseï¼å°±ä¸éè¦èè第äºä¸ªæä½æ°çå¼äºï¼å 为æ 论第äºä¸ªæä½æ°ç弿¯ä»ä¹ï¼å
¶ç»æé½æ¯ falseï¼åæ ·ï¼å¦æç¬¬ä¸ä¸ªæä½æ°æ¯ trueï¼|| è¿ç®ç¬¦å°±è¿å trueï¼æ éèè第äºä¸ªæä½æ°çå¼ï¼ä½ & å | å´ä¸æ¯è¿æ ·ï¼å®ä»¬æ»æ¯è¦è®¡ç®ä¸¤ä¸ªæä½æ°ãä¸ºäºæé«æ§è½ï¼**å°½å¯è½ä½¿ç¨ && å || è¿ç®ç¬¦**
* 弿 ^ï¼ä¸¤ä½ç¸å¼ä¸º 1ï¼ç¸å为 0ï¼åå«ä¸è¿ä½å æ³
* åæï¼ä¸¤ä½ç¸å为 1ï¼ç¸å¼ä¸º 0
* switchï¼ä» Java 7 å¼å§ï¼å¯ä»¥å¨ switch æ¡ä»¶å¤æè¯å¥ä¸ä½¿ç¨ String 对象
```java
String s = "a";
switch (s) {
case "a":
System.out.println("aaa");
break;
case "b":
System.out.println("bbb");
break;
default:
break;
}
```
switch 䏿¯æ longãfloatãdoubleï¼switch ç设计åè¡·æ¯å¯¹é£äºåªæå°æ°å 个å¼çç±»åè¿è¡çå¼å¤æï¼å¦æå¼è¿äºå¤æï¼é£ä¹ç¨ if æ¯è¾åé
* breakï¼è·³åºä¸å±å¾ªç¯
* ç§»ä½è¿ç®ï¼è®¡ç®æºéä¸è¬ç¨**è¡¥ç 表示æ°å**ï¼æ£æ°ãè´æ°ç表示åºå«å°±æ¯æé«ä½æ¯ 0 è¿æ¯ 1
* æ£æ°çåç åç è¡¥ç ç¸åï¼æé«ä½ä¸º 0
```java
100: 00000000 00000000 00000000 01100100
```
* è´æ°ï¼
åç ï¼æé«ä½ä¸º 1ï¼å
¶ä½ä½ç½®åæ£æ°ç¸å
åç ï¼ä¿è¯ç¬¦å·ä½ä¸åï¼å
¶ä½ä½ç½®åå
è¡¥ç ï¼ä¿è¯ç¬¦å·ä½ä¸åï¼å
¶ä½ä½ç½®åååå 1ï¼å³åç +1
```java
-100 åç : 10000000 00000000 00000000 01100100 //32ä½
-100 åç : 11111111 11111111 11111111 10011011
-100 è¡¥ç : 11111111 11111111 11111111 10011100
```
è¡¥ç â åç ï¼ç¬¦å·ä½ä¸åï¼å
¶ä½ä½ç½®ååå 1
è¿ç®ç¬¦ï¼
* `>>` è¿ç®ç¬¦ï¼å°äºè¿å¶ä½è¿è¡å³ç§»æä½ï¼ç¸å½äºé¤ 2
* `<<` è¿ç®ç¬¦ï¼å°äºè¿å¶ä½è¿è¡å·¦ç§»æä½ï¼ç¸å½äºä¹ 2
* `>>>` è¿ç®ç¬¦ï¼æ 符å·å³ç§»ï¼å¿½ç¥ç¬¦å·ä½ï¼ç©ºä½é½ä»¥ 0 è¡¥é½
è¿ç®è§åï¼
* æ£æ°ç左移ä¸å³ç§»ï¼ç©ºä½è¡¥ 0
* è´æ°åç ç左移ä¸å³ç§»ï¼ç©ºä½è¡¥ 0
è´æ°åç ç左移ä¸å³ç§»ï¼ç©ºä½è¡¥ 1
è´æ°è¡¥ç ï¼å·¦ç§»ä½ä½è¡¥ 0ï¼ä¼å¯¼è´è´æ°åä¸ºæ£æ°çé®é¢ï¼å 为移å¨äºç¬¦å·ä½ï¼ï¼å³ç§»é«ä½è¡¥ 1
* æ 符å·ç§»ä½ï¼ç©ºä½è¡¥ 0
****
### åæ°
#### å½¢åå®å
å½¢åï¼
* å½¢å¼åæ°ï¼ç¨äºå®ä¹æ¹æ³çæ¶å使ç¨çåæ°ï¼åªè½æ¯åé
* å½¢ååªæå¨æ¹æ³è¢«è°ç¨çæ¶åï¼èææºæåé
å
ååå
ï¼æ¹æ³è°ç¨ç»æä¹å便ä¼éæ¾æåé
çå
ååå
å®åï¼è°ç¨æ¹æ³æ¶ä¼ éçæ°æ®å¯ä»¥æ¯å¸¸éï¼ä¹å¯ä»¥æ¯åé
#### å¯ååæ°
å¯ååæ°ç¨å¨å½¢åä¸å¯ä»¥æ¥æ¶å¤ä¸ªæ°æ®ï¼å¨æ¹æ³å
é¨**æ¬è´¨ä¸å°±æ¯ä¸ä¸ªæ°ç»**
æ ¼å¼ï¼æ°æ®ç±»å... åæ°åç§°
ä½ç¨ï¼ä¼ è¾åæ°éå¸¸çµæ´»ï¼å¯ä»¥ä¸ä¼ è¾åæ°ãä¼ è¾ä¸ä¸ªåæ°ãæè
ä¼ è¾ä¸ä¸ªæ°ç»
å¯ååæ°çæ³¨æäºé¡¹ï¼
* ä¸ä¸ªå½¢åå表ä¸å¯ååæ°åªè½æä¸ä¸ª
* å¯ååæ°å¿
é¡»æ¾å¨å½¢åå表ç**æåé¢**
```java
public static void main(String[] args) {
sum(); // å¯ä»¥ä¸ä¼ è¾åæ°ã
sum(10); // å¯ä»¥ä¼ è¾ä¸ä¸ªåæ°ã
sum(10,20,30); // å¯ä»¥ä¼ è¾å¤ä¸ªåæ°ã
sum(new int[]{10,30,50,70,90}); // å¯ä»¥ä¼ è¾ä¸ä¸ªæ°ç»ã
}
public static void sum(int... nums){
int sum = 0;
for(int i : a) {
sum += i;
}
return sum;
}
```
***
### æ¹æ³
#### æ¹æ³æ¦è¿°
æ¹æ³ï¼methodï¼æ¯å°å
·æç¬ç«åè½ç代ç åç»ç»æä¸ºä¸ä¸ªæ´ä½ï¼ä½¿å
¶å
·æç¹æ®åè½ç代ç é
注æï¼æ¹æ³å¿
é¡»å
å建æå¯ä»¥ä½¿ç¨ï¼è¯¥è¿ç¨æä¸ºæ¹æ³å®ä¹ï¼æ¹æ³å建å并䏿¯ç´æ¥å¯ä»¥è¿è¡çï¼éè¦æå¨ä½¿ç¨åææ§è¡ï¼è¯¥è¿ç¨æä¸ºæ¹æ³è°ç¨
卿¹æ³å
é¨å®ä¹çå«å±é¨åéï¼å±é¨åéä¸è½å staticï¼å
æ¬ protectedãprivateãpublic è¿äºä¹ä¸è½å
åå ï¼å±é¨å鿝ä¿å卿 ä¸çï¼èéæåéä¿åäºæ¹æ³åºï¼JDK8 å¨å ä¸ï¼ï¼å±é¨åéåºäºæ¹æ³å°±è¢«æ åæ¶äºï¼èéæåéä¸ä¼ï¼æä»¥**å¨å±é¨åéåä¸è½å static å
³é®å**ï¼éæå鿝å®ä¹å¨ç±»ä¸ï¼åå«ç±»åé
***
#### å®ä¹è°ç¨
å®ä¹æ ¼å¼ï¼
```java
public static è¿åå¼ç±»å æ¹æ³å(åæ°) {
//æ¹æ³ä½;
return æ°æ® ;
}
```
è°ç¨æ ¼å¼ï¼
```java
æ°æ®ç±»å åéå = æ¹æ³å (åæ°) ;
```
* æ¹æ³åï¼è°ç¨æ¹æ³æ¶å使ç¨çæ è¯
* åæ°ï¼ç±æ°æ®ç±»åååéåç»æï¼å¤ä¸ªåæ°ä¹é´ç¨éå·éå¼
* æ¹æ³ä½ï¼å®æåè½ç代ç å
* returnï¼å¦ææ¹æ³æä½å®æ¯ï¼ææ°æ®è¿åï¼ç¨äºææ°æ®è¿åç»è°ç¨è
å¦ææ¹æ³æä½å®æ¯
* void ç±»åçæ¹æ³ï¼ç´æ¥è°ç¨å³å¯ï¼è䏿¹æ³ä½ä¸ä¸è¬ä¸å return
* é void ç±»åçæ¹æ³ï¼æ¨èç¨å鿥æ¶è°ç¨
åçï¼æ¯ä¸ªæ¹æ³å¨è¢«è°ç¨æ§è¡çæ¶åï¼é½ä¼è¿å
¥æ å
åï¼å¹¶ä¸æ¥æèªå·±ç¬ç«çå
å空é´ï¼æ¹æ³å
é¨ä»£ç è°ç¨å®æ¯ä¹åï¼ä¼ä»æ å
åä¸å¼¹æ æ¶å¤±
***
#### 注æäºé¡¹
* æ¹æ³ä¸è½åµå¥å®ä¹
```java
public class MethodDemo {
public static void main(String[] args) {
}
public static void methodOne() {
public static void methodTwo() {
// è¿éä¼å¼åç¼è¯é误!!!
}
}
}
```
* void 表示æ è¿åå¼ï¼å¯ä»¥çç¥ returnï¼ä¹å¯ä»¥åç¬ç书å returnï¼åé¢ä¸å æ°æ®
```java
public static void methodTwo() {
//return 100; ç¼è¯é误ï¼å 为没æå
·ä½è¿åå¼ç±»å
return;
//System.out.println(100); returnè¯å¥åé¢ä¸è½è·æ°æ®æä»£ç
}
```
***
#### æ¹æ³éè½½
##### éè½½ä»ç»
æ¹æ³éè½½æåä¸ä¸ªç±»ä¸å®ä¹çå¤ä¸ªæ¹æ³ä¹é´çå
³ç³»ï¼æ»¡è¶³ä¸åæ¡ä»¶çå¤ä¸ªæ¹æ³ç¸äºææéè½½ï¼
1. å¤ä¸ªæ¹æ³å¨**åä¸ä¸ªç±»**ä¸
2. å¤ä¸ªæ¹æ³å
·æ**ç¸åçæ¹æ³å**
3. å¤ä¸ªæ¹æ³ç**åæ°ä¸ç¸å**ï¼ç±»åä¸åæè
æ°éä¸å
éè½½ä»
å¯¹åºæ¹æ³çå®ä¹ï¼ä¸æ¹æ³çè°ç¨æ å
³ï¼è°ç¨æ¹å¼åç
§æ åæ ¼å¼
éè½½ä»
é对åä¸ä¸ªç±»ä¸æ¹æ³çåç§°ä¸åæ°è¿è¡è¯å«ï¼ä¸è¿å弿 å
³ï¼**ä¸è½éè¿è¿å弿¥å¤å®ä¸¤ä¸ªæ¹æ³æ¯å¦ææéè½½**
åçï¼JVM â è¿è¡æºå¶ â æ¹æ³è°ç¨ â 夿åç
```java
public class MethodDemo {
public static void fn(int a) {
//æ¹æ³ä½
}
public static int fn(int a) { /*é误åå ï¼éè½½ä¸è¿å弿 å
³*/
//æ¹æ³ä½
}
public static void fn(int a, int b) {/*æ£ç¡®æ ¼å¼*/
//æ¹æ³ä½
}
}
```
***
##### æ¹æ³éå
éè½½çæ¹æ³å¨ç¼è¯è¿ç¨ä¸å³å¯å®æè¯å«ï¼æ¹æ³è°ç¨æ¶ Java ç¼è¯å¨ä¼æ ¹æ®æä¼ å
¥åæ°ç声æç±»åï¼æ³¨æä¸å®é
ç±»ååºåï¼æ¥éåéè½½æ¹æ³ãéåçè¿ç¨å
±å为ä¸ä¸ªé¶æ®µï¼
* ä¸é¶æ®µï¼å¨ä¸èèå¯¹åºæ¬ç±»åèªå¨è£
æç®± (auto-boxingï¼auto-unboxing)ï¼ä»¥åå¯åé¿åæ°çæ
åµä¸éåéè½½æ¹æ³
* äºé¶æ®µï¼å¦æç¬¬ä¸é¶æ®µä¸æ²¡ææ¾å°éé
çæ¹æ³ï¼é£ä¹å¨å
许èªå¨è£
æç®±ï¼ä½ä¸å
许å¯åé¿åæ°çæ
åµä¸éåéè½½æ¹æ³
* ä¸é¶æ®µï¼å¦æç¬¬äºé¶æ®µä¸æ²¡ææ¾å°éé
çæ¹æ³ï¼é£ä¹å¨å
许èªå¨è£
æç®±ä»¥åå¯åé¿åæ°çæ
åµä¸éåéè½½æ¹æ³
妿 Java ç¼è¯å¨å¨åä¸ä¸ªé¶æ®µä¸æ¾å°äºå¤ä¸ªéé
çæ¹æ³ï¼é£ä¹ä¼éæ©ä¸ä¸ªæä¸ºè´´åçï¼èå³å®è´´åç¨åº¦çä¸ä¸ªå
³é®å°±æ¯å½¢å¼åæ°ç±»åçç»§æ¿å
³ç³»ï¼**ä¸è¬ä¼éæ©å½¢åä¸ºåæ°ç±»åçåç±»çæ¹æ³ï¼å 为åç±»æ¶æ´å
·ä½çå®ç°**ï¼
```java
public class MethodDemo {
void invoke(Object obj, Object... args) { ... }
void invoke(String s, Object obj, Object... args) { ... }
invoke(null, 1); // è°ç¨ç¬¬äºä¸ªinvokeæ¹æ³ï¼éåç第äºé¶æ®µ
invoke(null, 1, 2); // è°ç¨ç¬¬äºä¸ªinvokeæ¹æ³ï¼å¹é
第ä¸ä¸ªå第äºä¸ªï¼ä½Stringæ¯Objectçåç±»
invoke(null, new Object[]{1}); // åªææå¨ç»å¼å¯åé¿åæ°çè¯æ³ç³ï¼æè½è°ç¨ç¬¬ä¸ä¸ªinvokeæ¹æ³
// å¯ååæ°åºå±æ¯æ°ç»ï¼JVM->è¿è¡æºå¶->代ç ä¼å
}
```
å æ¤ä¸æå¡å¯åé¿åæ°æ¹æ³çéè½½
***
##### ç»§æ¿éè½½
é¤äºåä¸ä¸ªç±»ä¸çæ¹æ³ï¼éè½½ä¹å¯ä»¥ä½ç¨äºè¿ä¸ªç±»æç»§æ¿èæ¥çæ¹æ³ã妿åç±»å®ä¹äºä¸ç¶ç±»ä¸**éç§ææ¹æ³**ååçæ¹æ³ï¼èä¸è¿ä¸¤ä¸ªæ¹æ³çåæ°ç±»åä¸åï¼é£ä¹å¨åç±»ä¸ï¼è¿ä¸¤ä¸ªæ¹æ³åæ ·ææäºéè½½
* 妿è¿ä¸¤ä¸ªæ¹æ³é½æ¯éæçï¼é£ä¹åç±»ä¸çæ¹æ³éèäºç¶ç±»ä¸çæ¹æ³
* 妿è¿ä¸¤ä¸ªæ¹æ³é½ä¸æ¯éæçï¼ä¸é½ä¸æ¯ç§æçï¼é£ä¹åç±»çæ¹æ³éåäºç¶ç±»ä¸çæ¹æ³ï¼ä¹å°±æ¯**夿**
***
#### åæ°ä¼ é
Java çåæ°æ¯ä»¥**å¼ä¼ é**çå½¢å¼ä¼ å
¥æ¹æ³ä¸
å¼ä¼ éåå¼ç¨ä¼ éçåºå«å¨äºä¼ éåä¼ä¸ä¼å½±åå®åçå¼ï¼**å¼ä¼ éä¼åå»ºå¯æ¬**ï¼å¼ç¨ä¼ éä¸ä¼åå»ºå¯æ¬
* åºæ¬æ°æ®ç±»åï¼å½¢å¼åæ°çæ¹åï¼ä¸å½±åå®é
åæ°
æ¯ä¸ªæ¹æ³å¨æ å
åä¸ï¼é½ä¼æç¬ç«çæ 空é´ï¼æ¹æ³è¿è¡ç»æåå°±ä¼å¼¹æ æ¶å¤±
```java
public class ArgsDemo01 {
public static void main(String[] args) {
int number = 100;
System.out.println("è°ç¨changeæ¹æ³åï¼" + number);//100
change(number);
System.out.println("è°ç¨changeæ¹æ³åï¼" + number);//100
}
public static void change(int number) {
number = 200;
}
}
```
* å¼ç¨ç±»åï¼å½¢å¼åæ°çæ¹åï¼å½±åå®é
åæ°çå¼
**å¼ç¨æ°æ®ç±»åçä¼ åï¼æ¬è´¨ä¸æ¯å°å¯¹è±¡çå°å以å¼çæ¹å¼ä¼ éå°å½¢åä¸**ï¼å
åä¸ä¼é æä¸¤ä¸ªå¼ç¨æååä¸ä¸ªå
åçææï¼æä»¥å³ä½¿æ¹æ³å¼¹æ ï¼å å
åä¸çæ°æ®ä¹å·²ç»æ¯æ¹ååçç»æ
```java
public class PassByValueExample {
public static void main(String[] args) {
Dog dog = new Dog("A");
func(dog);
System.out.println(dog.getName()); // B
}
private static void func(Dog dog) {
dog.setName("B");
}
}
class Dog {
String name;//.....
}
```
***
### æä¸¾
æä¸¾æ¯ Java ä¸çä¸ç§ç¹æ®ç±»åï¼ä¸ºäºåä¿¡æ¯çæ å¿åä¿¡æ¯çåç±»
å®ä¹æä¸¾çæ ¼å¼ï¼
```java
修饰符 enum æä¸¾åç§°{
第ä¸è¡é½æ¯ç½åæä¸¾å®ä¾çåç§°ã
}
```
æä¸¾çç¹ç¹ï¼
* æä¸¾ç±»æ¯ç¨ final 修饰çï¼æä¸¾ç±»ä¸è½è¢«ç»§æ¿
* æä¸¾ç±»é»è®¤ç»§æ¿äº java.lang.Enum æä¸¾ç±»
* æä¸¾ç±»ç第ä¸è¡é½æ¯å¸¸éï¼å¿
é¡»æ¯ç½åæä¸¾ç±»çå®ä¾åç§°
* æä¸¾ç±»ç¸å½äºæ¯å¤ä¾è®¾è®¡æ¨¡å¼
* æ¯ä¸ªæä¸¾é¡¹é½æ¯ä¸ä¸ªå®ä¾ï¼æ¯ä¸ä¸ªéææååé
| æ¹æ³å | 说æ |
| ------------------------------------------------- | ------------------------------------ |
| String name() | è·åæä¸¾é¡¹çåç§° |
| int ordinal() | è¿åæä¸¾é¡¹å¨æä¸¾ç±»ä¸çç´¢å¼å¼ |
| int compareTo(E o) | æ¯è¾ä¸¤ä¸ªæä¸¾é¡¹ï¼è¿åçæ¯ç´¢å¼å¼çå·®å¼ |
| String toString() | è¿åæä¸¾å¸¸éçåç§° |
| static T valueOf(Class type,String name) | è·åæå®æä¸¾ç±»ä¸çæå®åç§°çæä¸¾å¼ |
| values() | è·å¾ææçæä¸¾é¡¹ |
* æºç åæï¼
```java
enum Season {
SPRING , SUMMER , AUTUMN , WINTER;
}
// æä¸¾ç±»çç¼è¯ä»¥åæºä»£ç ï¼
public final class Season extends java.lang.Enum {
public static final Season SPRING = new Season();
public static final Season SUMMER = new Season();
public static final Season AUTUMN = new Season();
public static final Season WINTER = new Season();
public static Season[] values();
public static Season valueOf(java.lang.String);
}
```
* API 使ç¨
```java
public class EnumDemo {
public static void main(String[] args){
// è·åç´¢å¼
Season s = Season.SPRING;
System.out.println(s); //SPRING
System.out.println(s.ordinal()); // 0ï¼è¯¥å¼ä»£è¡¨ç´¢å¼ï¼summer å°±æ¯ 1
s.s.doSomething();
// è·åå
¨é¨æä¸¾
Season[] ss = Season.values();
for(int i = 0; i < ss.length; i++){
System.out.println(ss[i]);
}
int result = Season.SPRING.compareTo(Season.WINTER);
System.out.println(result);//-3
}
}
enum Season {
SPRING , SUMMER , AUTUMN , WINTER;
public void doSomething() {
System.out.println("hello ");
}
}
```
***
### Debug
Debug æ¯ä¾ç¨åºå使ç¨çç¨åºè°è¯å·¥å
·ï¼å®å¯ä»¥ç¨äºæ¥çç¨åºçæ§è¡æµç¨ï¼ä¹å¯ä»¥ç¨äºè¿½è¸ªç¨åºæ§è¡è¿ç¨æ¥è°è¯ç¨åºã
å æç¹ â Debug è¿è¡ â 忥è¿è¡ â ç Debugger çªå£ â ç Console çªå£

***
## 对象
### æ¦è¿°
Java æ¯ä¸ç§é¢å对象çé«çº§ç¼ç¨è¯è¨
é¢å对象ä¸å¤§ç¹å¾ï¼**å°è£
ï¼ç»§æ¿ï¼å¤æ**
两个æ¦å¿µï¼ç±»å对象
* ç±»ï¼ç¸åäºç©å
±åç¹å¾çæè¿°ï¼ç±»åªæ¯å¦æ¯ä¸çä¸ä¸ªæ¦å¿µå¹¶éçå®åå¨çï¼åªè½æè¿°ä¸ç±»äºç©
* å¯¹è±¡ï¼æ¯çå®åå¨çå®ä¾ï¼ å®ä¾ == 对象ï¼**对象æ¯ç±»çå®ä¾å**
* ç»è®ºï¼æäºç±»å对象就å¯ä»¥æè¿°ä¸åä¸çææçäºç©ï¼å¿
é¡»å
æç±»æè½æå¯¹è±¡
***
### ç±»
#### å®ä¹
å®ä¹æ ¼å¼
```java
修饰符 class ç±»å{
}
```
1. ç±»åçé¦åæ¯å»ºè®®å¤§åï¼æ»¡è¶³é©¼å³°æ¨¡å¼ï¼æ¯å¦ StudentNameCode
2. ä¸ä¸ª Java 代ç ä¸å¯ä»¥å®ä¹å¤ä¸ªç±»ï¼æç
§è§èä¸ä¸ª Java æä»¶ä¸ä¸ªç±»
3. ä¸ä¸ª Java ä»£ç æä»¶ä¸ï¼åªè½æä¸ä¸ªç±»æ¯ public 修饰ï¼**public 修饰çç±»åå¿
é¡»æä¸ºå½å Java 代ç çæä»¶åç§°**
```java
ç±»ä¸çæå:æä¸ä»
æäºå¤§æå
修饰符 class ç±»å{
1.æååé(Field): æè¿°ç±»æè
对象ç屿§ä¿¡æ¯çã
2.æåæ¹æ³(Method): æè¿°ç±»æè
对象çè¡ä¸ºä¿¡æ¯çã
3.æé å¨(Constructor): åå§åä¸ä¸ªå¯¹è±¡è¿åã
4.代ç å
5.å
é¨ç±»
}
ç±»ä¸æä¸ä»
æè¿äºç§æåï¼å¦åä»£ç æ¥éï¼
public class ClassDemo {
System.out.println(1);//æ¥é
}
```
***
#### æé å¨
æé 卿 ¼å¼ï¼
```java
修饰符 ç±»å(å½¢åå表){
}
```
ä½ç¨ï¼åå§åç±»çä¸ä¸ªå¯¹è±¡è¿å
åç±»ï¼æ åæ°æé å¨ï¼æåæ°æé å¨
注æï¼**ä¸ä¸ªç±»é»è®¤èªå¸¦ä¸ä¸ªæ åæ°æé å¨**ï¼åäºæåæ°æé å¨é»è®¤çæ åæ°æé å¨å°±æ¶å¤±ï¼è¿éè¦ç¨æ åæ°æé å¨å°±è¦éæ°å
æé å¨åå§åå¯¹è±¡çæ ¼å¼ï¼ç±»å 对象åç§° = new æé å¨
* æ åæ°æé å¨çä½ç¨ï¼åå§åä¸ä¸ªç±»ç对象ï¼ä½¿ç¨å¯¹è±¡çé»è®¤å¼åå§åï¼è¿å
* æåæ°æé å¨çä½ç¨ï¼åå§åä¸ä¸ªç±»ç对象ï¼å¯ä»¥å¨åå§åå¯¹è±¡çæ¶å为对象èµå¼ï¼è¿å
------
### å
å
ï¼åé¨å«ç±»ç管çåç§ä¸åçææ¯ï¼ä¾¿äºç®¡çææ¯ï¼æ©å±ææ¯ï¼é
è¯»ææ¯
å®ä¹å
çæ ¼å¼ï¼`package å
å`ï¼å¿
é¡»æ¾å¨ç±»åçæä¸é¢
导å
æ ¼å¼ï¼`import å
å.ç±»å`
ç¸åå
ä¸çç±»å¯ä»¥ç´æ¥è®¿é®ï¼ä¸åå
ä¸çç±»å¿
须导å
æå¯ä»¥ä½¿ç¨
***
### å°è£
å°è£
çå²å¦æç»´ï¼åçéèï¼åçæ´é²
å°è£
æåçç®çï¼æé«ä»£ç çå®å
¨æ§åå¤ç¨æ§ï¼ç»ä»¶å
å°è£
çæ¥éª¤ï¼
1. **æååéåºè¯¥ç§æï¼ç¨ private 修饰ï¼åªè½å¨æ¬ç±»ä¸ç´æ¥è®¿é®**
2. **æä¾æå¥ç getter å setter æ¹æ³æ´é²æååéçåå¼åèµå¼**
ä½¿ç¨ private 修饰æååéçåå ï¼å®ç°æ°æ®å°è£
ï¼ä¸æ³è®©å«äººä½¿ç¨ä¿®æ¹ä½ çæ°æ®ï¼æ¯è¾å®å
¨
***
### this
this å
³é®åçä½ç¨ï¼
* this å
³é®å代表äºå½å对象çå¼ç¨
* this åºç°å¨æ¹æ³ä¸ï¼**åªä¸ªå¯¹è±¡è°ç¨è¿ä¸ªæ¹æ³ this 就代表è°**
* this å¯ä»¥åºç°å¨æé å¨ä¸ï¼ä»£è¡¨æé 卿£å¨åå§åçé£ä¸ªå¯¹è±¡
* this å¯ä»¥åºååéæ¯è®¿é®çæååéè¿æ¯å±é¨åé
------
### static
#### åºæ¬ä»ç»
Java æ¯éè¿æåå鿝妿 static 修饰æ¥åºåæ¯ç±»çè¿æ¯å±äºå¯¹è±¡ç
æç
§ææ static ä¿®é¥°ï¼æååéåæ¹æ³å¯ä»¥å为ï¼
* æååéï¼
* éææååéï¼ç±»åéï¼ï¼static 修饰çæååéï¼å±äºç±»æ¬èº«ï¼**ä¸ç±»ä¸èµ·å è½½ä¸æ¬¡ï¼åªæä¸ä¸ª**ï¼ç´æ¥ç¨ç±»å访é®å³å¯
* å®ä¾æååéï¼æ static 修饰çæååéï¼å±äºç±»çæ¯ä¸ªå¯¹è±¡çï¼**ä¸ç±»ç对象ä¸èµ·å è½½**ï¼å¯¹è±¡æå¤å°ä¸ªï¼å®ä¾æååéå°±å è½½å¤å°ä¸ªï¼å¿
é¡»ç¨ç±»ç对象æ¥è®¿é®
* æåæ¹æ³ï¼
* éææ¹æ³ï¼æ static 修饰çæåæ¹æ³ç§°ä¸ºéææ¹æ³ä¹å«ç±»æ¹æ³ï¼å±äºç±»æ¬èº«çï¼ç´æ¥ç¨ç±»å访é®å³å¯
* å®ä¾æ¹æ³ï¼æ static 修饰çæåæ¹æ³ç§°ä¸ºå®ä¾æ¹æ³ï¼å±äºç±»çæ¯ä¸ªå¯¹è±¡çï¼å¿
é¡»ç¨ç±»ç对象æ¥è®¿é®
****
#### static ç¨æ³
æååéç访é®è¯æ³ï¼
* éææååéï¼åªæä¸ä»½å¯ä»¥è¢«ç±»åç±»ç对象**å
±äº«è®¿é®**
* ç±»å.éææååéï¼åä¸ä¸ªç±»ä¸è®¿é®éææååéå¯ä»¥çç¥ç±»åä¸åï¼
* 对象.éææååéï¼ä¸æ¨èï¼
* å®ä¾æååéï¼
* 对象.å®ä¾æååéï¼å
å建对象ï¼
æåæ¹æ³ç访é®è¯æ³ï¼
* éææ¹æ³ï¼æ static 修饰ï¼å±äºç±»
* ç±»å.éææ¹æ³ï¼åä¸ä¸ªç±»ä¸è®¿é®éææåå¯ä»¥çç¥ç±»åä¸åï¼
* 对象.éææ¹æ³ï¼ä¸æ¨èï¼åè JVM â è¿è¡æºå¶ â æ¹æ³è°ç¨ï¼
* å®ä¾æ¹æ³ï¼æ static 修饰ï¼å±äºå¯¹è±¡
* 对象.å®ä¾æ¹æ³
```java
public class Student {
// 1.éææ¹æ³ï¼æstatic修饰ï¼å±äºç±»ï¼ç´æ¥ç¨ç±»å访é®å³å¯ï¼
public static void inAddr(){ }
// 2.å®ä¾æ¹æ³ï¼æ static修饰ï¼å±äºå¯¹è±¡ï¼å¿
é¡»ç¨å¯¹è±¡è®¿é®ï¼
public void eat(){}
public static void main(String[] args) {
// a.ç±»å.éææ¹æ³
Student.inAddr();
inAddr();
// b.对象.å®ä¾æ¹æ³
// Student.eat(); // æ¥éäºï¼
Student sea = new Student();
sea.eat();
}
}
```
***
#### 两个é®é¢
å
åé®é¢ï¼
* æ å
ååæ¾ main æ¹æ³åå°å
* å å
ååæ¾å¯¹è±¡ååé
* æ¹æ³åºåæ¾ class åéæåéï¼jdk8 以åç§»å
¥å ï¼
访é®é®é¢ï¼
* å®ä¾æ¹æ³æ¯å¦å¯ä»¥ç´æ¥è®¿é®å®ä¾æååéï¼å¯ä»¥ï¼å 为å®ä»¬é½å±äºå¯¹è±¡
* å®ä¾æ¹æ³æ¯å¦å¯ä»¥ç´æ¥è®¿é®éææååéï¼å¯ä»¥ï¼éææååéå¯ä»¥è¢«å
±äº«è®¿é®
* å®ä¾æ¹æ³æ¯å¦å¯ä»¥ç´æ¥è®¿é®å®ä¾æ¹æ³? å¯ä»¥ï¼å®ä¾æ¹æ³åå®ä¾æ¹æ³é½å±äºå¯¹è±¡
* å®ä¾æ¹æ³æ¯å¦å¯ä»¥ç´æ¥è®¿é®éææ¹æ³ï¼å¯ä»¥ï¼éææ¹æ³å¯ä»¥è¢«å
±äº«è®¿é®
* éææ¹æ³æ¯å¦å¯ä»¥ç´æ¥è®¿é®å®ä¾åéï¼ ä¸å¯ä»¥ï¼å®ä¾åé**å¿
é¡»ç¨å¯¹è±¡è®¿é®**ï¼ï¼
* éææ¹æ³æ¯å¦å¯ä»¥ç´æ¥è®¿é®éæåéï¼ å¯ä»¥ï¼éææååéå¯ä»¥è¢«å
±äº«è®¿é®ã
* éææ¹æ³æ¯å¦å¯ä»¥ç´æ¥è®¿é®å®ä¾æ¹æ³? ä¸å¯ä»¥ï¼å®ä¾æ¹æ³å¿
é¡»ç¨å¯¹è±¡è®¿é®ï¼ï¼
* éææ¹æ³æ¯å¦å¯ä»¥ç´æ¥è®¿é®éææ¹æ³ï¼å¯ä»¥ï¼éææ¹æ³å¯ä»¥è¢«å
±äº«è®¿é®ï¼ï¼
------
### ç»§æ¿
#### åºæ¬ä»ç»
ç»§æ¿æ¯ Java ä¸ä¸è¬å°ç¹æ®çå
³ç³»ï¼æ¯ä¸ç§åç±»å°ç¶ç±»çå
³ç³»
* 被继æ¿ç类称为ï¼ç¶ç±»/è¶
ç±»
* ç»§æ¿ç¶ç±»ç类称为ï¼åç±»
ç»§æ¿çä½ç¨ï¼
* **æé«ä»£ç çå¤ç¨**ï¼ç¸å代ç å¯ä»¥å®ä¹å¨ç¶ç±»ä¸
* å类继æ¿ç¶ç±»ï¼å¯ä»¥ç´æ¥ä½¿ç¨ç¶ç±»è¿äºä»£ç ï¼ç¸å代ç éå¤å©ç¨ï¼
* åç±»å¾å°ç¶ç±»ç屿§ï¼æååéï¼åè¡ä¸ºï¼æ¹æ³ï¼ï¼è¿å¯ä»¥å®ä¹èªå·±çåè½ï¼åç±»æ´å¼ºå¤§
ç»§æ¿çç¹ç¹ï¼
1. åç±»çå
¨é¨æé å¨é»è®¤å
访é®ç¶ç±»çæ åæ°æé å¨ï¼åæ§è¡èªå·±çæé å¨
2. **åç»§æ¿**ï¼ä¸ä¸ªç±»åªè½ç»§æ¿ä¸ä¸ªç´æ¥ç¶ç±»
3. å¤å±ç»§æ¿ï¼ä¸ä¸ªç±»å¯ä»¥é´æ¥ç»§æ¿å¤ä¸ªç¶ç±»ï¼å®¶è°±ï¼
4. ä¸ä¸ªç±»å¯ä»¥æå¤ä¸ªåç±»
5. ä¸ä¸ªç±»è¦ä¹é»è®¤ç»§æ¿äº Object ç±»ï¼è¦ä¹é´æ¥ç»§æ¿äº Object ç±»ï¼**Object ç±»æ¯ Java ä¸çç¥å®ç±»**
ç»§æ¿çæ ¼å¼ï¼
```java
åç±» extends ç¶ç±»{
}
```
åç±»ä¸è½ç»§æ¿ç¶ç±»çä¸è¥¿ï¼
* åç±»ä¸è½ç»§æ¿ç¶ç±»çæé å¨ï¼åç±»æèªå·±çæé å¨
* åç±»æ¯ä¸è½å¯ä»¥ç»§æ¿ç¶ç±»çç§ææåçï¼å¯ä»¥åå°æ´åå»è®¿é®ç»§æ¿èªç¶ç±»çç§ææå
* åç±»æ¯ä¸è½ç»§æ¿ç¶ç±»çéææåï¼ç¶ç±»éææååªæä¸ä»½å¯ä»¥è¢«åç±»å
±äº«è®¿é®ï¼**å
±äº«å¹¶éç»§æ¿**
```java
public class ExtendsDemo {
public static void main(String[] args) {
Cat c = new Cat();
// c.run();
Cat.test();
System.out.println(Cat.schoolName);
}
}
class Cat extends Animal{
}
class Animal{
public static String schoolName ="seazean";
public static void test(){}
private void run(){}
}
```
***
#### åé访é®
ç»§æ¿åæååéç访é®ç¹ç¹ï¼**å°±è¿åå**ï¼åç±»ææ¾åç±»ï¼åç±»æ²¡ææ¾ç¶ç±»ï¼ç¶ç±»æ²¡æå°±æ¥é
妿è¦ç³æè®¿é®ç¶ç±»çæååéå¯ä»¥ä½¿ç¨ï¼super.ç¶ç±»æååéï¼superæç¶ç±»å¼ç¨
```java
public class ExtendsDemo {
public static void wmain(String[] args) {
Wolf w = new Wolf();w
w.showName();
}
}
class Wolf extends Animal{
private String name = "åç±»ç¼";
public void showName(){
String name = "å±é¨åç§°";
System.out.println(name); // å±é¨name
System.out.println(this.name); // å类对象çname
System.out.println(super.name); // ç¶ç±»ç
System.out.println(name1); // ç¶ç±»ç
//System.out.println(name2); // æ¥éãåç±»ç¶ç±»é½æ²¡æ
}
}
class Animal{
public String name = "ç¶ç±»å¨ç©åç§°";
public String name1 = "ç¶ç±»";
}
```
***
#### æ¹æ³è®¿é®
å类继æ¿äºç¶ç±»å°±å¾å°äºç¶ç±»çæ¹æ³ï¼**å¯ä»¥ç´æ¥è°ç¨**ï¼åæé修饰符çéå¶ï¼ä¹å¯ä»¥éåæ¹æ³
æ¹æ³éåï¼åç±»éåä¸ä¸ªä¸ç¶ç±»ç³æä¸æ ·çæ¹æ³æ¥**è¦ç**ç¶ç±»çè¯¥æ¹æ³
æ¹æ³éåçæ ¡éªæ³¨è§£ï¼@Override
* æ¹æ³å äºè¿ä¸ªæ³¨è§£ï¼é£å°±å¿
é¡»æ¯æåéåç¶ç±»çæ¹æ³ï¼å¦åæ¥é
* @Override ä¼å¿ï¼å¯è¯»æ§å¥½ï¼å®å
¨ï¼ä¼é
**åç±»å¯ä»¥æ©å±ç¶ç±»çåè½ï¼ä½ä¸è½æ¹åç¶ç±»åæçåè½**ï¼éåæä»¥ä¸ä¸ä¸ªéå¶ï¼
- åç±»æ¹æ³çè®¿é®æéå¿
须大äºçäºç¶ç±»æ¹æ³
- åç±»æ¹æ³çè¿åç±»åå¿
é¡»æ¯ç¶ç±»æ¹æ³è¿åç±»åæä¸ºå
¶åç±»å
- åç±»æ¹æ³æåºçå¼å¸¸ç±»åå¿
é¡»æ¯ç¶ç±»æåºå¼å¸¸ç±»åæä¸ºå
¶åç±»å
ç»§æ¿ä¸çéèé®é¢ï¼
- åç±»åç¶ç±»æ¹æ³é½æ¯éæçï¼é£ä¹åç±»ä¸çæ¹æ³ä¼éèç¶ç±»ä¸çæ¹æ³
- å¨åç±»ä¸å¯ä»¥å®ä¹åç¶ç±»æååéååçæååéï¼æ¤æ¶åç±»çæååééèäºç¶ç±»çæååéï¼å¨å建对象为对象åé
å
åçè¿ç¨ä¸ï¼**éèåéä¾ç¶ä¼è¢«åé
å
å**
```java
public class ExtendsDemo {
public static void main(String[] args) {
Wolf w = new Wolf();
w.run();
}
}
class Wolf extends Animal{
@Override
public void run(){}//
}
class Animal{
public void run(){}
}
```
***
#### 常è§é®é¢
* 为ä»ä¹åç±»æé å¨ä¼å
è°ç¨ç¶ç±»æé å¨ï¼
1. åç±»çæé å¨ç第ä¸è¡é»è®¤ super() è°ç¨ç¶ç±»çæ åæ°æé å¨ï¼åä¸åé½åå¨
2. å类继æ¿ç¶ç±»ï¼å类就å¾å°äºç¶ç±»ç屿§åè¡ä¸ºãè°ç¨åç±»æé å¨åå§ååç±»å¯¹è±¡æ°æ®æ¶ï¼å¿
é¡»å
è°ç¨ç¶ç±»æé å¨åå§åç»§æ¿èªç¶ç±»ç屿§åè¡ä¸º
3. åè JVM â ç±»å è½½ â 对象å建
```java
class Animal {
public Animal() {
System.out.println("==ç¶ç±»Animalçæ åæ°æé å¨==");
}
}
class Tiger extends Animal {
public Tiger() {
super(); // é»è®¤åå¨çï¼æ ¹æ®åæ°å»å¹é
è°ç¨ç¶ç±»çæé å¨ã
System.out.println("==åç±»Tigerçæ åæ°æé å¨==");
}
public Tiger(String name) {
//super(); é»è®¤åå¨çï¼æ ¹æ®åæ°å»å¹é
è°ç¨ç¶ç±»çæé å¨ã
System.out.println("==åç±»Tigerçæåæ°æé å¨==");
}
}
```
* **为ä»ä¹ Java æ¯åç»§æ¿çï¼**
çï¼åè¯æ³ï¼åå¦ Java å¯ä»¥å¤ç»§æ¿ï¼è¯·çå¦ä¸ä»£ç ï¼
```java
class A{
public void test(){
System.out.println("A");
}
}
class B{
public void test(){
System.out.println("B");
}
}
class C extends A , B {
public static void main(String[] args){
C c = new C();
c.test();
// åºç°äºç±»çäºä¹æ§ï¼æä»¥Javaä¸è½å¤ç»§æ¿ï¼ï¼
}
}
```
------
### super
ç»§æ¿å super è°ç¨ç¶ç±»æé å¨ï¼ç¶ç±»æé å¨åå§åç»§æ¿èªç¶ç±»çæ°æ®ã
æ»ç»ä¸æå±ï¼
* this 代表äºå½å对象çå¼ç¨ï¼ç»§æ¿ä¸æä»£å类对象ï¼ï¼this.åç±»æååéãthis.åç±»æåæ¹æ³ã**this(...)** å¯ä»¥æ ¹æ®åæ°å¹é
è®¿é®æ¬ç±»å
¶ä»æé å¨
* super 代表äºç¶ç±»å¯¹è±¡çå¼ç¨ï¼ç»§æ¿ä¸æä»£äºç¶ç±»å¯¹è±¡ç©ºé´ï¼ï¼super.ç¶ç±»æååéãsuper.ç¶ç±»çæåæ¹æ³ãsuper(...) å¯ä»¥æ ¹æ®åæ°å¹é
访é®ç¶ç±»çæé å¨
注æï¼
* this(...) åç¨æ¬ç±»å
¶ä»æé å¨ï¼super(...) è°ç¨ç¶ç±»çæé å¨
* this(...) æ super(...) å¿
é¡»æ¾å¨æé å¨ç第ä¸è¡ï¼å¦åæ¥é
* this(...) å super(...) **ä¸è½åæ¶åºç°**卿é å¨ä¸ï¼å 为æé 彿°å¿
é¡»åºç°å¨ç¬¬ä¸è¡ä¸ï¼åªè½éæ©ä¸ä¸ª
```java
public class ThisDemo {
public static void main(String[] args) {
// éæ±ï¼å¸æå¦æä¸å妿 ¡é»è®¤å°±æ¯âå¼ ä¸âï¼
Student s1 = new Student("天è¬å
å¸
", 1000 );
Student s2 = new Student("é½å¤©å¤§å£", 2000, "æ¸
å大å¦" );
}
}
class Study extends Student {
public Study(String name, int age, String schoolName) {
super(name , age , schoolName) ;
// æ ¹æ®åæ°å¹é
è°ç¨ç¶ç±»æé å¨
}
}
class Student{
private String name ;
private int age ;
private String schoolName ;
public Student() {
}
public Student(String name , int age){
// åç¨å
弿é å¨çåè½ï¼
this(name , age , "å¼ ä¸");
}
public Student(String name, int age, String schoolName) {
this.name = name;
this.age = age;
this.schoolName = schoolName;
}
// .......get + set
}
```
***
### final
#### åºæ¬ä»ç»
final ç¨äºä¿®é¥°ï¼ç±»ï¼æ¹æ³ï¼åé
* final 修饰类ï¼ç±»ä¸è½è¢«ç»§æ¿äºï¼ç±»ä¸çæ¹æ³ååéå¯ä»¥ä½¿ç¨
* final å¯ä»¥ä¿®é¥°æ¹æ³ï¼æ¹æ³å°±ä¸è½è¢«éå
* final 修饰åéæ»è§åï¼åéæä¸ä»
è½è¢«èµå¼ä¸æ¬¡
final å abstract çå
³ç³»æ¯**äºæ¥å
³ç³»**ï¼ä¸è½åæ¶ä¿®é¥°ç±»æè
åæ¶ä¿®é¥°æ¹æ³
***
#### 修饰åé
##### éæåé
final ä¿®é¥°éææååéï¼åéåæäºå¸¸é
常éï¼æ public static final 修饰ï¼åç§°åæ¯å
¨é¨å¤§åï¼å¤ä¸ªåè¯ç¨ä¸åçº¿è¿æ¥
final ä¿®é¥°éææååéå¯ä»¥å¨åªäºå°æ¹èµå¼ï¼
1. å®ä¹çæ¶åèµå¼ä¸æ¬¡
2. å¯ä»¥å¨éæä»£ç åä¸èµå¼ä¸æ¬¡
```java
public class FinalDemo {
//常éï¼public static final修饰ï¼åç§°åæ¯å
¨é¨å¤§åï¼ä¸åçº¿è¿æ¥ã
public static final String SCHOOL_NAME = "å¼ ä¸" ;
public static final String SCHOOL_NAME1;
static{
//SCHOOL_NAME = "java";//æ¥é
SCHOOL_NAME1 = "å¼ ä¸1";
}
}
```
***
##### å®ä¾åé
final 修饰åéçæ»è§åï¼æä¸ä»
è½è¢«èµå¼ä¸æ¬¡
final 修饰å®ä¾æååéå¯ä»¥å¨åªäºå°æ¹èµå¼ 1 次ï¼
1. å®ä¹çæ¶åèµå¼ä¸æ¬¡
2. å¯ä»¥å¨å®ä¾ä»£ç åä¸èµå¼ä¸æ¬¡
3. å¯ä»¥å¨æ¯ä¸ªæé å¨ä¸èµå¼ä¸æ¬¡
```java
public class FinalDemo {
private final String name = "å¼ ä¸" ;
private final String name1;
private final String name2;
{
// å¯ä»¥å¨å®ä¾ä»£ç åä¸èµå¼ä¸æ¬¡ã
name1 = "å¼ ä¸1";
}
//æé å¨èµå¼ä¸æ¬¡
public FinalDemo(){
name2 = "å¼ ä¸2";
}
public FinalDemo(String a){
name2 = "å¼ ä¸2";
}
public static void main(String[] args) {
FinalDemo f1 = new FinalDemo();
//f1.name = "å¼ ä¸1"; // ç¬¬äºæ¬¡èµå¼ æ¥éï¼
}
}
```
***
### æ½è±¡ç±»
#### åºæ¬ä»ç»
> ç¶ç±»ç¥éåç±»è¦å®ææä¸ªåè½ï¼ä½æ¯æ¯ä¸ªåç±»å®ç°æ
åµä¸ä¸æ ·
æ½è±¡æ¹æ³ï¼æ²¡ææ¹æ³ä½ï¼åªææ¹æ³ç¾åï¼å¿
é¡»ç¨ abstract ä¿®é¥°çæ¹æ³å°±æ¯æ½è±¡æ¹æ³
æ½è±¡ç±»ï¼æ¥ææ½è±¡æ¹æ³çç±»å¿
é¡»å®ä¹ææ½è±¡ç±»ï¼å¿
é¡»ç¨ abstract 修饰ï¼**æ½è±¡ç±»æ¯ä¸ºäºè¢«ç»§æ¿**
ä¸ä¸ªç±»ç»§æ¿æ½è±¡ç±»ï¼**å¿
é¡»éåæ½è±¡ç±»çå
¨é¨æ½è±¡æ¹æ³**ï¼å¦åè¿ä¸ªç±»å¿
é¡»å®ä¹ææ½è±¡ç±»
```java
public class AbstractDemo {
public static void main(String[] args) {
Dog d = new Dog();
d.run();
}
}
class Dog extends Animal{
@Override
public void run() {
System.out.println("ðè·");
}
}
abstract class Animal{
public abstract void run();
}
```
***
#### 常è§é®é¢
ä¸ãæ½è±¡ç±»æ¯å¦ææé å¨ï¼æ¯å¦å¯ä»¥å建对象?
* æ½è±¡ç±»ææé å¨ï¼ä½æ¯æ½è±¡ç±»ä¸è½å建对象ï¼ç±»çå
¶ä»æåå®é½å
·å¤ï¼æé 卿ä¾ç»å类继æ¿åè°ç¨ç¶ç±»æé å¨ä½¿ç¨
* æ½è±¡ç±»ä¸å卿½è±¡æ¹æ³ï¼ä½ä¸è½æ§è¡ï¼**æ½è±¡ç±»ä¸ä¹å¯æ²¡ææ½è±¡æ¹æ³**
> æ½è±¡å¨å¦æ¯ä¸æ¬èº«æå³çä¸è½å®ä¾å
```java
public class AbstractDemo {
public static void main(String[] args) {
//Animal a = new Animal(); æ½è±¡ç±»ä¸è½å建对象ï¼
//a.run(); // æ½è±¡æ¹æ³ä¸è½æ§è¡
}
}
abstract class Animal{
private String name;
public static String schoolName = "å¼ ä¸";
public Animal(){ }
public abstract void run();
//æ®éæ¹æ³
public void go(){ }
}
```
äºãstatic ä¸ abstract è½åæ¶ä½¿ç¨åï¼
çï¼ä¸è½ï¼è¢« static ä¿®é¥°çæ¹æ³å±äºç±»ï¼æ¯ç±»èªå·±çä¸è¥¿ï¼ä¸æ¯ç»åç±»æ¥ç»§æ¿çï¼èæ½è±¡æ¹æ³æ¬èº«æ²¡æå®ç°ï¼å°±æ¯ç¨æ¥ç»å类继æ¿
***
#### å卿ä¹
**被继æ¿**ï¼æ½è±¡ç±»å°±æ¯ä¸ºäºè¢«å类继æ¿ï¼å¦åæ½è±¡ç±»å°æ¯«æ æä¹ï¼æ ¸å¿ï¼
æ½è±¡ç±»ä½ç°çæ¯"æ¨¡æ¿ææ³"ï¼**é¨åå®ç°ï¼é¨åæ½è±¡**ï¼å¯ä»¥ä½¿ç¨æ½è±¡ç±»è®¾è®¡ä¸ä¸ªæ¨¡æ¿æ¨¡å¼
```java
//ä½ææ¨¡æ¿
public class ExtendsDemo {
public static void main(String[] args) {
Student xiaoMa = new Student();
xiaoMa.write();
}
}
class Student extends Template{
@Override
public String writeText() {return "\tå
容"}
}
// 1.åä¸ä¸ªæ¨¡æ¿ç±»ï¼ä»£è¡¨äºä½ææ¨¡æ¿ã
abstract class Template{
private String title = "\t\t\t\t\tæ é¢";
private String start = "\tå¼å¤´";
private String last = "\tç»å°¾";
public void write(){
System.out.println(title+"\n"+start);
System.out.println(writeText());
System.out.println(last);
}
// æ£æé¨åå®ä¹ææ½è±¡æ¹æ³ï¼äº¤ç»åç±»éåï¼ï¼
public abstract String writeText();
}
```
***
### æ¥å£
#### åºæ¬ä»ç»
æ¥å£æ¯ Java è¯è¨ä¸ä¸ç§å¼ç¨ç±»åï¼æ¯æ¹æ³çéåã
æ¥å£æ¯æ´å å½»åºçæ½è±¡ï¼æ¥å£ä¸åªææ½è±¡æ¹æ³å常éï¼æ²¡æå
¶ä»æå
```java
修饰符 interface æ¥å£åç§°{
// æ½è±¡æ¹æ³
// é»è®¤æ¹æ³
// éææ¹æ³
// ç§ææ¹æ³
}
```
* æ½è±¡æ¹æ³ï¼æ¥å£ä¸çæ½è±¡æ¹æ³é»è®¤ä¼å ä¸ public abstract ä¿®é¥°ï¼æä»¥å¯ä»¥çç¥ä¸å
* éææ¹æ³ï¼éææ¹æ³å¿
é¡»ææ¹æ³ä½
* 常éï¼æ¯ public static final 修饰çæååéï¼ä»
è½è¢«èµå¼ä¸æ¬¡ï¼å¼ä¸è½æ¹åã常éçåç§°è§èä¸è¦æ±å
¨é¨å¤§åï¼å¤ä¸ªåè¯ä¸åçº¿è¿æ¥ï¼public static final å¯ä»¥çç¥ä¸å
```java
public interface InterfaceDemo{
//public static final String SCHOOL_NAME = "å¼ ä¸";
String SCHOOL_NAME = "å¼ ä¸";
//public abstract void run();
void run();//é»è®¤è¡¥å
}
```
***
#### å®ç°æ¥å£
**æ¥å£æ¯ç¨æ¥è¢«ç±»å®ç°çã**
* ç±»ä¸ç±»æ¯ç»§æ¿å
³ç³»ï¼ä¸ä¸ªç±»åªè½ç´æ¥ç»§æ¿ä¸ä¸ªç¶ç±»ï¼åç»§æ¿
* ç±»ä¸æ¥å£æ¯å®ç°å
³ç³»ï¼ä¸ä¸ªç±»å¯ä»¥å®ç°å¤ä¸ªæ¥å£ï¼å¤å®ç°ï¼æ¥å£ä¸è½ç»§æ¿ç±»
* æ¥å£ä¸æ¥å£ç»§æ¿å
³ç³»ï¼**å¤ç»§æ¿**
```java
修饰符 class å®ç°ç±»åç§° implements æ¥å£1,æ¥å£2,æ¥å£3,....{
}
修饰符 interface æ¥å£å extend æ¥å£1,æ¥å£2,æ¥å£3,....{
}
```
å®ç°å¤ä¸ªæ¥å£çä½¿ç¨æ³¨æäºé¡¹ï¼
1. å½ä¸ä¸ªç±»å®ç°å¤ä¸ªæ¥å£æ¶ï¼å¤ä¸ªæ¥å£ä¸åå¨ååçéææ¹æ³å¹¶ä¸ä¼å²çªï¼åªè½éè¿åèªæ¥å£å访é®éææ¹æ³
2. å½ä¸ä¸ªç±»å®ç°å¤ä¸ªæ¥å£æ¶ï¼å¤ä¸ªæ¥å£ä¸åå¨ååçé»è®¤æ¹æ³ï¼å®ç°ç±»å¿
é¡»éåè¿ä¸ªæ¹æ³
3. å½ä¸ä¸ªç±»æ¢ç»§æ¿ä¸ä¸ªç¶ç±»ï¼åå®ç°è¥å¹²ä¸ªæ¥å£æ¶ï¼ç¶ç±»ä¸æåæ¹æ³ä¸æ¥å£ä¸é»è®¤æ¹æ³éåï¼åç±»**å°±è¿éæ©æ§è¡ç¶ç±»**çæåæ¹æ³
4. æ¥å£ä¸ï¼æ²¡ææé å¨ï¼**ä¸è½å建对象**ï¼æ¥å£æ¯æ´å½»åºçæ½è±¡ï¼è¿æé å¨é½æ²¡æï¼èªç¶ä¸è½å建对象
```java
public class InterfaceDemo {
public static void main(String[] args) {
Student s = new Student();
s.run();
s.rule();
}
}
class Student implements Food, Person{
@Override
public void eat() {}
@Override
public void run() {}
}
interface Food{
void eat();
}
interface Person{
void run();
}
//å¯ä»¥ç´æ¥ interface Person extend Food,
//ç¶å class Student implements Person ææä¸æ ·
```
***
#### æ°å¢åè½
jdk1.8 以忰å¢çåè½ï¼
* é»è®¤æ¹æ³ï¼å°±æ¯æ®éå®ä¾æ¹æ³ï¼
* å¿
é¡»ç¨ default 修饰ï¼é»è®¤ä¼ public 修饰
* å¿
é¡»ç¨æ¥å£çå®ç°ç±»ç对象æ¥è°ç¨
* å¿
é¡»æé»è®¤å®ç°
* éææ¹æ³
* é»è®¤ä¼ public 修饰
* æ¥å£çéææ¹æ³å¿
é¡»ç¨æ¥å£çç±»åæ¬èº«æ¥è°ç¨
* è°ç¨æ ¼å¼ï¼ClassName.method()
* å¿
é¡»æé»è®¤å®ç°
* ç§ææ¹æ³ï¼JDK 1.9 æå¼å§æçï¼åªè½å¨**æ¬ç±»ä¸**被å
¶ä»çé»è®¤æ¹æ³æè
ç§ææ¹æ³è®¿é®
```java
public class InterfaceDemo {
public static void main(String[] args) {
// 1.é»è®¤æ¹æ³è°ç¨ï¼å¿
é¡»ç¨æ¥å£çå®ç°ç±»å¯¹è±¡è°ç¨ã
Man m = new Man();
m.run();
m.work();
// 2.æ¥å£çéææ¹æ³å¿
é¡»ç¨æ¥å£çç±»åæ¬èº«æ¥è°ç¨ã
InterfaceJDK8.inAddr();
}
}
class Man implements InterfaceJDK8 {
@Override
public void work() {
System.out.println("å·¥ä½ä¸ããã");
}
}
interface InterfaceJDK8 {
//æ½è±¡æ¹æ³ï¼ï¼
void work();
// a.é»è®¤æ¹æ³ï¼å°±æ¯ä¹ååçæ®éå®ä¾æ¹æ³ï¼
// å¿
é¡»ç¨æ¥å£çå®ç°ç±»ç对象æ¥è°ç¨ã
default void run() {
go();
System.out.println("å¼å§è·æ¥ðâ");
}
// b.éææ¹æ³
// 注æï¼æ¥å£çéææ¹æ³å¿
é¡»ç¨æ¥å£çç±»åæ¬èº«æ¥è°ç¨
static void inAddr() {
System.out.println("æä»¬å¨æ¦æ±");
}
// c.ç§ææ¹æ³ï¼å°±æ¯ç§æçå®ä¾æ¹æ³ï¼: JDK 1.9æå¼å§æçã
// åªè½å¨æ¬æ¥å£ä¸è¢«å
¶ä»çé»è®¤æ¹æ³æè
ç§ææ¹æ³è®¿é®ã
private void go() {
System.out.println("å¼å§ãã");
}
}
```
***
#### å¯¹æ¯æ½è±¡ç±»
| **åæ°** | **æ½è±¡ç±»** | **æ¥å£** |
| ------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| é»è®¤çæ¹æ³å®ç° | å¯ä»¥æé»è®¤çæ¹æ³å®ç° | æ¥å£å®å
¨æ¯æ½è±¡çï¼jdk8 以åæé»è®¤çå®ç° |
| å®ç° | åç±»ä½¿ç¨ **extends** å
³é®åæ¥ç»§æ¿æ½è±¡ç±»ã妿åç±»ä¸æ¯æ½è±¡ç±»çè¯ï¼å®éè¦æä¾æ½è±¡ç±»ä¸ææå£°æçæ¹æ³çå®ç°ã | å类使ç¨å
³é®å **implements** æ¥å®ç°æ¥å£ãå®éè¦æä¾æ¥å£ä¸ææå£°æçæ¹æ³çå®ç° |
| æé å¨ | æ½è±¡ç±»å¯ä»¥ææé å¨ | æ¥å£ä¸è½ææé å¨ |
| 䏿£å¸¸Javaç±»çåºå« | é¤äºä¸è½å®ä¾åæ½è±¡ç±»ä¹å¤ï¼åæ®é Java 类没æä»»ä½åºå« | æ¥å£æ¯å®å
¨ä¸åçç±»å |
| 访é®ä¿®é¥°ç¬¦ | æ½è±¡æ¹æ³æ **public**ã**protected** å **default** è¿äºä¿®é¥°ç¬¦ | æ¥å£é»è®¤ä¿®é¥°ç¬¦æ¯ **public**ï¼å«ç修饰符éè¦ææ¹æ³ä½ |
| mainæ¹æ³ | æ½è±¡æ¹æ³å¯ä»¥æ main æ¹æ³å¹¶ä¸æä»¬å¯ä»¥è¿è¡å® | jdk8 以忥壿²¡æ main æ¹æ³ï¼ä¸è½è¿è¡ï¼jdk8 以忥å£å¯ä»¥æ default å static æ¹æ³ï¼å¯ä»¥è¿è¡ main æ¹æ³ |
| å¤ç»§æ¿ | æ½è±¡æ¹æ³å¯ä»¥ç»§æ¿ä¸ä¸ªç±»åå®ç°å¤ä¸ªæ¥å£ | æ¥å£å¯ä»¥ç»§æ¿ä¸ä¸ªæå¤ä¸ªå
¶å®æ¥å£ï¼æ¥å£ä¸å¯ç»§æ¿ç±» |
| é度 | æ¯æ¥å£é度è¦å¿« | æ¥å£æ¯ç¨å¾®æç¹æ
¢çï¼å 为å®éè¦æ¶é´å»å¯»æ¾å¨ç±»ä¸å®ç°çæ¹æ³ |
| æ·»å æ°æ¹æ³ | 妿徿½è±¡ç±»ä¸æ·»å æ°çæ¹æ³ï¼å¯ä»¥ç»å®æä¾é»è®¤çå®ç°ï¼å æ¤ä¸éè¦æ¹åç°å¨ç代ç | 妿徿¥å£ä¸æ·»å æ¹æ³ï¼é£ä¹å¿
é¡»æ¹åå®ç°è¯¥æ¥å£çç±» |
------
### 夿
#### åºæ¬ä»ç»
å¤æçæ¦å¿µï¼åä¸ä¸ªå®ä½åæ¶å
·æå¤ç§å½¢å¼åä¸ä¸ªç±»åçå¯¹è±¡ï¼æ§è¡åä¸ä¸ªè¡ä¸ºï¼å¨ä¸åçç¶æä¸ä¼è¡¨ç°åºä¸åçè¡ä¸ºç¹å¾
å¤æçæ ¼å¼ï¼
* ç¶ç±»ç±»åèå´ > å类类åèå´
```java
ç¶ç±»ç±»å 对象åç§° = new åç±»æé å¨;
æ¥å£ 对象åç§° = new å®ç°ç±»æé å¨;
```
å¤æçæ§è¡ï¼
* å¯¹äºæ¹æ³çè°ç¨ï¼**ç¼è¯ç左边ï¼è¿è¡çå³è¾¹**ï¼åæ´¾æºå¶ï¼
* 对äºåéçè°ç¨ï¼**ç¼è¯ç左边ï¼è¿è¡ç左边**
夿ç使ç¨è§åï¼
* å¿
é¡»åå¨ç»§æ¿æè
å®ç°å
³ç³»
* å¿
é¡»åå¨ç¶ç±»ç±»åçåéå¼ç¨å类类åç对象
* å卿¹æ³éå
夿çä¼å¿ï¼
* å¨å¤æå½¢å¼ä¸ï¼å³è¾¹å¯¹è±¡å¯ä»¥å®ç°ç»ä»¶å忢ï¼ä¾¿äºæ©å±åç»´æ¤ï¼ä¹å¯ä»¥å®ç°ç±»ä¸ç±»ä¹é´ç**è§£è¦**
* ç¶ç±»ç±»åä½ä¸ºæ¹æ³å½¢å¼åæ°ï¼ä¼ éåç±»å¯¹è±¡ç»æ¹æ³ï¼å¯ä»¥ä¼ å
¥ä¸åå类对象è¿è¡æ¹æ³çè°ç¨ï¼æ´è½ä½ç°åºå¤æç**æ©å±æ§**ä¸ä¾¿å©æ§
夿çå£å¿ï¼
* 夿形å¼ä¸ï¼ä¸è½ç´æ¥è°ç¨åç±»ç¹æçåè½ï¼å 为ç¼è¯ç左边ï¼ç¶ç±»ä¸æ²¡æåç±»ç¬æçåè½ï¼æä»¥ä»£ç å¨ç¼è¯é¶æ®µå°±ç´æ¥æ¥éäº
```java
public class PolymorphicDemo {
public static void main(String[] args) {
Animal c = new Cat();
c.run();
//c.eat();//æ¥é ç¼è¯ç左边 éè¦å¼ºè½¬
go(c);
go(new Dog);
}
//ç¨ Dogæè
Cat 齿²¡åæ³è®©ææå¨ç©åä¸è¿æ¥ï¼åªè½ç¨Anima
public static void go(Animal d){}
}
class Dog extends Animal{}
class Cat extends Animal{
public void eat();
@Override
public void run(){}
}
class Animal{
public void run(){}
}
```
***
#### ä¸ä¸è½¬å
>åºæ¬æ°æ®ç±»åç转æ¢ï¼
>
>1. å°èå´ç±»åçåéæè
å¼å¯ä»¥ç´æ¥èµå¼ç»å¤§èå´ç±»åçåé
>2. 大èå´ç±»åçåéæè
å¼å¿
须强å¶ç±»å转æ¢ç»å°èå´ç±»åçåé
å¼ç¨æ°æ®ç±»åç**èªå¨**ç±»å转æ¢è¯æ³ï¼å类类åç对象æè
åéå¯ä»¥èªå¨ç±»å转æ¢èµå¼ç»ç¶ç±»ç±»åçåé
**ç¶ç±»å¼ç¨æåå类对象**
- **åä¸è½¬å (upcasting)**ï¼éè¿å类对象ï¼å°èå´ï¼å®ä¾åç¶ç±»å¯¹è±¡ï¼å¤§èå´ï¼ï¼è¿ç§å±äºèªå¨è½¬æ¢
- **åä¸è½¬å (downcasting)**ï¼éè¿ç¶ç±»å¯¹è±¡ï¼å¤§èå´ï¼å®ä¾åå类对象ï¼å°èå´ï¼ï¼è¿ç§å±äºå¼ºå¶è½¬æ¢
```java
public class PolymorphicDemo {
public static void main(String[] args){
Animal a = new Cat(); // åä¸è½¬å
Cat c = (Cat)a; // åä¸è½¬å
}
}
class Animal{}
class Cat extends Animal{}
```
***
#### instanceof
instanceofï¼å¤æå·¦è¾¹ç对象æ¯å¦æ¯å³è¾¹çç±»çå®ä¾ï¼æè
æ¯å
¶ç´æ¥æé´æ¥åç±»ï¼æè
æ¯å
¶æ¥å£çå®ç°ç±»
* å¼ç¨ç±»å强å¶ç±»å转æ¢ï¼ç¶ç±»ç±»åçåéæè
对象强å¶ç±»åè½¬æ¢æå类类åçåéï¼å¦åæ¥é
* 强å¶ç±»å转æ¢çæ ¼å¼ï¼**ç±»å åéåç§° = (ç±»å)(对象æè
åé)**
* æç»§æ¿/å®ç°å
³ç³»ç两个类åå°±å¯ä»¥è¿è¡å¼ºå¶ç±»å转æ¢ï¼ç¼è¯é¶æ®µä¸å®ä¸æ¥éï¼ä½æ¯è¿è¡é¶æ®µå¯è½åºç°ç±»å转æ¢å¼å¸¸ ClassCastException
```java
public class Demo{
public static void main(String[] args){
Aniaml a = new Dog();
//Dog d = (Dog)a;
//Cat c = (Cat)a; ç¼è¯ä¸æ¥éï¼è¿è¡æ¥ClassCastExceptioné误
if(a instanceof Cat){
Cat c = (Cat)a;
} else if(a instanceof Dog) {
Dog d = (Dog)a;
}
}
}
class Dog extends Animal{}
class Cat extends Animal{}
class Animal{}
```
***
### å
é¨ç±»
#### æ¦è¿°
å
é¨ç±»æ¯ç±»çäºå¤§æåä¹ä¸ï¼æååéï¼æ¹æ³ï¼æé å¨ï¼ä»£ç åï¼å
é¨ç±»
æ¦å¿µï¼å®ä¹å¨ä¸ä¸ªç±»éé¢ç类就æ¯å
é¨ç±»
ä½ç¨ï¼æä¾æ´å¥½çå°è£
æ§ï¼ä½ç°åºç»ä»¶ææ³ï¼**é´æ¥è§£å³ç±»æ æ³å¤ç»§æ¿å¼èµ·çä¸ç³»åé®é¢**
åç±»ï¼éæå
é¨ç±»ãå®ä¾å
é¨ç±»ï¼æåå
é¨ç±»ï¼ãå±é¨å
é¨ç±»ã**å¿åå
é¨ç±»**ï¼éç¹ï¼
***
#### éæå
é¨ç±»
å®ä¹ï¼æ static 修饰ï¼å±äºå¤é¨ç±»æ¬èº«ï¼ä¼å è½½ä¸æ¬¡
éæå
é¨ç±»ä¸çæåç ç©¶ï¼
* ç±»æçæåå®é½æï¼éæå
é¨ç±»å±äºå¤é¨ç±»æ¬èº«ï¼åªä¼å è½½ä¸æ¬¡
* ç¹ç¹ä¸å¤é¨ç±»æ¯å®å
¨ä¸æ ·çï¼åªæ¯ä½ç½®å¨å«äººéé¢
* å¯ä»¥å®ä¹éææå
éæå
é¨ç±»çè®¿é®æ ¼å¼ï¼å¤é¨ç±»åç§°.å
é¨ç±»åç§°
éæå
é¨ç±»åå»ºå¯¹è±¡çæ ¼å¼ï¼å¤é¨ç±»åç§°.å
é¨ç±»åç§° 对象åç§° = new å¤é¨ç±»åç§°.å
é¨ç±»æé å¨
éæå
é¨ç±»çè®¿é®æå±ï¼
* éæå
é¨ç±»ä¸æ¯å¦å¯ä»¥ç´æ¥è®¿é®å¤é¨ç±»çéææå? å¯ä»¥ï¼å¤é¨ç±»çéææååªæä¸ä»½ï¼å¯ä»¥è¢«å
񄧮
* éæå
é¨ç±»ä¸æ¯å¦å¯ä»¥ç´æ¥è®¿é®å¤é¨ç±»çå®ä¾æå? ä¸å¯ä»¥ï¼å¤é¨ç±»çæåå¿
é¡»ç¨å¤é¨ç±»å¯¹è±¡è®¿é®
```java
public class Demo{
public static void main(String[] args){
Outter.Inner in = new Outter.Inner();
}
}
static class Outter{
public static int age;
private double salary;
public static class Inner{
//æ¥æç±»çææåè½ æé å¨ æ¹æ³ æååé
System.out.println(age);
//System.out.println(salary);æ¥é
}
}
```
***
#### å®ä¾å
é¨ç±»
å®ä¹ï¼æ static 修饰çå
é¨ç±»ï¼å±äºå¤é¨ç±»çæ¯ä¸ªå¯¹è±¡ï¼è·çå¤é¨ç±»å¯¹è±¡ä¸èµ·å è½½
å®ä¾å
é¨ç±»çæåç¹ç¹ï¼å®ä¾å
é¨ç±»ä¸ä¸è½å®ä¹éææåï¼å
¶ä»é½å¯ä»¥å®ä¹
å®ä¾å
é¨ç±»çè®¿é®æ ¼å¼ï¼å¤é¨ç±»åç§°.å
é¨ç±»åç§°
åå»ºå¯¹è±¡çæ ¼å¼ï¼å¤é¨ç±»åç§°.å
é¨ç±»åç§° 对象åç§° = new å¤é¨ç±»æé å¨.new å
鍿é å¨
* `Outter.Inner in = new Outter().new Inner()`
**å®ä¾å
é¨ç±»å¯ä»¥è®¿é®å¤é¨ç±»çå
¨é¨æå**
* å®ä¾å
é¨ç±»ä¸å¯ä»¥ç´æ¥è®¿é®å¤é¨ç±»çéææåï¼å¤é¨ç±»çéææåå¯ä»¥è¢«å
±äº«è®¿é®
* å®ä¾å
é¨ç±»ä¸å¯ä»¥è®¿é®å¤é¨ç±»çå®ä¾æåï¼å®ä¾å
é¨ç±»å±äºå¤é¨ç±»å¯¹è±¡ï¼å¯ä»¥ç´æ¥è®¿é®å¤é¨ç±»å¯¹è±¡çå®ä¾æå
***
#### å±é¨å
é¨ç±»
å±é¨å
é¨ç±»ï¼å®ä¹å¨æ¹æ³ä¸ï¼å¨æé å¨ä¸ï¼ä»£ç åä¸ï¼for 循ç¯ä¸å®ä¹çå
é¨ç±»
å±é¨å
é¨ç±»ä¸çæåç¹ç¹ï¼åªè½å®ä¹å®ä¾æåï¼ä¸è½å®ä¹éææå
```java
public class InnerClass{
public static void main(String[] args){
String name;
class{}
}
public static void test(){
class Animal{}
class Cat extends Animal{}
}
}
```
***
#### å¿åå
é¨ç±»
å¿åå
é¨ç±»ï¼æ²¡æååçå±é¨å
é¨ç±»
å¿åå
é¨ç±»çæ ¼å¼ï¼
```java
new ç±»å|æ½è±¡ç±»|æ¥å£(å½¢å){
//æ¹æ³éåã
}
```
å¿åå
é¨ç±»çç¹ç¹ï¼
* å¿åå
é¨ç±»ä¸è½å®ä¹éææå
* å¿åå
é¨ç±»ä¸æ¦ååºæ¥ï¼å°±ä¼ç«å³å建ä¸ä¸ªå¿åå
é¨ç±»ç对象è¿å
* **å¿åå
é¨ç±»ç对象çç±»åç¸å½äºæ¯å½å new çé£ä¸ªçç±»åçå类类å**
* å¿åå
é¨ç±»å¼ç¨å±é¨åéå¿
é¡»æ¯**常é**ï¼åºå±å建为å
é¨ç±»çæååéï¼åå ï¼JVM â è¿è¡æºå¶ â 代ç ä¼åï¼
```java
public class Anonymity {
public static void main(String[] args) {
Animal a = new Animal(){
@Override
public void run() {
System.out.println("ç«è·çè´¼æº~~");
//System.out.println(n);
}
};
a.run();
a.go();
}
}
abstract class Animal{
public abstract void run();
public void go(){
System.out.println("å¼å§go~~~");
}
}
```
***
### æé符
æéä¿®é¥°ç¬¦ï¼æåç§**ï¼private -> 缺ç -> protected - > public ï¼**
å¯ä»¥ä¿®é¥°æååéï¼ä¿®é¥°æ¹æ³ï¼ä¿®é¥°æé å¨ï¼å
é¨ç±»ï¼ä¸å修饰符修饰çæåè½å¤è¢«è®¿é®çæéå°åå°éå¶
| åç§ä¿®é¥°ç¬¦è®¿é®æé | private | 缺ç | protected | public |
| ------------------ | :-----: | :--: | :-------: | :----: |
| æ¬ç±»ä¸ | â | â | â | â |
| æ¬å
ä¸çåç±»ä¸ | X | â | â | â |
| æ¬å
ä¸å
¶ä»ç±»ä¸ | X | â | â | â |
| å
¶ä»å
ä¸çåç±»ä¸ | X | X | â | â |
| å
¶ä»å
ä¸çå
¶ä»ç±»ä¸ | X | X | X | â |
protected ç¨äºä¿®é¥°æåï¼è¡¨ç¤ºå¨ç»§æ¿ä½ç³»ä¸æå对äºåç±»å¯è§
* åºç±»ç protected æåæ¯å
å
å¯è§çï¼å¹¶ä¸å¯¹åç±»å¯è§
* è¥åç±»ä¸åºç±»ä¸å¨åä¸å
ä¸ï¼é£ä¹åç±»å®ä¾å¯ä»¥è®¿é®å
¶ä»åºç±»ç»§æ¿èæ¥ç protected æ¹æ³ï¼éåï¼ï¼èä¸è½è®¿é®åºç±»å®ä¾ç protected æ¹æ³
***
### 代ç å
#### éæä»£ç å
éæä»£ç åçæ ¼å¼ï¼
```java
static {
}
```
* éæä»£ç åç¹ç¹ï¼
* å¿
é¡»æ static 修饰ï¼åªè½è®¿é®éæèµæº
* ä¼ä¸ç±»ä¸èµ·ä¼å
å è½½ï¼ä¸èªå¨è§¦åæ§è¡ä¸æ¬¡
* éæä»£ç åä½ç¨ï¼
* å¯ä»¥å¨æ§è¡ç±»çæ¹æ³çæä½ä¹åå
å¨éæä»£ç åä¸è¿è¡éæèµæºçåå§å
* **å
æ§è¡éæä»£ç åï¼å¨æ§è¡ main 彿°éçæä½**
```java
public class CodeDemo {
public static String schoolName ;
public static ArrayList lists = new ArrayList<>();
// éæä»£ç å,å±äºç±»ï¼ä¸ç±»ä¸èµ·å è½½ä¸æ¬¡!
static {
System.out.println("éæä»£ç åè¢«è§¦åæ§è¡~~~~~~~");
// å¨éæä»£ç åä¸è¿è¡éæèµæºçåå§åæä½
schoolName = "å¼ ä¸";
lists.add("3");
lists.add("4");
lists.add("5");
}
public static void main(String[] args) {
System.out.println("mainæ¹æ³è¢«æ§è¡");
System.out.println(schoolName);
System.out.println(lists);
}
}
/*éæä»£ç åè¢«è§¦åæ§è¡~~~~~~~
mainæ¹æ³è¢«æ§è¡
å¼ ä¸
[3, 4, 5] */
```
***
#### å®ä¾ä»£ç å
å®ä¾ä»£ç åçæ ¼å¼ï¼
```java
{
}
```
* å®ä¾ä»£ç åçç¹ç¹ï¼
* æ static 修饰ï¼å±äºå¯¹è±¡
* ä¼ä¸ç±»ç对象ä¸èµ·å è½½ï¼æ¯æ¬¡å建类çå¯¹è±¡çæ¶åï¼å®ä¾ä»£ç åé½ä¼è¢«å è½½ä¸èªå¨è§¦åæ§è¡ä¸æ¬¡
* å®ä¾ä»£ç åç代ç å¨åºå±å®é
䏿¯æåå°æ¯ä¸ªæé å¨ä¸å»æ§è¡ç
* å®ä¾ä»£ç åçä½ç¨ï¼å®ä¾ä»£ç åå¯ä»¥å¨å建对象ä¹åè¿è¡å®ä¾èµæºçåå§åæä½
```java
public class CodeDemo {
private String name;
private ArrayList lists = new ArrayList<>();
{
name = "代ç å";
lists.add("java");
System.out.println("å®ä¾ä»£ç åè¢«è§¦åæ§è¡ä¸æ¬¡~~~~~~~~");
}
public CodeDemo02(){ }//æé æ¹æ³
public CodeDemo02(String name){}
public static void main(String[] args) {
CodeDemo c = new CodeDemo();//å®ä¾ä»£ç åè¢«è§¦åæ§è¡ä¸æ¬¡
System.out.println(c.name);
System.out.println(c.lists);
new CodeDemo02();//å®ä¾ä»£ç åè¢«è§¦åæ§è¡ä¸æ¬¡
}
}
```
***
## API
### Object
#### åºæ¬ä»ç»
Object ç±»æ¯ Java ä¸çç¥å®ç±»ï¼ä¸ä¸ªç±»æè
é»è®¤ç»§æ¿ Object ç±»ï¼æè
é´æ¥ç»§æ¿ Object ç±»ï¼Object ç±»çæ¹æ³æ¯ä¸ååç±»é½å¯ä»¥ç´æ¥ä½¿ç¨
Object ç±»å¸¸ç¨æ¹æ³ï¼
* `public String toString()`ï¼é»è®¤æ¯è¿åå½å对象å¨å å
åä¸çå°åä¿¡æ¯ï¼ç±»çå
¨éå@å
åå°åï¼ä¾ï¼Student@735b478ï¼
* ç´æ¥è¾åºå¯¹è±¡åç§°ï¼é»è®¤ä¼è°ç¨ toString() æ¹æ³ï¼æä»¥çç¥ toString() ä¸åï¼
* 妿è¾åºå¯¹è±¡çå
容ï¼éè¦éå toString() æ¹æ³ï¼toString æ¹æ³åå¨çæä¹æ¯ä¸ºäºè¢«åç±»éå
* `public boolean equals(Object o)`ï¼é»è®¤æ¯æ¯è¾ä¸¤ä¸ªå¯¹è±¡çå¼ç¨æ¯å¦ç¸å
* `protected Object clone()`ï¼å建并è¿åæ¤å¯¹è±¡ç坿¬
åªè¦ä¸¤ä¸ªå¯¹è±¡çå
容䏿 ·ï¼å°±è®¤ä¸ºæ¯ç¸ççï¼
```java
public boolean equals(Object o) {
// 1.夿æ¯å¦èªå·±åèªå·±æ¯è¾ï¼å¦ææ¯åä¸ä¸ªå¯¹è±¡æ¯è¾ç´æ¥è¿åtrue
if (this == o) return true;
// 2.å¤æè¢«æ¯è¾è
æ¯å¦ä¸ºnull ,以忝妿¯å¦çç±»åã
if (o == null || this.getClass() != o.getClass()) return false;
// 3.oä¸å®æ¯å¦çç±»åï¼å¼ºå¶è½¬æ¢æå¦çï¼å¼å§æ¯è¾å
容ï¼
Student student = (Student) o;
return age == student.age &&
sex == student.sex &&
Objects.equals(name, student.name);
}
```
**é¢è¯é¢**ï¼== å equals çåºå«
* == æ¯è¾çæ¯åéï¼æ ï¼å
åä¸åæ¾ç对象çï¼å ï¼å
åå°åï¼ç¨æ¥å¤æä¸¤ä¸ªå¯¹è±¡ç**å°å**æ¯å¦ç¸åï¼å³æ¯å¦æ¯æç¸åä¸ä¸ªå¯¹è±¡ï¼æ¯è¾çæ¯çæ£æä¹ä¸çæéæä½
* Object ç±»ä¸çæ¹æ³ï¼**é»è®¤æ¯è¾ä¸¤ä¸ªå¯¹è±¡çå¼ç¨**ï¼éå equals æ¹æ³æ¯è¾çæ¯ä¸¤ä¸ªå¯¹è±¡ç**å
容**æ¯å¦ç¸çï¼ææçç±»é½æ¯ç»§æ¿èª java.lang.Object ç±»ï¼æä»¥éç¨äºææå¯¹è±¡
hashCode çä½ç¨ï¼
* hashCode çåå¨ä¸»è¦æ¯ç¨äºæ¥æ¾çå¿«æ·æ§ï¼å¦ Hashtableï¼HashMap çï¼å¯ä»¥å¨æ£ååå¨ç»æä¸ç¡®å®å¯¹è±¡çåå¨å°å
* å¦æä¸¤ä¸ªå¯¹è±¡ç¸åï¼å°±æ¯éç¨äº equals(java.lang.Object) æ¹æ³ï¼é£ä¹è¿ä¸¤ä¸ªå¯¹è±¡ç hashCode ä¸å®è¦ç¸å
* åå¸å¼ç¸åçæ°æ®ä¸ä¸å®å
容ç¸åï¼å
容ç¸åçæ°æ®åå¸å¼ä¸å®ç¸å
***
#### æ·±æµ
å
é
Object ç clone() æ¯ protected æ¹æ³ï¼ä¸ä¸ªç±»ä¸æ¾å¼å»éå clone()ï¼å°±ä¸è½ç´æ¥å»è°ç¨è¯¥ç±»å®ä¾ç clone() æ¹æ³
æ·±æµ
æ·è´ï¼å
éï¼çæ¦å¿µï¼
* æµ
æ·è´ (shallowCopy)ï¼**å¯¹åºæ¬æ°æ®ç±»åè¿è¡å¼ä¼ éï¼å¯¹å¼ç¨æ°æ®ç±»ååªæ¯å¤å¶äºå¼ç¨**ï¼è¢«å¤å¶å¯¹è±¡å±æ§çææçå¼ç¨ä»ç¶æå忥ç对象ï¼ç®èè¨ä¹å°±æ¯å¢å äºä¸ä¸ªæéæååæ¥å¯¹è±¡çå
åå°å
**Java ä¸çå¤å¶æ¹æ³åºæ¬é½æ¯æµ
æ·è´**ï¼Object.clone()ãSystem.arraycopy()ãArrays.copyOf()
* æ·±æ·è´ (deepCopy)ï¼å¯¹åºæ¬æ°æ®ç±»åè¿è¡å¼ä¼ éï¼å¯¹å¼ç¨æ°æ®ç±»åæ¯ä¸ä¸ªæ´ä¸ªç¬ç«ç对象æ·è´ï¼ä¼æ·è´ææç屿§å¹¶æåç卿åé
çå
åï¼ç®èè¨ä¹å°±æ¯æææå±æ§å¤å¶å°ä¸ä¸ªæ°çå
åï¼å¢å ä¸ä¸ªæéæåæ°å
åãæä»¥ä½¿ç¨æ·±æ·è´çæ
åµä¸ï¼éæ¾å
åçæ¶åä¸ä¼åºç°ä½¿ç¨æµ
æ·è´æ¶éæ¾åä¸åå
åçé误
Cloneable æ¥å£æ¯ä¸ä¸ªæ è¯æ§æ¥å£ï¼å³è¯¥æ¥å£ä¸å
å«ä»»ä½æ¹æ³ï¼å
æ¬ cloneï¼ï¼ä½æ¯å¦æä¸ä¸ªç±»æ³åæ³çè¿è¡å
éï¼é£ä¹å°±å¿
é¡»å®ç°è¿ä¸ªæ¥å£ï¼å¨ä½¿ç¨ clone() æ¹æ³æ¶ï¼è¥è¯¥ç±»æªå®ç° Cloneable æ¥å£ï¼åæåºå¼å¸¸
* Clone & Copyï¼`Student s = new Student`
`Student s1 = s`ï¼åªæ¯ copy äºä¸ä¸ referenceï¼s å s1 æåå
åä¸åä¸ä¸ª Objectï¼å¯¹å¯¹è±¡çä¿®æ¹ä¼å½±å对æ¹
`Student s2 = s.clone()`ï¼ä¼çæä¸ä¸ªæ°ç Student 对象ï¼å¹¶ä¸å s å
·æç¸åç屿§å¼åæ¹æ³
* Shallow Clone & Deep Cloneï¼
æµ
å
éï¼Object ä¸ç clone() æ¹æ³å¨å¯¹æä¸ªå¯¹è±¡å
鿶坹å
¶ä»
ä»
æ¯ç®åå°æ§è¡å对åç copy
* å¯¹åºæ¬æ°æ®ç±»ååå
è£
ç±»çå
éæ¯æ²¡æé®é¢çãStringãInteger çå
è£
ç±»åå¨å
å䏿¯**ä¸å¯ä»¥è¢«æ¹åç对象**ï¼æä»¥å¨ä½¿ç¨å
éæ¶å¯ä»¥è§ä¸ºåºæ¬ç±»åï¼åªéæµ
å
éå¼ç¨å³å¯
* 妿坹ä¸ä¸ªå¼ç¨ç±»åè¿è¡å
éæ¶åªæ¯å
éäºå®çå¼ç¨ï¼ååå§å¯¹è±¡å
±äº«å¯¹è±¡æååé

æ·±å
éï¼å¨å¯¹æ´ä¸ªå¯¹è±¡æµ
å
éåï¼å¯¹å
¶å¼ç¨åéè¿è¡å
éï¼å¹¶å°å
¶æ´æ°å°æµ
å
é对象ä¸å»
```java
public class Student implements Cloneable{
private String name;
private Integer age;
private Date date;
@Override
protected Object clone() throws CloneNotSupportedException {
Student s = (Student) super.clone();
s.date = (Date) date.clone();
return s;
}
//.....
}
```
SDP â å建å â å忍¡å¼
***
### Objects
Objects ç±»ä¸ Object æ¯ç»§æ¿å
³ç³»
Objects çæ¹æ³ï¼
* `public static boolean equals(Object a, Object b)`ï¼æ¯è¾ä¸¤ä¸ªå¯¹è±¡æ¯å¦ç¸å
```java
public static boolean equals(Object a, Object b) {
// è¿è¡éç©ºå¤æï¼ä»èå¯ä»¥é¿å
空æéå¼å¸¸
return a == b || a != null && a.equals(b);
}
```
* `public static boolean isNull(Object obj)`ï¼å¤æå鿝å¦ä¸º null ï¼ä¸º null è¿å true
* `public static String toString(对象)`ï¼è¿ååæ°ä¸å¯¹è±¡çå符串表示形å¼
* `public static String toString(对象, é»è®¤å符串)`ï¼è¿å对象çå符串表示形å¼
```java
public class ObjectsDemo {
public static void main(String[] args) {
Student s1 = null;
Student s2 = new Student();
System.out.println(Objects.equals(s1 , s2));//æ¨è使ç¨
// System.out.println(s1.equals(s2)); // 空æéå¼å¸¸
System.out.println(Objects.isNull(s1));
System.out.println(s1 == null);//ç´æ¥å¤ææ¯è¾å¥½
}
}
public class Student {
}
```
***
### String
#### åºæ¬ä»ç»
String 被声æä¸º finalï¼å æ¤ä¸å¯è¢«ç»§æ¿ **ï¼Integer çå
è£
ç±»ä¹ä¸è½è¢«ç»§æ¿ï¼**
```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
}
```
å¨ Java 9 ä¹åï¼String ç±»çå®ç°æ¹ç¨ byte æ°ç»åå¨å符串ï¼åæ¶ä½¿ç¨ `coder` æ¥æ è¯ä½¿ç¨äºåªç§ç¼ç
value æ°ç»è¢«å£°æä¸º finalï¼è¿æå³ç value æ°ç»åå§åä¹åå°±ä¸è½åå¼ç¨å
¶å®æ°ç»ï¼å¹¶ä¸ String å
鍿²¡ææ¹å value æ°ç»çæ¹æ³ï¼å æ¤å¯ä»¥**ä¿è¯ String ä¸å¯åï¼ä¹ä¿è¯çº¿ç¨å®å
¨**
注æï¼ä¸è½æ¹åçæææ¯**æ¯æ¬¡æ´æ¹å符串é½ä¼äº§çæ°ç对象**ï¼å¹¶ä¸æ¯å¯¹åå§å¯¹è±¡è¿è¡æ¹å
```java
String s = "abc";
s = s + "cd"; //s = abccd æ°å¯¹è±¡
```
****
#### å¸¸ç¨æ¹æ³
å¸¸ç¨ APIï¼
* `public boolean equals(String s)`ï¼æ¯è¾ä¸¤ä¸ªå符串å
容æ¯å¦ç¸åãåºå大å°å
* `public boolean equalsIgnoreCase(String anotherString)`ï¼æ¯è¾å符串çå
容ï¼å¿½ç¥å¤§å°å
* `public int length()`ï¼è¿åæ¤å符串çé¿åº¦
* `public String trim()`ï¼è¿åä¸ä¸ªå符串ï¼å
¶å¼ä¸ºæ¤å符串ï¼å¹¶å é¤ä»»ä½å导åå°¾éç©ºæ ¼
* `public String[] split(String regex)`ï¼å°å符串æç»å®çæ£å表达å¼å岿å符串æ°ç»
* `public char charAt(int index)`ï¼åç´¢å¼å¤çå¼
* `public char[] toCharArray()`ï¼å°å符串æå为å符æ°ç»åè¿å
* `public boolean startsWith(String prefix)`ï¼æµè¯æ¤å符串æ¯å¦ä»¥æå®çåç¼å¼å¤´
* `public int indexOf(String str)`ï¼è¿åæå®ååç¬¦ä¸²ç¬¬ä¸æ¬¡åºç°çå符串å
çç´¢å¼ï¼æ²¡æè¿å -1
* `public int lastIndexOf(String str)`ï¼è¿åå符串æå䏿¬¡åºç° str çç´¢å¼ï¼æ²¡æè¿å -1
* `public String substring(int beginIndex)`ï¼è¿ååå符串ï¼ä»¥åå符串æå®ç´¢å¼å¤å°ç»å°¾
* `public String substring(int i, int j)`ï¼æå®ç´¢å¼å¤æ©å±å° j - 1 çä½ç½®ï¼å符串é¿åº¦ä¸º j - i
* `public String toLowerCase()`ï¼å°æ¤ String ææå符转æ¢ä¸ºå°åï¼ä½¿ç¨é»è®¤è¯è¨ç¯å¢çè§å
* `public String toUpperCase()`ï¼ä½¿ç¨é»è®¤è¯è¨ç¯å¢çè§åå°æ¤ String ææå符转æ¢ä¸ºå¤§å
* `public String replace(CharSequence target, CharSequence replacement)`ï¼ä½¿ç¨æ°å¼ï¼å°å符串ä¸çæ§å¼æ¿æ¢ï¼å¾å°æ°çå符串
```java
String s = 123-78;
s.replace("-","");//12378
```
***
#### æé æ¹å¼
æé æ¹æ³ï¼
* `public String()`ï¼å建ä¸ä¸ªç©ºç½å符串对象ï¼ä¸å«æä»»ä½å
容
* `public String(char[] chs)`ï¼æ ¹æ®å符æ°ç»çå
å®¹ï¼æ¥å建å符串对象
* `public String(String original)`ï¼æ ¹æ®ä¼ å
¥çå符串å
å®¹ï¼æ¥å建å符串对象
ç´æ¥èµå¼ï¼`String s = "abc"` ç´æ¥èµå¼çæ¹å¼å建å符串对象ï¼å
å®¹å°±æ¯ abc
- éè¿æé æ¹æ³å建ï¼éè¿ new å建çåç¬¦ä¸²å¯¹è±¡ï¼æ¯ä¸æ¬¡ new é½ä¼ç³è¯·ä¸ä¸ªå
å空é´ï¼è½ç¶å
容ç¸åï¼ä½æ¯å°åå¼ä¸åï¼**è¿åå å
åä¸å¯¹è±¡çå¼ç¨**
- ç´æ¥èµå¼æ¹å¼å建ï¼ä»¥ `" "` æ¹å¼ç»åºçå符串ï¼åªè¦å符åºåç¸åï¼é¡ºåºå大å°åï¼ï¼æ 论å¨ç¨åºä»£ç ä¸åºç°å 次ï¼JVM é½åªä¼**å¨ String Pool ä¸å建ä¸ä¸ªå符串对象**ï¼å¹¶å¨åç¬¦ä¸²æ± ä¸ç»´æ¤
`String str = new String("abc")` å建å符串对象ï¼
* å建ä¸ä¸ªå¯¹è±¡ï¼åç¬¦ä¸²æ± ä¸å·²ç»åå¨ abc 对象ï¼é£ä¹ç´æ¥å¨å建ä¸ä¸ªå¯¹è±¡æ¾å
¥å ä¸ï¼è¿åå å
å¼ç¨
* å建两个对象ï¼åç¬¦ä¸²æ± ä¸æªæ¾å° abc 对象ï¼é£ä¹åå«å¨å ä¸ååç¬¦ä¸²æ± ä¸å建ä¸ä¸ªå¯¹è±¡ï¼åç¬¦ä¸²æ± ä¸çæ¯è¾é½æ¯éç¨ equals()
`new String("a") + new String("b")` å建å符串对象ï¼
* 对象 1ï¼new StringBuilder()
* 对象 2ï¼new String("a")ã对象 3ï¼å¸¸éæ± ä¸ç a
* 对象 4ï¼new String("b")ã对象 5ï¼å¸¸éæ± ä¸ç b
* StringBuilder ç toString()ï¼
```java
@Override
public String toString() {
return new String(value, 0, count);
}
```
* 对象 6ï¼new String("ab")
* StringBuilder ç toString() è°ç¨ï¼**å¨åç¬¦ä¸²å¸¸éæ± 䏿²¡æçæ ab**ï¼new String("ab") ä¼å建两个对象å ä¸ºä¼ åæ°çæ¶å使ç¨åé¢éå建äºå¯¹è±¡ abï¼å½ä½¿ç¨æ°ç»æé String 对象æ¶ï¼æ²¡æå å
¥å¸¸éæ± çæä½
***
#### String Pool
##### åºæ¬ä»ç»
åç¬¦ä¸²å¸¸éæ± ï¼String Pool / StringTable / ä¸²æ± ï¼ä¿åçææå符串åé¢éï¼literal stringsï¼ï¼è¿äºåé¢éå¨ç¼è¯æ¶æå°±ç¡®å®ï¼å¸¸éæ± ç±»ä¼¼äº Java ç³»ç»çº§å«æä¾ç**ç¼å**ï¼åæ¾å¯¹è±¡åå¼ç¨
* StringTableï¼ç±»ä¼¼ HashTable ç»æï¼éè¿ `-XX:StringTableSize` 设置大å°ï¼JDK 1.8 ä¸é»è®¤ 60013
* 叏鿱 ä¸çå符串ä»
æ¯ç¬¦å·ï¼ç¬¬ä¸æ¬¡ä½¿ç¨æ¶æå为对象ï¼å¯ä»¥é¿å
éå¤å建å符串对象
* å符串**åé**çæ¼æ¥çåçæ¯ StringBuilder#appendï¼append æ¹æ³æ¯åç¬¦ä¸²æ¼æ¥æçé«ï¼JDK 1.8ï¼
* å符串**常é**æ¼æ¥çåçæ¯ç¼è¯æä¼åï¼æ¼æ¥ç»ææ¾å
¥å¸¸éæ±
* å¯ä»¥ä½¿ç¨ String ç intern() æ¹æ³å¨è¿è¡è¿ç¨å°å符串添å å° String Pool ä¸
***
##### intern()
JDK 1.8ï¼å½ä¸ä¸ªå符串è°ç¨ intern() æ¹æ³æ¶ï¼å¦æ String Pool ä¸ï¼
* åå¨ä¸ä¸ªå符串å该å符串å¼ç¸çï¼å°±ä¼è¿å String Pool ä¸å符串çå¼ç¨ï¼éè¦å鿥æ¶ï¼
* ä¸åå¨ï¼ä¼æå¯¹è±¡ç**å¼ç¨å°å**å¤å¶ä¸ä»½æ¾å
¥ä¸²æ± ï¼å¹¶è¿åä¸²æ± ä¸çå¼ç¨å°åï¼åææ¯å å
åæè¯¥å¯¹è±¡ï¼å 为 Pool å¨å ä¸ï¼ä¸ºäºèçå
åä¸åå建æ°å¯¹è±¡
JDK 1.6ï¼å°è¿ä¸ªå符串对象å°è¯æ¾å
¥ä¸²æ± ï¼å¦ææå°±ä¸æ¾å
¥ï¼è¿åå·²æçä¸²æ± ä¸ç对象çå¼ç¨ï¼å¦ææ²¡æä¼ææ¤å¯¹è±¡å¤å¶ä¸ä»½ï¼æ¾å
¥ä¸²æ± ï¼æä¸²æ± ä¸ç对象è¿å
```java
public class Demo {
// 叏鿱 ä¸çä¿¡æ¯é½å è½½å°è¿è¡æ¶å¸¸éæ± ï¼è¿æ¶a b abæ¯å¸¸éæ± ä¸ç符å·ï¼è¿ä¸æ¯javaåç¬¦ä¸²å¯¹è±¡ï¼æ¯ææ°ç
// ldc #2 伿 a 符å·å为 "a" å符串对象 ldc:åç¼è¯åçæä»¤
// ldc #3 伿 b 符å·å为 "b" å符串对象
// ldc #4 伿 ab 符å·å为 "ab" å符串对象
public static void main(String[] args) {
String s1 = "a"; // ææ°ç
String s2 = "b";
String s3 = "ab"; // 串æ±
String s4 = s1 + s2; // è¿åçæ¯å å
å°å
// åçï¼new StringBuilder().append("a").append("b").toString() new String("ab")
String s5 = "a" + "b"; // javac å¨ç¼è¯æé´çä¼åï¼ç»æå·²ç»å¨ç¼è¯æç¡®å®ä¸ºab
System.out.println(s3 == s4); // false
System.out.println(s3 == s5); // true
String x2 = new String("c") + new String("d"); // new String("cd")
// è½ç¶ newï¼ä½æ¯å¨åç¬¦ä¸²å¸¸éæ± 没æ cd 对象ï¼å 为 toString() æ¹æ³
x2.intern();
String x1 = "cd";
System.out.println(x1 == x2); //true
}
}
```
- == æ¯è¾åºæ¬æ°æ®ç±»åï¼æ¯è¾çæ¯å
·ä½çå¼
- == æ¯è¾å¼ç¨æ°æ®ç±»åï¼æ¯è¾çæ¯å¯¹è±¡å°åå¼
ç»è®ºï¼
```java
String s1 = "ab"; // ä»
æ¾å
¥ä¸²æ±
String s2 = new String("a") + new String("b"); // ä»
æ¾å
¥å
// ä¸é¢ä¸¤æ¡æä»¤çç»æåä¸é¢ç ææ ç¸å
String s = new String("ab");
```
****
##### 常è§é®é¢
é®é¢ä¸ï¼
```java
public static void main(String[] args) {
String s = new String("a") + new String("b");//new String("ab")
//å¨ä¸ä¸è¡ä»£ç æ§è¡å®ä»¥åï¼åç¬¦ä¸²å¸¸éæ± ä¸å¹¶æ²¡æ"ab"
String s2 = s.intern();
//jdk6ï¼ä¸²æ± ä¸å建ä¸ä¸ªå符串"ab"
//jdk8ï¼ä¸²æ± 䏿²¡æå建å符串"ab",èæ¯å建ä¸ä¸ªå¼ç¨æå new String("ab")ï¼å°æ¤å¼ç¨è¿å
System.out.println(s2 == "ab");//jdk6:true jdk8:true
System.out.println(s == "ab");//jdk6:false jdk8:true
}
```
é®é¢äºï¼
```java
public static void main(String[] args) {
String str1 = new StringBuilder("58").append("tongcheng").toString();
System.out.println(str1 == str1.intern());//trueï¼åç¬¦ä¸²æ± ä¸ä¸åå¨ï¼æå ä¸çå¼ç¨å¤å¶ä¸ä»½æ¾å
¥ä¸²æ±
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2 == str2.intern());//falseï¼åç¬¦ä¸²æ± ä¸åå¨ï¼ç´æ¥è¿åå·²ç»åå¨çå¼ç¨
}
```
åå ï¼
* System ç±»å½è°ç¨ Version çéææ¹æ³ï¼å¯¼è´ Version åå§åï¼
```java
private static void initializeSystemClass() {
sun.misc.Version.init();
}
```
* Version ç±»åå§åæ¶éè¦å¯¹éæå¸¸éåæ®µåå§åï¼è¢« launcher_name éæå¸¸éåæ®µæå¼ç¨ç `"java"` å符串åé¢é就被æ¾å
¥çåç¬¦ä¸²å¸¸éæ± ï¼
```java
package sun.misc;
public class Version {
private static final String launcher_name = "java";
private static final String java_version = "1.8.0_221";
private static final String java_runtime_name = "Java(TM) SE Runtime Environment";
private static final String java_profile_name = "";
private static final String java_runtime_version = "1.8.0_221-b11";
//...
}
```
***
##### å
åä½ç½®
Java 7 ä¹åï¼String Pool 被æ¾å¨è¿è¡æ¶å¸¸éæ± ä¸ï¼å±äºæ°¸ä¹
代ï¼Java 7 以åï¼String Pool 被移å°å ä¸ï¼è¿æ¯å 为永ä¹
代çç©ºé´æéï¼å¨å¤§é使ç¨å符串çåºæ¯ä¸ä¼å¯¼è´ OutOfMemoryError é误
æ¼ç¤º StringTable ä½ç½®ï¼
* `-Xmx10m` 设置å å
å 10m
* å¨ JDK8 ä¸è®¾ç½®ï¼ `-Xmx10m -XX:-UseGCOverheadLimit`ï¼è¿è¡åæ°å¨ Run Configurations VM optionsï¼
* å¨ JDK6 ä¸è®¾ç½®ï¼ `-XX:MaxPermSize=10m`
```java
public static void main(String[] args) throws InterruptedException {
List list = new ArrayList();
int i = 0;
try {
for (int j = 0; j < 260000; j++) {
list.add(String.valueOf(j).intern());
i++;
}
} catch (Throwable e) {
e.printStackTrace();
} finally {
System.out.println(i);
}
}
```

***
#### ä¼å叏鿱
ä¸¤ç§æ¹å¼ï¼
* è°æ´ -XX:StringTableSize=桶个æ°ï¼æ°éè¶å°ï¼æ§è½è¶å·®
* intern å°å符串对象æ¾å
¥å¸¸éæ± ï¼éè¿å¤ç¨å符串çå¼ç¨ï¼åå°å
åå ç¨
```java
/**
* æ¼ç¤º intern åå°å
åå ç¨
* -XX:StringTableSize=200000 -XX:+PrintStringTableStatistics
* -Xsx500m -Xmx500m -XX:+PrintStringTableStatistics -XX:StringTableSize=200000
*/
public class Demo1_25 {
public static void main(String[] args) throws IOException {
List address = new ArrayList<>();
System.in.read();
for (int i = 0; i < 10; i++) {
//å¾å¤æ°æ®
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("linux.words"), "utf-8"))) {
String line = null;
long start = System.nanoTime();
while (true) {
line = reader.readLine();
if(line == null) {
break;
}
address.add(line.intern());
}
System.out.println("cost:" +(System.nanoTime()-start)/1000000);
}
}
System.in.read();
}
}
```
***
#### ä¸å¯å好å¤
* å¯ä»¥ç¼å hash å¼ï¼ä¾å¦ String ç¨å HashMap ç keyï¼ä¸å¯åçç¹æ§å¯ä»¥ä½¿å¾ hash å¼ä¹ä¸å¯åï¼åªè¦è¿è¡ä¸æ¬¡è®¡ç®
* String Pool çéè¦ï¼å¦æä¸ä¸ª String 对象已ç»è¢«å建è¿äºï¼å°±ä¼ä» String Pool ä¸åå¾å¼ç¨ï¼åªæ String æ¯ä¸å¯åçï¼æå¯è½ä½¿ç¨ String Pool
* å®å
¨æ§ï¼String ç»å¸¸ä½ä¸ºåæ°ï¼String ä¸å¯åæ§å¯ä»¥ä¿è¯åæ°ä¸å¯åãä¾å¦å¨ä½ä¸ºç½ç»è¿æ¥åæ°çæ
åµä¸å¦æ String æ¯å¯åçï¼é£ä¹å¨ç½ç»è¿æ¥è¿ç¨ä¸ï¼String 被æ¹åï¼æ¹å String çé£ä¸æ¹ä»¥ä¸ºç°å¨è¿æ¥çæ¯å
¶å®ä¸»æºï¼èå®é
æ
åµå´ä¸ä¸å®æ¯
* String ä¸å¯åæ§å¤©çå
·å¤çº¿ç¨å®å
¨ï¼å¯ä»¥å¨å¤ä¸ªçº¿ç¨ä¸å®å
¨å°ä½¿ç¨
* 鲿¢å类继æ¿ï¼ç ´å String ç API ç使ç¨
***
### StringBuilder
String StringBuffer å StringBuilder åºå«ï¼
* String : **ä¸å¯å**çå符åºåï¼çº¿ç¨å®å
¨
* StringBuffer : **å¯å**çå符åºåï¼çº¿ç¨å®å
¨ï¼åºå±æ¹æ³å synchronizedï¼æçä½
* StringBuilder : **å¯å**çå符åºåï¼JDK5.0 æ°å¢ï¼çº¿ç¨ä¸å®å
¨ï¼æçé«
ç¸åç¹ï¼åºå±ä½¿ç¨ char[] åå¨
æé æ¹æ³ï¼
* `public StringBuilder()`ï¼å建ä¸ä¸ªç©ºç½å¯åå符串对象ï¼ä¸å«æä»»ä½å
容
* `public StringBuilder(String str)`ï¼æ ¹æ®å符串çå
å®¹ï¼æ¥å建å¯åå符串对象
常ç¨API :
* `public StringBuilder append(ä»»æç±»å)`ï¼æ·»å æ°æ®ï¼å¹¶è¿å对象æ¬èº«
* `public StringBuilder reverse()`ï¼è¿åç¸åçå符åºå
* `public String toString()`ï¼éè¿ toString() å°±å¯ä»¥å®ç°æ StringBuilder 转æ¢ä¸º String
åå¨åçï¼
```java
String str = "abc";
char data[] = {'a', 'b', 'c'};
StringBuffer sb1 = new StringBuffer();//new byte[16]
sb1.append('a'); //value[0] = 'a';
```
append æºç ï¼æ©å®¹ä¸ºäºå
```java
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;
}
private void ensureCapacityInternal(int minimumCapacity) {
// å建è¶
è¿æ°ç»é¿åº¦å°±æ°çcharæ°ç»ï¼ææ°æ®æ·è´è¿å»
if (minimumCapacity - value.length > 0) {
//int newCapacity = (value.length << 1) + 2;æ¯æ¬¡æ©å®¹2å+2
value = Arrays.copyOf(value, newCapacity(minimumCapacity));
}
}
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
// å°å符串ä¸çå符å¤å¶å°ç®æ å符æ°ç»ä¸
// å符串è°ç¨è¯¥æ¹æ³ï¼æ¤æ¶valueæ¯å符串çå¼ï¼dstæ¯ç®æ å符æ°ç»
System.arraycopy(value, srcBegin, dst, dstBegin, srcEnd - srcBegin);
}
```
****
### Arrays
Array çå·¥å
·ç±» Arrays
常ç¨APIï¼
* `public static String toString(int[] a)`ï¼è¿åæå®æ°ç»çå
容çå符串表示形å¼
* `public static void sort(int[] a)`ï¼æç
§æ°åé¡ºåºæåæå®çæ°ç»
* `public static int binarySearch(int[] a, int key)`ï¼å©ç¨äºåæ¥æ¾è¿åæå®å
ç´ çç´¢å¼
* `public static List asList(T... a)`ï¼è¿åç±æå®æ°ç»æ¯æçå表
```java
public class MyArraysDemo {
public static void main(String[] args) {
//æç
§æ°åé¡ºåºæåæå®çæ°ç»
int [] arr = {3,2,4,6,7};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
int [] arr = {1,2,3,4,5,6,7,8,9,10};
int index = Arrays.binarySearch(arr, 0);
System.out.println(index);
//1,æ°ç»å¿
é¡»æåº
//2.å¦æè¦æ¥æ¾çå
ç´ åå¨,é£ä¹è¿åçæ¯è¿ä¸ªå
ç´ å®é
çç´¢å¼
//3.å¦æè¦æ¥æ¾çå
ç´ ä¸åå¨,é£ä¹è¿åçæ¯ (-æå
¥ç¹-1)
//æå
¥ç¹:妿è¿ä¸ªå
ç´ å¨æ°ç»ä¸,ä»åºè¯¥å¨åªä¸ªç´¢å¼ä¸.
}
}
```
***
### Random
ç¨äºçæä¼ªéæºæ°ã
ä½¿ç¨æ¥éª¤ï¼
1. 导å
¥å
ï¼`import java.util.Random`
2. å建对象ï¼`Random r = new Random()`
3. éæºæ´æ°ï¼`int num = r.nextInt(10)`
* è§£éï¼10 ä»£è¡¨çæ¯ä¸ä¸ªèå´ï¼å¦ææ¬å·å 10ï¼äº§ççéæºæ°å°±æ¯ 0 - 9ï¼æ¬å·å 20 çéæºæ°åæ¯ 0 - 19
* è·å 0 - 10ï¼`int num = r.nextInt(10 + 1)`
4. éæºå°æ°ï¼`public double nextDouble()` ä»èå´ `0.0d` è³ `1.0d` ï¼å·¦éå³å¼ï¼ï¼ä¼ªéæºå°çæå¹¶è¿å
***
### System
System 代表å½åç³»ç»
éææ¹æ³ï¼
* `public static void exit(int status)`ï¼ç»æ¢ JVM èææºï¼**é 0 æ¯å¼å¸¸ç»æ¢**
* `public static long currentTimeMillis()`ï¼è·åå½åç³»ç»æ¤å»æ¶é´æ¯«ç§å¼
* `static void arraycopy(Object var0, int var1, Object var2, int var3, int var4)`ï¼æ°ç»æ·è´
* åæ°ä¸ï¼åæ°ç»
* åæ°äºï¼ä»åæ°ç»çåªä¸ªä½ç½®å¼å§èµå¼
* åæ°ä¸ï¼ç®æ æ°ç»
* åæ°åï¼ä»ç®æ æ°ç»çåªä¸ªä½ç½®å¼å§èµå¼
* åæ°äºï¼èµå¼å 个
```java
public class SystemDemo {
public static void main(String[] args) {
//System.exit(0); // 0代表æ£å¸¸ç»æ¢!!
long startTime = System.currentTimeMillis();//å®ä¹sdf æç
§æ ¼å¼è¾åº
for(int i = 0; i < 10000; i++){è¾åºi}
long endTime = new Date().getTime();
System.out.println( (endTime - startTime)/1000.0 +"s");//ç¨åºç¨æ¶
int[] arr1 = new int[]{10 ,20 ,30 ,40 ,50 ,60 ,70};
int[] arr2 = new int[6]; // [ 0 , 0 , 0 , 0 , 0 , 0]
// åæarrs2 = [0 , 30 , 40 , 50 , 0 , 0 ]
System.arraycopy(arr1, 2, arr2, 1, 3);
}
}
```
***
### Date
æé å¨ï¼
* `public Date()`ï¼å建å½åç³»ç»çæ¤å»æ¥ææ¶é´å¯¹è±¡ã
* `public Date(long time)`ï¼ææ¶é´æ¯«ç§å¼è½¬æ¢ææ¥æå¯¹è±¡
æ¹æ³ï¼
* `public long getTime()`ï¼è¿åèª 1970 å¹´ 1 æ 1 æ¥ 00:00:00 GMT ä»¥æ¥æ»çæ¯«ç§æ°ã
æ¶é´è®°å½çä¸¤ç§æ¹å¼ï¼
1. Date æ¥æå¯¹è±¡
2. æ¶é´æ¯«ç§å¼ï¼ä» `1970-01-01 00:00:00` å¼å§èµ°å°æ¤å»çæ»ç毫ç§å¼ï¼1s = 1000ms
```java
public class DateDemo {
public static void main(String[] args) {
Date d = new Date();
System.out.println(d);//Fri Oct 16 21:58:44 CST 2020
long time = d.getTime() + 121*1000;//è¿121sæ¯ä»ä¹æ¶é´
System.out.println(time);//1602856875485
Date d1 = new Date(time);
System.out.println(d1);//Fri Oct 16 22:01:15 CST 2020
}
}
```
```java
public static void main(String[] args){
Date d = new Date();
long startTime = d.getTime();
for(int i = 0; i < 10000; i++){è¾åºi}
long endTime = new Date().getTime();
System.out.println( (endTime - startTime) / 1000.0 +"s");
//è¿è¡ä¸ä¸æ¬¡è¾åºéè¦å¤é¿æ¶é´
}
```
***
### DateFormat
DateFormat ä½ç¨ï¼
1. å¯ä»¥æâæ¥æå¯¹è±¡âæè
âæ¶é´æ¯«ç§å¼âæ ¼å¼åææä»¬åæ¬¢çæ¶é´å½¢å¼ï¼æ ¼å¼åæ¶é´ï¼
2. å¯ä»¥æåç¬¦ä¸²çæ¶é´å½¢å¼è§£æææ¥æå¯¹è±¡ï¼è§£æå符串æ¶é´ï¼
DateFormat æ¯ä¸ä¸ªæ½è±¡ç±»ï¼ä¸è½ç´æ¥ä½¿ç¨ï¼ä½¿ç¨å®çåç±»ï¼SimpleDateFormat
SimpleDateFormat ç®åæ¥ææ ¼å¼åç±»ï¼
* `public SimpleDateFormat(String pattern)`ï¼æå®æ¶é´çæ ¼å¼å建ç®åæ¥æå¯¹è±¡
* `public String format(Date date) `ï¼ææ¥æå¯¹è±¡æ ¼å¼åææä»¬åæ¬¢çæ¶é´å½¢å¼ï¼è¿åå符串
* `public String format(Object time)`ï¼ææ¶é´æ¯«ç§å¼æ ¼å¼åæè®¾å®çæ¶é´å½¢å¼ï¼è¿åå符串!
* `public Date parse(String date)`ï¼æåç¬¦ä¸²çæ¶é´è§£æææ¥æå¯¹è±¡
>yyyyå¹´MMæddæ¥ HH:mm:ss EEE a" å¨å ä¸åä¸å
```java
public static void main(String[] args){
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss);
String time = sdf.format(date);
System.out.println(time);//2020-10-18 19:58:34
//è¿121s忝ä»ä¹æ¶é´
long time = date.getTime();
time+=121;
System.out.println(sdf.formate(time));
String d = "2020-10-18 20:20:20";//æ ¼å¼ä¸è´
Date newDate = sdf.parse(d);
System.out.println(sdf.format(newDate)); //æç
§åé¢çæ¹æ³è¾åº
}
```
****
### Calendar
Calendar 代表äºç³»ç»æ¤å»æ¥æå¯¹åºçæ¥åå¯¹è±¡ï¼æ¯ä¸ä¸ªæ½è±¡ç±»ï¼ä¸è½ç´æ¥å建对象
Calendar æ¥åç±»å建æ¥å对象ï¼`Calendar rightNow = Calendar.getInstance()`ï¼**饿æ±å便¨¡å¼**ï¼
Calendar çæ¹æ³ï¼
* `public static Calendar getInstance()`ï¼è¿åä¸ä¸ªæ¥åç±»ç对象
* `public int get(int field)`ï¼åæ¥æä¸çæä¸ªå段信æ¯
* `public void set(int field,int value)`ï¼ä¿®æ¹æ¥åçæä¸ªå段信æ¯
* `public void add(int field,int amount)`ï¼ä¸ºæä¸ªå段å¢å /åå°æå®çå¼
* `public final Date getTime()`ï¼æ¿å°æ¤å»æ¥æå¯¹è±¡
* `public long getTimeInMillis()`ï¼æ¿å°æ¤å»æ¶é´æ¯«ç§å¼
```java
public static void main(String[] args){
Calendar rightNow = Calendar.getInsance();
int year = rightNow.get(Calendar.YEAR);//è·åå¹´
int month = rightNow.get(Calendar.MONTH) + 1;//æè¦+1
int days = rightNow.get(Calendar.DAY_OF_YEAR);
rightNow.set(Calendar.YEAR , 2099);//ä¿®æ¹æä¸ªåæ®µ
rightNow.add(Calendar.HOUR , 15);//å 15å°æ¶ -15å°±æ¯åå»15å°æ¶
Date date = rightNow.getTime();//æ¥å对象
long time = rightNow.getTimeInMillis();//æ¶é´æ¯«ç§å¼
//700天忝ä»ä¹æ¥å
rightNow.add(Calendar.DAY_OF_YEAR , 701);
Date date d = rightNow.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.format(d));//è¾åº700天åçæ¥æ
}
```
***
### LocalDateTime
JDK1.8 æ°å¢ï¼çº¿ç¨å®å
¨
+ LocalDate è¡¨ç¤ºæ¥æï¼å¹´ææ¥ï¼
+ LocalTime 表示æ¶é´ï¼æ¶åç§ï¼
+ LocalDateTime 表示æ¶é´+ æ¥æ ï¼å¹´ææ¥æ¶åç§ï¼
æé æ¹æ³ï¼
* public static LocalDateTime now()ï¼è·åå½åç³»ç»æ¶é´
* public static LocalDateTime of(å¹´, æ , æ¥, æ¶, å, ç§)ï¼ä½¿ç¨æå®å¹´ææ¥åæ¶åç§åå§åä¸ä¸ªå¯¹è±¡
常ç¨APIï¼
| æ¹æ³å | 说æ |
| --------------------------------------------------------- | ------------------------------------------------------------ |
| public int getYear() | è·åå¹´ |
| public int getMonthValue() | è·åæä»½ï¼1-12ï¼ |
| public int getDayOfMonth() | è·åæä»½ä¸ç第å 天ï¼1-31ï¼ |
| public int getDayOfYear() | è·åä¸å¹´ä¸ç第å 天ï¼1-366ï¼ |
| public DayOfWeek getDayOfWeek() | è·åææ |
| public int getMinute() | è·ååé |
| public int getHour() | è·åå°æ¶ |
| public LocalDate toLocalDate() | è½¬æ¢æä¸ºä¸ä¸ª LocalDate 对象ï¼å¹´ææ¥ï¼ |
| public LocalTime toLocalTime() | è½¬æ¢æä¸ºä¸ä¸ª LocalTime å¯¹è±¡ï¼æ¶åç§ï¼ |
| public String format(æå®æ ¼å¼) | æä¸ä¸ª LocalDateTime æ ¼å¼åæä¸ºä¸ä¸ªå符串 |
| public LocalDateTime parse(åå¤è§£æçå符串, è§£ææ ¼å¼) | æä¸ä¸ªæ¥æå符串解ææä¸ºä¸ä¸ª LocalDateTime 对象 |
| public static DateTimeFormatter ofPattern(String pattern) | ä½¿ç¨æå®çæ¥ææ¨¡æ¿è·åä¸ä¸ªæ¥ææ ¼å¼åå¨ DateTimeFormatter 对象 |
```java
public class JDK8DateDemo2 {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
LocalDateTime localDateTime = LocalDateTime.of(2020, 11, 11, 11, 11, 11);
System.out.println(localDateTime);
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyyå¹´MMæddæ¥ HH:mm:ss");
String s = localDateTime.format(pattern);
LocalDateTime parse = LocalDateTime.parse(s, pattern);
}
}
```
| æ¹æ³å | 说æ |
| ------------------------------------------- | -------------- |
| public LocalDateTime plusYears (long years) | æ·»å æè
åå»å¹´ |
| public LocalDateTime withYear(int year) | ç´æ¥ä¿®æ¹å¹´ |
**æ¶é´é´é** Duration ç±»APIï¼
| æ¹æ³å | 说æ |
| ------------------------------------------------ | -------------------- |
| public static Period between(å¼å§æ¶é´,ç»ææ¶é´) | 计ç®ä¸¤ä¸ªâæ¶é´"çé´é |
| public int getYears() | è·å¾è¿æ®µæ¶é´çå¹´æ° |
| public int getMonths() | è·å¾æ¤æé´çæ»ææ° |
| public int getDays() | è·å¾æ¤æé´çå¤©æ° |
| public long toTotalMonths() | è·åæ¤æé´çæ»ææ° |
| public static Durationbetween(å¼å§æ¶é´,ç»ææ¶é´) | 计ç®ä¸¤ä¸ªâæ¶é´"çé´é |
| public long toSeconds() | è·å¾æ¤æ¶é´é´éçç§ |
| public long toMillis() | è·å¾æ¤æ¶é´é´éçæ¯«ç§ |
| public long toNanos() | è·å¾æ¤æ¶é´é´éççº³ç§ |
```java
public class JDK8DateDemo9 {
public static void main(String[] args) {
LocalDate localDate1 = LocalDate.of(2020, 1, 1);
LocalDate localDate2 = LocalDate.of(2048, 12, 12);
Period period = Period.between(localDate1, localDate2);
System.out.println(period);//P28Y11M11D
Duration duration = Duration.between(localDateTime1, localDateTime2);
System.out.println(duration);//PT21H57M58S
}
}
```
***
### Math
Math ç¨äºåæ°å¦è¿ç®
Math ç±»ä¸çæ¹æ³å
¨é¨æ¯éææ¹æ³ï¼ç´æ¥ç¨ç±»åè°ç¨å³å¯ï¼
| æ¹æ³ | 说æ |
| -------------------------------------------- | --------------------------------- |
| public static int abs(int a) | è·ååæ°açç»å¯¹å¼ |
| public static double ceil(double a) | åä¸åæ´ |
| public static double floor(double a) | åä¸åæ´ |
| public static double pow(double a, double b) | è·å a ç b æ¬¡å¹ |
| public static long round(double a) | åèäºå
¥åæ´ |
| public static int max(int a,int b) | è¿åè¾å¤§å¼ |
| public static int min(int a,int b) | è¿åè¾å°å¼ |
| public static double random() | è¿åå¼ä¸º double çæ£å¼ï¼[0.0,1.0) |
```java
public class MathDemo {
public static void main(String[] args) {
// 1.åç»å¯¹å¼:è¿åæ£æ°ã
System.out.println(Math.abs(10));
System.out.println(Math.abs(-10.3));
// 2.åä¸åæ´: 5
System.out.println(Math.ceil(4.00000001)); // 5.0
System.out.println(Math.ceil(-4.00000001));//4.0
// 3.åä¸åæ´ï¼4
System.out.println(Math.floor(4.99999999)); // 4.0
System.out.println(Math.floor(-4.99999999)); // 5.0
// 4.æ±ææ°æ¬¡æ¹
System.out.println(Math.pow(2 , 3)); // 2^3 = 8.0
// 5.åèäºå
¥ 10
System.out.println(Math.round(4.49999)); // 4
System.out.println(Math.round(4.500001)); // 5
System.out.println(Math.round(5.5));//6
}
}
```
****
### DecimalFormat
使任ä½å½¢å¼çæ°åè§£æåæ ¼å¼å
```java
public static void main(String[]args){
double pi = 3.1415927;ã//åå¨ç
//åä¸ä½æ´æ°
System.out.println(new DecimalFormat("0").format(pi));ããã//3
//åä¸ä½æ´æ°å两ä½å°æ°
System.out.println(new DecimalFormat("0.00").format(pi));ã//3.14
//å䏤使´æ°åä¸ä½å°æ°ï¼æ´æ°ä¸è¶³é¨å以0å¡«è¡¥ã
System.out.println(new DecimalFormat("00.000").format(pi));// 03.142
//åæææ´æ°é¨å
System.out.println(new DecimalFormat("#").format(pi));ããã//3
//以ç¾åæ¯æ¹å¼è®¡æ°ï¼å¹¶å两ä½å°æ°
System.out.println(new DecimalFormat("#.##%").format(pi));ã//314.16%
long c =299792458;ãã//å
é
//æ¾ç¤ºä¸ºç§å¦è®¡æ°æ³ï¼å¹¶åäºä½å°æ°
System.out.println(new DecimalFormat("#.#####E0").format(c));//2.99792E8
//æ¾ç¤ºä¸ºä¸¤ä½æ´æ°çç§å¦è®¡æ°æ³ï¼å¹¶ååä½å°æ°
System.out.println(new DecimalFormat("00.####E0").format(c));//29.9792E7
//æ¯ä¸ä½ä»¥éå·è¿è¡åéã
System.out.println(new DecimalFormat(",###").format(c));//299,792,458
//å°æ ¼å¼åµå
¥ææ¬
System.out.println(new DecimalFormat("å
é大å°ä¸ºæ¯ç§,###ç±³ã").format(c));
}
```
***
### BigDecimal
Java å¨ java.math å
䏿ä¾ç API ç±»ï¼ç¨æ¥å¯¹è¶
è¿16使æä½çæ°è¿è¡ç²¾ç¡®çè¿ç®
æé æ¹æ³ï¼
* `public static BigDecimal valueOf(double val)`ï¼å
è£
æµ®ç¹æ°æä¸ºå¤§æ°æ®å¯¹è±¡ã
* `public BigDecimal(double val)`
* `public BigDecimal(String val)`
常ç¨APIï¼
* `public BigDecimal add(BigDecimal value)`ï¼å æ³è¿ç®
* `public BigDecimal subtract(BigDecimal value)`ï¼åæ³è¿ç®
* `public BigDecimal multiply(BigDecimal value)`ï¼ä¹æ³è¿ç®
* `public BigDecimal divide(BigDecimal value)`ï¼é¤æ³è¿ç®
* `public double doubleValue()`ï¼æ BigDecimal è½¬æ¢æ double ç±»å
* `public int intValue()`ï¼è½¬ä¸º int å
¶ä»ç±»åç¸å
* `public BigDecimal divide (BigDecimal valueï¼ç²¾ç¡®å ä½ï¼èå
¥æ¨¡å¼)`ï¼é¤æ³
```java
public class BigDecimalDemo {
public static void main(String[] args) {
// æµ®ç¹åè¿ç®çæ¶åç´æ¥+ - * / å¯è½ä¼åºç°æ°æ®å¤±çï¼ç²¾åº¦é®é¢ï¼ã
System.out.println(0.1 + 0.2);
System.out.println(1.301 / 100);
double a = 0.1 ;
double b = 0.2 ;
double c = a + b ;
System.out.println(c);//0.30000000000000004
// 1.ææµ®ç¹æ°è½¬æ¢æå¤§æ°æ®å¯¹è±¡è¿ç®
BigDecimal a1 = BigDecimal.valueOf(a);
BigDecimal b1 = BigDecimal.valueOf(b);
BigDecimal c1 = a1.add(b1);//a1.divide(b1);ä¹å¯ä»¥
System.out.println(c1);
// BigDecimalåªæ¯è§£å³ç²¾åº¦é®é¢çææ®µï¼doubleæ°æ®ææ¯æä»¬çç®çï¼ï¼
double d = c1.doubleValue();
}
}
```
æ»ç»ï¼
1. BigDecimal æ¯ç¨æ¥è¿è¡ç²¾ç¡®è®¡ç®ç
2. å建 BigDecimal çå¯¹è±¡ï¼æé æ¹æ³ä½¿ç¨åæ°ç±»å为å符串ç
3. ååè¿ç®ä¸ç餿³ï¼å¦æé¤ä¸å°½è¯·ä½¿ç¨ divide çä¸ä¸ªåæ°çæ¹æ³
```java
BigDecimal divide = bd1.divide(åä¸è¿ç®ç对象,å°æ°ç¹å精确å°å¤å°ä½,èå
¥æ¨¡å¼);
//åæ°1ï¼è¡¨ç¤ºåä¸è¿ç®çBigDecimal 对象ã
//åæ°2ï¼è¡¨ç¤ºå°æ°ç¹åé¢ç²¾ç¡®å°å¤å°ä½
//åæ°3ï¼èå
¥æ¨¡å¼
// BigDecimal.ROUND_UP è¿ä¸æ³
// BigDecimal.ROUND_FLOOR å»å°¾æ³
// BigDecimal.ROUND_HALF_UP åèäºå
¥
```
***
### Regex
#### æ¦è¿°
æ£å表达å¼çä½ç¨ï¼æ¯ä¸äºç¹æ®åç¬¦ç»æçæ ¡éªè§åï¼å¯ä»¥æ ¡éªä¿¡æ¯çæ£ç¡®æ§ï¼æ ¡éªé®ç®±ãçµè¯å·ç ãéé¢çã
æ¯å¦æ£éª qq å·ï¼
```java
public static boolean checkQQRegex(String qq){
return qq!=null && qq.matches("\\d{4,}");//峿¯æ°å å¿
须大äº4使°
}// ç¨\\d æ¯å 为\ç¨æ¥åè¯å®æ¯ä¸ä¸ªæ ¡éªç±»ï¼ä¸æ¯æ®éçå符 æ¯å¦ \t \n
```
java.util.regex å
主è¦å
æ¬ä»¥ä¸ä¸ä¸ªç±»ï¼
- Pattern ç±»ï¼
Pattern 对象æ¯ä¸ä¸ªæ£å表达å¼çç¼è¯è¡¨ç¤ºãPattern 类没æå
Œ
±æé æ¹æ³ï¼è¦å建ä¸ä¸ª Pattern 对象ï¼å¿
é¡»é¦å
è°ç¨å
¶å
Œ
±éæç¼è¯æ¹æ³ï¼è¿åä¸ä¸ª Pattern 对象ãè¯¥æ¹æ³æ¥åä¸ä¸ªæ£å表达å¼ä½ä¸ºå®ç第ä¸ä¸ªåæ°
- Matcher ç±»ï¼
Matcher 对象æ¯å¯¹è¾å
¥å符串è¿è¡è§£éåå¹é
æä½ç弿ãä¸Pattern ç±»ä¸æ ·ï¼Matcher 乿²¡æå
Œ
±æé æ¹æ³ï¼éè¦è°ç¨ Pattern 对象ç matcher æ¹æ³æ¥è·å¾ä¸ä¸ª Matcher 对象
- PatternSyntaxExceptionï¼
PatternSyntaxException æ¯ä¸ä¸ªé强å¶å¼å¸¸ç±»ï¼å®è¡¨ç¤ºä¸ä¸ªæ£åè¡¨è¾¾å¼æ¨¡å¼ä¸çè¯æ³é误ã
***
#### å符å¹é
##### æ®éå符
åæ¯ãæ°åãæ±åãä¸å线ã以忲¡æç¹æ®å®ä¹çæ ç¹ç¬¦å·ï¼é½æ¯âæ®éå符âã表达å¼ä¸çæ®éå符ï¼å¨å¹é
ä¸ä¸ªåç¬¦ä¸²çæ¶åï¼å¹é
ä¸ä¹ç¸åçä¸ä¸ªå符ãå
¶ä»ç»ç§°**å
å符**
***
##### ç¹æ®å符
\r\n æ¯ Windows ä¸çææ¬è¡ç»ææ ç¾ï¼å¨ Unix/Linux 忝 \n
| å
å符 | 说æ |
| ------ | ------------------------------------------------------------ |
| \ | å°ä¸ä¸ä¸ªå符æ 记为ä¸ä¸ªç¹æ®å符æåä¹å符ï¼åè¯å®æ¯ä¸ä¸ªæ ¡éªç±»ï¼ä¸æ¯æ®éå符 |
| \f | æ¢é¡µç¬¦ |
| \n | æ¢è¡ç¬¦ |
| \r | å车符 |
| \t | å¶è¡¨ç¬¦ |
| \\ | 代表 \ æ¬èº« |
| () | ä½¿ç¨ () å®ä¹ä¸ä¸ªå表达å¼ãå表达å¼çå
容å¯ä»¥å½æä¸ä¸ªç¬ç«å
ç´ |
***
##### æ åå符
è½å¤ä¸å¤ç§å符å¹é
ç表达å¼ï¼æ³¨æåºå大å°åï¼å¤§åæ¯ç¸åçææï¼åªè½æ ¡éª**å**个å符ã
| å
å符 | 说æ |
| ------ | ------------------------------------------------------------ |
| . | å¹é
ä»»æä¸ä¸ªå符ï¼é¤äºæ¢è¡ç¬¦ï¼ï¼å¦æè¦å¹é
å
æ¬ \n å¨å
çææå符ï¼ä¸è¬ç¨ [\s\S] |
| \d | æ°åå符ï¼0~9 ä¸çä»»æä¸ä¸ªï¼çä»·äº [0-9] |
| \D | éæ°åå符ï¼çä»·äº [ ^0-9] |
| \w | 大å°ååæ¯ææ°åæä¸å线ï¼çä»·äº[a-zA-Z_0-9_] |
| \W | 对\wåéï¼çä»·äº[ ^\w] |
| \s | ç©ºæ ¼ãå¶è¡¨ç¬¦ãæ¢è¡ç¬¦ç空ç½å符çå
¶ä¸ä»»æä¸ä¸ªï¼çä»·äº[\f\n\r\t\v] |
| \S | 对 \s åé |
\x å¹é
åå
è¿å¶å符ï¼\0 å¹é
å
«è¿å¶ï¼ä¾å¦ \xA 对åºå¼ä¸º 10 ç ASCII å符 ï¼å³ \n
***
##### èªå®ä¹ç¬¦
èªå®ä¹ç¬¦å·éåï¼[ ] æ¹æ¬å·å¹é
æ¹å¼ï¼è½å¤å¹é
æ¹æ¬å·ä¸**ä»»æä¸ä¸ª**å符
| å
å符 | 说æ |
| ------------ | ----------------------------------------- |
| [ab5@] | å¹é
"a" æ "b" æ "5" æ "@" |
| [^abc] | å¹é
"a","b","c" ä¹å¤çä»»æä¸ä¸ªå符 |
| [f-k] | å¹é
"f"~"k" ä¹é´çä»»æä¸ä¸ªåæ¯ |
| [^A-F0-3] | å¹é
"A","F","0"~"3" ä¹å¤çä»»æä¸ä¸ªå符 |
| [a-d[m-p]] | å¹é
a å° d æè
m å° pï¼[a-dm-p]ï¼å¹¶éï¼ |
| [a-z&&[m-p]] | å¹é
a å° z å¹¶ä¸ m å° pï¼[a-dm-p]ï¼äº¤éï¼ |
| [^] | åå |
* æ£å表达å¼çç¹æ®ç¬¦å·ï¼è¢«å
å«å°ä¸æ¬å·ä¸ï¼å失å»ç¹æ®æä¹ï¼é¤äº ^,- ä¹å¤ï¼éè¦å¨åé¢å \
* æ åå符éåï¼é¤å°æ°ç¹å¤ï¼å¦æè¢«å
å«äºä¸æ¬å·ï¼èªå®ä¹å符éåå°å
å«è¯¥éåã
æ¯å¦ï¼[\d. \ -+] å°å¹é
ï¼æ°åãå°æ°ç¹ã+ã-
***
##### éè¯å符
修饰å¹é
次æ°çç¹æ®ç¬¦å·ã
* å¹é
次æ°ä¸ç贪婪模å¼(å¹é
å符è¶å¤è¶å¥½ï¼é»è®¤ ï¼)ï¼\* å + 齿¯è´ªå©ªåå
å符ã
* å¹é
次æ°ä¸çé贪婪模å¼ï¼å¹é
å符è¶å°è¶å¥½ï¼ä¿®é¥°å¹é
次æ°çç¹æ®ç¬¦å·ååå ä¸ä¸ä¸ª ? å·ï¼
| å
å符 | 说æ |
| ------ | --------------------------------- |
| X? | X 䏿¬¡æä¸æ¬¡ä¹æ²¡ï¼æç¸å½äº {0,1} |
| X* | X ä¸åºç°æåºç°ä»»ææ¬¡ï¼ç¸å½äº {0,} |
| X+ | X è³å°ä¸æ¬¡ï¼ç¸å½äº {1,} |
| X{n} | X æ°å¥½ n 次 |
| {n,} | X è³å° n 次 |
| {n,m} | X è³å° n 次ï¼ä½æ¯ä¸è¶
è¿ m 次 |
***
#### ä½ç½®å¹é
##### å符边ç
æ¬ç»æ è®°å¹é
ç䏿¯åç¬¦èæ¯ä½ç½®ï¼ç¬¦åæç§æ¡ä»¶çä½ç½®
| å
å符 | 说æ |
| ------ | ------------------------------------------------------------ |
| ^ | ä¸å符串å¼å§çå°æ¹å¹é
ï¼å¨å符éåä¸ç¨æ¥æ±éï¼å¨å符éåå¤ç¨ä½å¹é
å符串çå¼å¤´ï¼ |
| $ | ä¸åç¬¦ä¸²ç»æçå°æ¹å¹é
|
| \b | å¹é
ä¸ä¸ªåè¯è¾¹ç |
***
##### æè·ç»
æè·ç»æ¯æå¤ä¸ªå符å½ä¸ä¸ªåç¬åå
è¿è¡å¤ççæ¹æ³ï¼å®éè¿å¯¹æ¬å·å
çå符åç»æ¥å建ã
å¨è¡¨è¾¾å¼ `((A)(B(C)))`ï¼æåä¸ªè¿æ ·çç»ï¼((A)(B(C)))ã(A)ã(B(C))ã(C)ï¼æç
§æ¬å·ä»å·¦å°å³ä¾æ¬¡ä¸º group(1)...ï¼
* è°ç¨ matcher 对象ç groupCount æ¹æ³è¿åä¸ä¸ª int å¼ï¼è¡¨ç¤º matcher 对象å½åæå¤ä¸ªæè·ç»ã
* ç¹æ®çç» group(0)ãgroup()ï¼ä»£è¡¨æ´ä¸ªè¡¨è¾¾å¼ï¼è¯¥ç»ä¸å
æ¬å¨ groupCount çè¿åå¼ä¸ã
| è¡¨è¾¾å¼ | 说æ |
| ------------------------- | ------------------------------------------------------------ |
| \| (åæ¯ç»æ) | å·¦å³ä¸¤è¾¹è¡¨è¾¾å¼ä¹é´ "æ" å
³ç³»ï¼å¹é
左边æè
å³è¾¹ |
| () (æè·ç») | (1) å¨è¢«ä¿®é¥°å¹é
次æ°çæ¶åï¼æ¬å·ä¸ç表达å¼å¯ä»¥ä½ä¸ºæ´ä½è¢«ä¿®é¥°
(2) åå¹é
ç»æçæ¶åï¼æ¬å·ä¸ç表达å¼å¹é
å°çå
容å¯ä»¥è¢«åç¬å¾å°
(3) æ¯ä¸å¯¹æ¬å·åé
ä¸ä¸ªç¼å·,()çæè·æ ¹æ®å·¦æ¬å·ç顺åºä» 1 å¼å§èªå¨ç¼å·ãæè·å
ç´ ç¼å·ä¸ºé¶ç第ä¸ä¸ªæè·æ¯ç±æ´ä¸ªæ£åè¡¨è¾¾å¼æ¨¡å¼å¹é
çææ¬ |
| (?:Expression) éæè·ç» | ä¸äºè¡¨è¾¾å¼ä¸ï¼ä¸å¾ä¸ä½¿ç¨( )ï¼ä½åä¸éè¦ä¿å () ä¸å表达å¼å¹é
çå
容ï¼è¿æ¶å¯ä»¥ç¨éæè·ç»æ¥æµæ¶ä½¿ç¨( )带æ¥çå¯ä½ç¨ã |
***
##### ååå¼ç¨
ååå¼ç¨ï¼\numberï¼ï¼åå«å溯å¼ç¨ï¼
* æ¯ä¸å¯¹()ä¼åé
ä¸ä¸ªç¼å·ï¼ä½¿ç¨ () çæè·æ ¹æ®å·¦æ¬å·ç顺åºä»1å¼å§èªå¨ç¼å·
* éè¿ååå¼ç¨ï¼å¯ä»¥å¯¹åç»å·²æè·çå符串è¿è¡å¼ç¨ï¼ç»§ç»å¹é
* **æå¹é
å°çå符éå¤ä¸éå¨è¿è¡å¹é
**
* åºç¨ 1ï¼
```java
String regex = "((\d)3)\1[0-9](\w)\2{2}";
```
* é¦å
å¹é
((\d)3)ï¼å
¶æ¬¡ \1 å¹é
((\d)3) å·²ç»å¹é
å°çå
容ï¼\2 å¹é
(\d)ï¼ {2} æçæ¯ \2 çå¼åºç°ä¸¤æ¬¡
* å®ä¾ï¼23238n22ï¼å¹é
å° 2 æªæ¥å°±ç»§ç»å¹é
2ï¼
* å®ä¾ï¼43438n44
* åºç¨ 2ï¼ç¬è«
```java
String regex = "<(h[1-6])>\w*?<\/\1>";
```
å¹é
ç»æ
```java
x
//å¹é
x
//å¹é
x//ä¸å¹é
```
***
##### é¶å®½æè¨
é¢æç´¢ï¼é¶å®½æè¨ï¼ï¼ç¯è§ï¼
* åªè¿è¡å表达å¼çå¹é
ï¼å¹é
å
容ä¸è®¡å
¥æç»çå¹é
ç»æï¼æ¯é¶å®½åº¦
* 夿å½åä½ç½®çåååç¬¦ï¼æ¯å¦ç¬¦åæå®çæ¡ä»¶ï¼ä½ä¸å¹é
ååçå符ï¼**æ¯å¯¹ä½ç½®çå¹é
**
* æ£å表达å¼å¹é
è¿ç¨ä¸ï¼å¦æå表达å¼å¹é
å°çæ¯å符å
容ï¼èéä½ç½®ï¼å¹¶è¢«ä¿åå°æç»çå¹é
ç»æä¸ï¼é£ä¹å°±è®¤ä¸ºè¿ä¸ªåè¡¨è¾¾å¼æ¯å æå符çï¼å¦æå表达å¼å¹é
çä»
ä»
æ¯ä½ç½®ï¼æè
å¹é
çå
容并ä¸ä¿åå°æç»çå¹é
ç»æä¸ï¼é£ä¹å°±è®¤ä¸ºè¿ä¸ªåè¡¨è¾¾å¼æ¯**é¶å®½åº¦**çãå æåç¬¦è¿æ¯é¶å®½åº¦ï¼æ¯é对å¹é
çå
容æ¯å¦ä¿åå°æç»çå¹é
ç»æä¸èè¨ç
| è¡¨è¾¾å¼ | 说æ |
| -------- | --------------------------------------- |
| (?=exp) | æè¨èªèº«åºç°çä½ç½®çåé¢è½å¹é
表达å¼exp |
| (?<=exp) | æè¨èªèº«åºç°çä½ç½®çåé¢è½å¹é
表达å¼exp |
| (?!exp) | æè¨æ¤ä½ç½®çåé¢ä¸è½å¹é
表达å¼exp |
| (?<!exp) | æè¨æ¤ä½ç½®çåé¢ä¸è½å¹é
表达å¼exp |
***
#### å¹é
模å¼
æ£å表达å¼çå¹é
模å¼ï¼
* IGNORECASE 忽ç¥å¤§å°å模å¼
* å¹é
æ¶å¿½ç¥å¤§å°åã
* é»è®¤æ
åµä¸ï¼æ£åè¡¨è¾¾å¼æ¯è¦åºå大å°åçã
* SINGLELINE åè¡æ¨¡å¼
* æ´ä¸ªææ¬çä½ä¸ä¸ªå符串ï¼åªæä¸ä¸ªå¼å¤´ï¼ä¸ä¸ªç»å°¾ã
* ä½¿å°æ°ç¹ "." å¯ä»¥å¹é
å
嫿¢è¡ç¬¦ï¼\nï¼å¨å
çä»»æå符ã
* MULTILINE å¤è¡æ¨¡å¼
* æ¯è¡é½æ¯ä¸ä¸ªå符串ï¼é½æå¼å¤´åç»å°¾ã
* 卿å®äº MULTILINE ä¹åï¼å¦æéè¦ä»
å¹é
å符串å¼å§åç»æä½ç½®ï¼å¯ä»¥ä½¿ç¨ \A å \Z
***
#### åç»å¹é
Pattern ç±»ï¼
* `static Pattern compile(String regex)`ï¼å°ç»å®çæ£å表达å¼ç¼è¯ä¸ºæ¨¡å¼
* `Matcher matcher(CharSequence input)`ï¼å建ä¸ä¸ªå¹é
å¨ï¼å¹é
ç»å®çè¾å
¥ä¸æ¤æ¨¡å¼
* `static boolean matches(String regex, CharSequence input)`ï¼ç¼è¯æ£å表达å¼ï¼å¹¶å¹é
è¾å
¥
Matcher ç±»ï¼
* `boolean find()`ï¼æ«æè¾å
¥çåºåï¼æ¥æ¾ä¸è¯¥æ¨¡å¼å¹é
çä¸ä¸ä¸ªååºå
* `String group()`ï¼è¿åä¸ä¸ä¸ä¸ªå¹é
çè¾å
¥ååºåï¼å group(0)ï¼å¹é
æ´ä¸ªè¡¨è¾¾å¼çåå符串
* `String group(int group)`ï¼è¿åå¨ä¸ä¸æ¬¡å¹é
æä½æé´ç±ç»å®ç»æè·çè¾å
¥ååºå
* `int groupCount()`ï¼è¿åæ¤å¹é
卿¨¡å¼ä¸æè·ç»çæ°é
```java
public class Demo01{
public static void main(String[] args) {
//表达å¼å¯¹è±¡
Pattern p = Pattern.compile("\\w+");
//å建Matcher对象
Matcher m = p.matcher("asfsdf2&&3323");
//boolean b = m.matches();//å°è¯å°æ´ä¸ªå符åºåä¸è¯¥æ¨¡å¼å¹é
//System.out.println(b);//false
//boolean b2 = m.find();//è¯¥æ¹æ³æ«æè¾å
¥çåºåï¼æ¥æ¾ä¸è¯¥æ¨¡å¼å¹é
çä¸ä¸ä¸ªååºå
//System.out.println(b2);//true
//System.out.println(m.find());
//System.out.println(m.group());//asfsdf2
//System.out.println(m.find());
//System.out.println(m.group());//3323
while(m.find()){
System.out.println(m.group()); //group(),group(0)å¹é
æ´ä¸ªè¡¨è¾¾å¼çåå符串
System.out.println(m.group(0));
}
}
}
```
```java
public class Demo02 {
public static void main(String[] args) {
//å¨è¿ä¸ªå符串ï¼asfsdf23323ï¼æ¯å¦ç¬¦åæå®çæ£å表达å¼ï¼\w+
//表达å¼å¯¹è±¡
Pattern p = Pattern.compile("(([a-z]+)([0-9]+))");//ä¸éè¦å å¤ä½çæ¬å·
//å建Matcher对象
Matcher m = p.matcher("aa232**ssd445");
while(m.find()){
System.out.println(m.group());//aa232 ssd445
System.out.println(m.group(1));//aa232 ssd445
System.out.println(m.group(2));//aa ssd
System.out.println(m.group(3));//232 445
}
}
}
```
* æ£åè¡¨è¾¾å¼æ¹ä¸º `"(([a-z]+)(?:[0-9]+))"` 没æ group(3) å 为æ¯éæè·ç»
* æ£åè¡¨è¾¾å¼æ¹ä¸º `"([a-z]+)([0-9]+)"` 没æ group(3) aa232 - aa --232
***
#### åºç¨
##### åºæ¬éªè¯
```java
public static void main(String[] args){
System.out.println("a".matches("[abc]"));//true夿aæ¯å¦å¨abc
System.out.println("a".matches("[^abc]"));//false 夿aæ¯å¦å¨abcä¹å¤ç
System.out.println("a".matches("\\d")); //false æ¯å¦aæ¯æ´æ°
System.out.println("a".matches("\\w")); //true æ¯å¦æ¯å符
System.out.println("ä½ ".matches("\\w")); // false
System.out.println("aa".matches("\\w"));//false åªè½æ£éªå个å符
// å¯ç å¿
é¡»æ¯æ°å 忝 ä¸å线 è³å° 6ä½
System.out.println("ssds3c".matches("\\w{6,}")); // true
// éªè¯ãå¿
é¡»æ¯æ°ååå符 å¿
é¡»æ¯4ä½
System.out.println("dsd22".matches("[a-zA-Z0-9]{4}")); // false
System.out.println("A3dy".matches("[a-zA-Z0-9]{4}")); // true
}
```
***
##### éªè¯å·ç
```java
//1å¼å¤´ 第äºä½æ¯2-9çæ°å
public static void checkPhone(String phone){
if(phone.matches("1[3-9]\\d{9}")){
System.out.println("ææºå·ç æ ¼å¼æ£ç¡®ï¼");
} else {.......}
}
//[email protected] [email protected]
public static void checkEmail(String email){
if(email.matches("\\w{1,}@\\w{1,}(\\.\\w{2,5}){1,2}")){
System.out.println("é®ç®±æ ¼å¼æ£ç¡®ï¼");
}// .æ¯ä»»æå符 \\.å°±æ¯ç¹
}
```
***
##### æ¥æ¾æ¿æ¢
* `public String[] split(String regex)`ï¼æç
§æ£å表达å¼å¹é
çå
容è¿è¡åå²å符串ï¼ååä¸ä¸ªå符串æ°ç»
* `public String replaceAll(String regex,String newStr)`ï¼æç
§æ£å表达å¼å¹é
çå
容è¿è¡æ¿æ¢
```java
//æ°ç»åå²
public static void main(String[] args) {
// 1.splitçåºç¡ç¨æ³
String names = "飿¸
æ¬,å¼ æ å¿,å¨è·è¥";
// 以âï¼âå岿å符串æ°ç»
String[] nameArrs = names.split(",");
// 2.splité忣å表达å¼ååå²
String names1 = "飿¸
æ¬lv434fda324å¼ æ å¿87632fad2342423å¨è·è¥";
// 以å¹é
æ£å表达å¼çå
容为åå²ç¹å岿å符串æ°ç»
String[] nameArrs1 = names1.split("\\w+");
// ä½¿ç¨æ£å表达å¼å®ä½åºå
å®¹ï¼æ¿æ¢æ/
System.out.println(names1.replaceAll("\\w+","/"));//飿¸
æ¬/å¼ æ å¿/å¨è·è¥
String names3 = "飿¸
æ¬,å¼ æ å¿,å¨è·è¥";
System.out.println(names3.replaceAll(",","-"));//飿¸
æ¬-å¼ æ å¿-å¨è·è¥
}
```
***
##### æç´¢å·ç
æ¾åºææ 189 å 132 å¼å¤´çææºå·
```java
public class RegexDemo {
public static void main(String[] args) {
String rs = "189asjk65as1891898777745gkkkk189745612318936457894";
String regex = "(?=((189|132)\\d{8}))";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(rs);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
}
}
```
***
## éå
### éåæ¦è¿°
é忝ä¸ä¸ªå¤§å°å¯åç容å¨ï¼å®¹å¨ä¸çæ¯ä¸ªæ°æ®ç§°ä¸ºä¸ä¸ªå
ç´
éåç¹ç¹ï¼ç±»åå¯ä»¥ä¸ç¡®å®ï¼å¤§å°ä¸åºå®ï¼éåæå¾å¤ï¼ä¸åçéåç¹ç¹å使ç¨åºæ¯ä¸å
æ°ç»ï¼ç±»ååé¿åº¦ä¸æ¦å®ä¹åºæ¥å°±é½åºå®
ä½ç¨ï¼
* å¨å¼åä¸ï¼å¾å¤æ¶åå
ç´ çä¸ªæ°æ¯ä¸ç¡®å®ç
* èä¸ç»å¸¸è¦è¿è¡å
ç´ çå¢å è¯¥æ¥æä½ï¼éå齿¯é常åéçï¼å¼åä¸éåç¨çæ´å¤
***
### åå¨ç»æ
æ°æ®ç»ææçæ¯æ°æ®ä»¥ä»ä¹æ¹å¼ç»ç»å¨ä¸èµ·ï¼ä¸åçæ°æ®ç»æï¼å¢å æ¥çæ§è½æ¯ä¸ä¸æ ·ç
æ°æ®åå¨ç常ç¨ç»ææï¼æ ãéåãæ°ç»ãé¾è¡¨åçº¢é»æ
* éåï¼queueï¼ï¼å
è¿å
åºï¼åè¿ååºã(FIFO first in first out)
* æ ï¼stackï¼ï¼åè¿å
åºï¼å
è¿ååº ï¼LIFOï¼
* æ°ç»ï¼æ°ç»æ¯å
åä¸çè¿ç»åå¨åºåï¼åæè¥å¹²çåçå°åºåï¼æ¯ä¸ªåºå大尿¯ä¸æ ·çï¼å
ç´ åå¨ç´¢å¼
ç¹ç¹ï¼**æ¥è¯¢å
ç´ å¿«**ï¼æ ¹æ®ç´¢å¼å¿«é计ç®åºå
ç´ çå°åï¼ç¶åç«å³å»å®ä½ï¼ï¼**å¢å å
ç´ æ
¢**ï¼åå»ºæ°æ°ç»ï¼è¿ç§»å
ç´ ï¼
* é¾è¡¨ï¼å
ç´ ä¸æ¯å
åä¸çè¿ç»åºååå¨ï¼å
ç´ æ¯æ¸¸ç¦»åå¨çï¼æ¯ä¸ªå
ç´ ä¼è®°å½ä¸ä¸ªå
ç´ çå°å
ç¹ç¹ï¼**æ¥è¯¢å
ç´ æ
¢ï¼å¢å å
ç´ å¿«**ï¼é对äºé¦å°¾å
ç´ ï¼é度æå¿«ï¼ä¸è¬æ¯åé¾è¡¨ï¼
* æ ï¼
* äºåæ ï¼binary tree æ°¸è¿åªæä¸ä¸ªæ ¹èç¹ï¼æ¯æ¯ä¸ªç»ç¹ä¸è¶
è¿2个èç¹çæ ï¼treeï¼
ç¹ç¹ï¼äºåæåºæ ï¼å°ç左边ï¼å¤§çå³è¾¹ï¼ä½æ¯å¯è½æ å¾é«ï¼æ§è½åå·®ï¼ä¸ºäºåæåºåæç´¢ä¼è¿è¡å·¦æå峿å®ç°å¹³è¡¡æ¥æ¾äºåæ ï¼è®©æ çé«åº¦å·®ä¸å¤§äº1
* çº¢é»æ ï¼åºäºçº¢é»è§åå®ç°èªå¹³è¡¡çæåºäºåæ ï¼ï¼æ ä¿è¯å°äºå¾ç®å°ï¼ä½æ¯åæå¥½åºï¼æ§è½æé«ç
ç¹ç¹ï¼**çº¢é»æ çå¢å æ¥æ¹æ§è½é½å¥½**
åæ°æ®ç»ææ¶é´å¤æåº¦å¯¹æ¯ï¼

å¾çæ¥æºï¼https://www.bigocheatsheet.com/
***
### Collection
#### æ¦è¿°
Java ä¸éåçä»£è¡¨æ¯ Collectionï¼Collection é忝 Java ä¸éåçç¥å®ç±»
Collection éååºå±ä¸ºæ°ç»ï¼`[value1, value2, ....]`
```java
Collectionéåçä½ç³»:
Collection(æ¥å£)
/ \
Set(æ¥å£) List(æ¥å£)
/ \ / \
HashSet(å®ç°ç±») TreeSet<>(å®ç°ç±») ArrayList(å®ç°ç±») LinekdList<>(å®ç°ç±»)
/
LinkedHashSet<>(å®ç°ç±»)
```
**éåçç¹ç¹ï¼**
* Set ç³»åéåï¼æ·»å çå
ç´ æ¯æ åºï¼ä¸éå¤ï¼æ ç´¢å¼ç
* HashSetï¼æ·»å çå
ç´ æ¯æ åºï¼ä¸éå¤ï¼æ ç´¢å¼ç
* LinkedHashSetï¼æ·»å çå
ç´ æ¯æåºï¼ä¸éå¤ï¼æ ç´¢å¼ç
* TreeSetï¼ä¸éå¤ï¼æ ç´¢å¼ï¼æç
§å¤§å°é»è®¤ååºæåº
* List ç³»åéåï¼æ·»å çå
ç´ æ¯æåºï¼å¯éå¤ï¼æç´¢å¼
* ArrayListï¼æ·»å çå
ç´ æ¯æåºï¼å¯éå¤ï¼æç´¢å¼
* LinekdListï¼æ·»å çå
ç´ æ¯æåºï¼å¯éå¤ï¼æç´¢å¼
***
#### API
Collection æ¯éåçç¥å®ç±»ï¼å®çåè½æ¯å
¨é¨éåé½å¯ä»¥ç»§æ¿ä½¿ç¨çï¼æä»¥è¦å¦ä¹ å®ã
Collection åç±»çæé å¨é½æå¯ä»¥å
è£
å
¶ä»åç±»çæé æ¹æ³ï¼å¦ï¼
* `public ArrayList(Collection extends E> c)`ï¼æé æ°éåï¼å
ç´ æç
§ç±éåçè¿ä»£å¨è¿åç顺åº
* `public HashSet(Collection extends E> c)`ï¼æé ä¸ä¸ªå
嫿å®éåä¸çå
ç´ çæ°éå
Collection API å¦ä¸ï¼
* `public boolean add(E e)`ï¼æç»å®ç对象添å å°å½åéåä¸ ã
* `public void clear()`ï¼æ¸
空éå䏿æçå
ç´ ã
* `public boolean remove(E e)`ï¼æç»å®ç对象å¨å½åéåä¸å é¤ã
* `public boolean contains(Object obj)`ï¼å¤æå½åéå䏿¯å¦å
å«ç»å®ç对象ã
* `public boolean isEmpty()`ï¼å¤æå½åé忝å¦ä¸ºç©ºã
* `public int size()`ï¼è¿åéåä¸å
ç´ ç个æ°ã
* `public Object[] toArray()`ï¼æéåä¸çå
ç´ ï¼åå¨å°æ°ç»ä¸
* `public boolean addAll(Collection extends E> c)`ï¼å°æå®éåä¸çææå
ç´ æ·»å å°æ¤éå
```java
public class CollectionDemo {
public static void main(String[] args) {
Collection sets = new HashSet<>();
sets.add("MyBatis");
System.out.println(sets.add("Java"));//true
System.out.println(sets.add("Java"));//false
sets.add("Spring");
sets.add("MySQL");
System.out.println(sets)//[]æ åºç;
System.out.println(sets.contains("java"));//true åå¨
Object[] arrs = sets.toArray();
System.out.println("æ°ç»ï¼"+ Arrays.toString(arrs));
Collection c1 = new ArrayList<>();
c1.add("java");
Collection c2 = new ArrayList<>();
c2.add("ee");
c1.addAll(c2);// c1:[java,ee] c2:[ee];
}
}
```
***
#### éå
Collection éåçé忹弿ä¸ç§:
éåå¯ä»¥ç´æ¥è¾åºå
容ï¼å 为åºå±éåäº toString() æ¹æ³
1. è¿ä»£å¨
* `public Iterator iterator()`ï¼è·åéå对åºçè¿ä»£å¨ï¼ç¨æ¥éåéåä¸çå
ç´ ç
* `E next()`ï¼è·åä¸ä¸ä¸ªå
ç´ å¼
* `boolean hasNext()`ï¼å¤ææ¯å¦æä¸ä¸ä¸ªå
ç´ ï¼æè¿å true ï¼åä¹è¿å false
* `default void remove()`ï¼ä»åºå±éåä¸å 餿¤è¿ä»£å¨è¿åçæåä¸ä¸ªå
ç´ ï¼è¿ç§æ¹æ³åªè½å¨æ¯æ¬¡è°ç¨ next() æ¶è°ç¨ä¸æ¬¡
2. å¢å¼º for 循ç¯ï¼å¯ä»¥éåéåæè
æ°ç»ï¼éåéåå®é
䏿¯è¿ä»£å¨éåçç®ååæ³
```java
for(被éåéåæè
æ°ç»ä¸å
ç´ çç±»å åéåç§° : 被éåéåæè
æ°ç»){
}
```
缺ç¹ï¼éåæ æ³ç¥ééåå°äºåªä¸ªå
ç´ äºï¼å 为没æç´¢å¼
3. JDK 1.8 å¼å§ä¹åçæ°ææ¯ Lambda 表达å¼
```java
public class CollectionDemo {
public static void main(String[] args) {
Collection lists = new ArrayList<>();
lists.add("aa");
lists.add("bb");
lists.add("cc");
System.out.println(lists); // lists = [aa, bb, cc]
//è¿ä»£å¨æµç¨
// 1.å¾å°éåçè¿ä»£å¨å¯¹è±¡ã
Iterator it = lists.iterator();
// 2.使ç¨while循ç¯éåã
while(it.hasNext()){
String ele = it.next();
System.out.println(ele);
}
//å¢å¼ºfor
for (String ele : lists) {
System.out.println(ele);
}
//lambda表达å¼
lists.forEach(s -> {
System.out.println(s);
});
}
}
```
***
#### List
##### æ¦è¿°
List éåç»§æ¿äº Collection éåå
¨é¨çåè½ã
List ç³»åéåæç´¢å¼ï¼æä»¥å¤äºå¾å¤æç
§ç´¢å¼æä½å
ç´ çåè½ï¼for 循ç¯éåï¼4 ç§éåï¼
List ç³»åéåï¼
* ArrayListï¼æ·»å çå
ç´ æ¯æåºï¼å¯éå¤ï¼æç´¢å¼
* LinekdListï¼æ·»å çå
ç´ æ¯æåºï¼å¯éå¤ï¼æç´¢å¼
***
##### ArrayList
###### ä»ç»
ArrayList æ·»å çå
ç´ ï¼æ¯æåºï¼å¯éå¤ï¼æç´¢å¼ç
* `public boolean add(E e)`ï¼å°æå®çå
ç´ è¿½å å°æ¤éåçæ«å°¾
* `public void add(int index, E element)`ï¼å°æå®çå
ç´ ï¼æ·»å å°è¯¥éåä¸çæå®ä½ç½®ä¸
* `public E get(int index)`ï¼è¿åéå䏿å®ä½ç½®çå
ç´
* `public E remove(int index)`ï¼ç§»é¤åè¡¨ä¸æå®ä½ç½®çå
ç´ ï¼è¿åçæ¯è¢«ç§»é¤çå
ç´
* `public E set(int index, E element)`ï¼ç¨æå®å
ç´ æ¿æ¢éå䏿å®ä½ç½®çå
ç´ ï¼è¿åæ´æ°åçå
ç´ å¼
* `int indexOf(Object o)`ï¼è¿ååè¡¨ä¸æå®å
ç´ ç¬¬ä¸æ¬¡åºç°çç´¢å¼ï¼å¦æä¸å
嫿¤å
ç´ ï¼åè¿å -1
```java
public static void main(String[] args){
List lists = new ArrayList<>();//夿
lists.add("java1");
lists.add("java1");//å¯ä»¥éå¤
lists.add("java2");
for(int i = 0 ; i < lists.size() ; i++ ) {
String ele = lists.get(i);
System.out.println(ele);
}
}
```
***
###### æºç
ArrayList å®ç°ç±»éååºå±**åºäºæ°ç»å卿°æ®**çï¼æ¥è¯¢å¿«ï¼å¢å æ
¢ï¼æ¯æå¿«ééæºè®¿é®
```java
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable{}
```
- `RandomAccess` æ¯ä¸ä¸ªæ å¿æ¥å£ï¼è¡¨æå®ç°è¿ä¸ªè¿ä¸ªæ¥å£ç List éåæ¯æ¯æ**å¿«ééæºè®¿é®**çãå¨ `ArrayList` ä¸ï¼æä»¬å³å¯ä»¥éè¿å
ç´ çåºå·å¿«éè·åå
ç´ å¯¹è±¡ï¼è¿å°±æ¯å¿«ééæºè®¿é®ã
- `ArrayList` å®ç°äº `Cloneable` æ¥å£ ï¼å³è¦çäºå½æ° `clone()`ï¼è½è¢«å
é
- `ArrayList` å®ç°äº `Serializable ` æ¥å£ï¼è¿æå³ç `ArrayList` æ¯æåºååï¼è½éè¿åºååå»ä¼ è¾
æ ¸å¿æ¹æ³ï¼
* æé 彿°ï¼ä»¥æ åæ°æé æ¹æ³å建 ArrayList æ¶ï¼å®é
ä¸åå§åèµå¼çæ¯ä¸ä¸ªç©ºæ°ç»ãå½çæ£å¯¹æ°ç»è¿è¡æ·»å å
ç´ æä½æ¶ï¼æçæ£åé
容éï¼æ°æ§åå§åï¼ï¼å³åæ°ç»ä¸æ·»å 第ä¸ä¸ªå
ç´ æ¶ï¼**æ°ç»å®¹éæ©ä¸º 10**
* æ·»å å
ç´ ï¼
```java
// e æå
¥çå
ç´ elementDataåºå±æ°ç» size æå
¥çä½ç½®
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e; // æå
¥sizeä½ç½®ï¼ç¶åå ä¸
return true;
}
```
å½ add 第 1 个å
ç´ å° ArrayListï¼size æ¯ 0ï¼è¿å
¥ ensureCapacityInternal æ¹æ³ï¼
```java
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
```
```java
private static int calculateCapacity(Object[] elementData, int minCapacity) {
// 夿elementDataæ¯ä¸æ¯ç©ºæ°ç»
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
// è¿åé»è®¤å¼åæå°éæ±å®¹éæå¤§çä¸ä¸ª
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
```
妿éè¦ç容éå¤§äºæ°ç»é¿åº¦ï¼è¿è¡æ©å®¹ï¼
```java
// 夿æ¯å¦éè¦æ©å®¹
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// ç´¢å¼è¶ç
if (minCapacity - elementData.length > 0)
// è°ç¨growæ¹æ³è¿è¡æ©å®¹ï¼è°ç¨æ¤æ¹æ³ä»£è¡¨å·²ç»å¼å§æ©å®¹äº
grow(minCapacity);
}
```
æå®ç´¢å¼æå
¥ï¼**卿§æ°ç»ä¸æä½**ï¼
```java
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
// å°æå®ç´¢å¼åçæ°æ®åç§»
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}
```
* æ©å®¹ï¼æ°å®¹éç大å°ä¸º `oldCapacity + (oldCapacity >> 1)`ï¼`oldCapacity >> 1` éè¦åæ´ï¼æä»¥æ°å®¹éå¤§çº¦æ¯æ§å®¹éç 1.5 åå·¦å³ï¼å³ oldCapacity+oldCapacity/2
æ©å®¹æä½éè¦è°ç¨ `Arrays.copyOf()`ï¼åºå± `System.arraycopy()`ï¼æåæ°ç»æ´ä¸ªå¤å¶å°**æ°æ°ç»**ä¸ï¼è¿ä¸ªæä½ä»£ä»·å¾é«ï¼å æ¤æå¥½å¨å建 ArrayList 对象æ¶å°±æå®å¤§æ¦ç容é大å°ï¼åå°æ©å®¹æä½ç次æ°
```java
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
//æ£æ¥æ°å®¹éæ¯å¦å¤§äºæå°éè¦å®¹éï¼è¥å°äºæå°éè¦å®¹éï¼å°±ææå°éè¦å®¹éå½ä½æ°ç»çæ°å®¹é
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;//ä¸éè¦æ©å®¹è®¡ç®
//æ£æ¥æ°å®¹éæ¯å¦å¤§äºæå¤§æ°ç»å®¹é
if (newCapacity - MAX_ARRAY_SIZE > 0)
//妿minCapacityå¤§äºæå¤§å®¹éï¼åæ°å®¹éå为`Integer.MAX_VALUE`
//å¦åï¼æ°å®¹é大å°å为 MAX_ARRAY_SIZE å³ä¸º `Integer.MAX_VALUE - 8`
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
```
MAX_ARRAY_SIZEï¼è¦åé
çæ°ç»çæå¤§å¤§å°ï¼åé
æ´å¤§ç**å¯è½**ä¼å¯¼è´
* OutOfMemoryError:Requested array size exceeds VM limitï¼è¯·æ±çæ°ç»å¤§å°è¶
åº VM éå¶ï¼
* OutOfMemoryError: Java heap spaceï¼å åºå
åä¸è¶³ï¼å¯ä»¥éè¿è®¾ç½® JVM åæ° -Xmx æ¥è°èï¼
* å é¤å
ç´ ï¼éè¦è°ç¨ System.arraycopy() å° index+1 åé¢çå
ç´ é½å¤å¶å° index ä½ç½®ä¸ï¼å¨æ§æ°ç»ä¸æä½ï¼è¯¥æä½çæ¶é´å¤æåº¦ä¸º O(N)ï¼å¯ä»¥çå° ArrayList å é¤å
ç´ ç代价æ¯é常é«ç
```java
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index, numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}
```
* åºååï¼ArrayList åºäºæ°ç»å¹¶ä¸å
·æå¨ææ©å®¹ç¹æ§ï¼å æ¤ä¿åå
ç´ çæ°ç»ä¸ä¸å®é½ä¼è¢«ä½¿ç¨ï¼å°±æ²¡å¿
è¦å
¨é¨è¿è¡åºååãä¿åå
ç´ çæ°ç» elementData ä½¿ç¨ transient 修饰ï¼è¯¥å
³é®åå£°ææ°ç»é»è®¤ä¸ä¼è¢«åºåå
```java
transient Object[] elementData;
```
* ensureCapacityï¼å¢å æ¤å®ä¾ç容éï¼ä»¥ç¡®ä¿å®è³å°å¯ä»¥å®¹çº³æå°å®¹éåæ°æå®çå
ç´ æ°ï¼åå°å¢ééæ°åé
çæ¬¡æ°
```java
public void ensureCapacity(int minCapacity) {
if (minCapacity > elementData.length
&& !(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
&& minCapacity <= DEFAULT_CAPACITY)) {
modCount++;
grow(minCapacity);
}
}
```
* **Fail-Fast**ï¼å¿«é失败ï¼modCount ç¨æ¥è®°å½ ArrayList **ç»æåçåå**çæ¬¡æ°ï¼ç»æåçååæ¯ææ·»å æè
å é¤è³å°ä¸ä¸ªå
ç´ çæä½ï¼æè
æ¯è°æ´å
鍿°ç»ç大å°ï¼ä»
ä»
åªæ¯è®¾ç½®å
ç´ çå¼ä¸ç®ç»æåçåå
å¨è¿è¡åºååæè
è¿ä»£çæä½æ¶ï¼éè¦æ¯è¾æä½åå modCount æ¯å¦æ¹åï¼æ¹åäºæåº ConcurrentModificationException å¼å¸¸
```java
public Iterator iterator() {
return new Itr();
}
```
```java
private class Itr implements Iterator {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
Itr() {}
public boolean hasNext() {
return cursor != size;
}
// è·åä¸ä¸ä¸ªå
ç´ æ¶é¦å
å¤æç»ææ¯å¦åçåå
public E next() {
checkForComodification();
// .....
}
// modCount 被å
¶ä»çº¿ç¨æ¹åæåºå¹¶åä¿®æ¹å¼å¸¸
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
// ãå
许å 餿ä½ã
public void remove() {
// ...
checkForComodification();
// ...
// å é¤åéç½® expectedModCount
expectedModCount = modCount;
}
}
```
***
##### Vector
忥ï¼Vector çå®ç°ä¸ ArrayList 类似ï¼ä½æ¯æ¹æ³ä¸ä½¿ç¨äº synchronized è¿è¡åæ¥
æé ï¼é»è®¤é¿åº¦ä¸º 10 çæ°ç»
æ©å®¹ï¼Vector çæé 彿°å¯ä»¥ä¼ å
¥ capacityIncrement åæ°ï¼ä½ç¨æ¯å¨æ©å®¹æ¶ä½¿å®¹é capacity å¢é¿ capacityIncrementï¼å¦æè¿ä¸ªåæ°çå¼å°äºçäº 0ï¼é»è®¤0ï¼ï¼æ©å®¹æ¶æ¯æ¬¡é½ä»¤ capacity ä¸ºåæ¥ç两å
å¯¹æ¯ ArrayList
1. Vector æ¯åæ¥çï¼å¼éæ¯ ArrayList è¦å¤§ï¼è®¿é®éåº¦æ´æ
¢ãæå¥½ä½¿ç¨ ArrayList è䏿¯ Vectorï¼å ä¸ºåæ¥æä½å®å
¨å¯ä»¥ç±ç¨åºæ¥æ§å¶
2. Vector æ¯æ¬¡æ©å®¹è¯·æ±å
¶å¤§å°ç 2 åï¼ä¹å¯ä»¥éè¿æé 彿°è®¾ç½®å¢é¿ç容éï¼ï¼è ArrayList æ¯ 1.5 å
3. åºå±é½æ¯ `Object[]` æ°ç»åå¨
****
##### LinkedList
###### ä»ç»
LinkedList 乿¯ List çå®ç°ç±»ï¼åºäº**ååé¾è¡¨**å®ç°ï¼ä½¿ç¨ Node åå¨é¾è¡¨èç¹ä¿¡æ¯ï¼å¢å æ¯è¾å¿«ï¼æ¥è¯¢æ
¢
LinkedList é¤äºæ¥æ List éåçå
¨é¨åè½è¿å¤äºå¾å¤æä½é¦å°¾å
ç´ çç¹æ®åè½ï¼
* `public boolean add(E e)`ï¼å°æå®å
ç´ æ·»å å°æ¤å表çç»å°¾
* `public E poll()`ï¼æ£ç´¢å¹¶å 餿¤å表ç头ï¼ç¬¬ä¸ä¸ªå
ç´ ï¼
* `public void addFirst(E e)`ï¼å°æå®å
ç´ æå
¥æ¤å表çå¼å¤´
* `public void addLast(E e)`ï¼å°æå®å
ç´ æ·»å å°æ¤å表çç»å°¾
* `public E pop()`ï¼ä»æ¤å表æè¡¨ç¤ºçå æ å¤å¼¹åºä¸ä¸ªå
ç´
* `public void push(E e)`ï¼å°å
ç´ æ¨å
¥æ¤å表æè¡¨ç¤ºçå æ
* `public int indexOf(Object o)`ï¼è¿åæ¤åè¡¨ä¸æå®å
ç´ çç¬¬ä¸æ¬¡åºç°çç´¢å¼ï¼å¦æä¸å
å«è¿å -1
* `public int lastIndexOf(Object o)`ï¼ä»å°¾éåæ¾
* ` public boolean remove(Object o)`ï¼ä¸æ¬¡åªå é¤ä¸ä¸ªå¹é
ç对象ï¼å¦æå é¤äºå¹é
对象è¿å true
* `public E remove(int index)`ï¼å 餿å®ä½ç½®çå
ç´
```java
public class ListDemo {
public static void main(String[] args) {
// 1.ç¨LinkedListåä¸ä¸ªéå:å
è¿å
åºï¼åè¿ååºã
LinkedList queue = new LinkedList<>();
// å
¥é
queue.addLast("1å·");
queue.addLast("2å·");
queue.addLast("3å·");
System.out.println(queue); // [1å·, 2å·, 3å·]
// åºé
System.out.println(queue.removeFirst());//1å·
System.out.println(queue.removeFirst());//2å·
System.out.println(queue);//[3å·]
// åä¸ä¸ªæ å
è¿ååº
LinkedList stack = new LinkedList<>();
// åæ
stack.push("第1é¢åå¼¹");//addFirst(e);
stack.push("第2é¢åå¼¹");
stack.push("第3é¢åå¼¹");
System.out.println(stack); // [ 第3é¢åå¼¹, 第2é¢åå¼¹, 第1é¢åå¼¹]
// å¼¹æ
System.out.println(stack.pop());//removeFirst(); 第3é¢åå¼¹
System.out.println(stack.pop());
System.out.println(stack);// [第1é¢åå¼¹]
}
}
```
***
###### æºç
LinkedList æ¯ä¸ä¸ªå®ç°äº List æ¥å£ç**å端é¾è¡¨**ï¼æ¯æé«æçæå
¥åå 餿ä½ï¼å¦å¤ä¹å®ç°äº Deque æ¥å£ï¼ä½¿å¾ LinkedList ç±»ä¹å
·æéåçç¹æ§

æ ¸å¿æ¹æ³ï¼
* 使 LinkedList åæçº¿ç¨å®å
¨çï¼å¯ä»¥è°ç¨éæç±» Collections ç±»ä¸ç synchronizedList æ¹æ³ï¼
```java
List list = Collections.synchronizedList(new LinkedList(...));
```
* ç§æå
é¨ç±» Nodeï¼è¿ä¸ªç±»ä»£è¡¨å端é¾è¡¨çèç¹ Node
```java
private static class Node {
E item;
Node next;
Node prev;
Node(Node prev, E element, Node next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
```
* æé æ¹æ³ï¼åªææ åæé åç¨å·²æçéåå建é¾è¡¨çæé æ¹æ³
* æ·»å å
ç´ ï¼é»è®¤å å°å°¾é¨
```java
public boolean add(E e) {
linkLast(e);
return true;
}
```
* è·åå
ç´ ï¼`get(int index)` æ ¹æ®æå®ç´¢å¼è¿åæ°æ®
* è·å头èç¹ (index=0)ï¼`getFirst()ãelement()ãpeek()ãpeekFirst()` è¿å个è·å头ç»ç¹æ¹æ³çåºå«å¨äºå¯¹é¾è¡¨ä¸ºç©ºæ¶çå¤çæ¹å¼ï¼æ¯æåºå¼å¸¸è¿æ¯è¿åNULLï¼å
¶ä¸ `getFirst() element()` æ¹æ³å°ä¼å¨é¾è¡¨ä¸ºç©ºæ¶ï¼æåºå¼å¸¸
* è·åå°¾èç¹ (index=-1)ï¼getLast() æ¹æ³å¨é¾è¡¨ä¸ºç©ºæ¶ï¼æåº NoSuchElementExceptionï¼è peekLast() ä¸ä¼ï¼åªä¼è¿å null
* å é¤å
ç´ ï¼
* remove()ãremoveFirst()ãpop()ï¼å é¤å¤´èç¹
* removeLast()ãpollLast()ï¼å é¤å°¾èç¹ï¼removeLast()å¨é¾è¡¨ä¸ºç©ºæ¶æåºNoSuchElementExceptionï¼èpollLast()æ¹æ³è¿ånull
å¯¹æ¯ ArrayList
1. æ¯å¦ä¿è¯çº¿ç¨å®å
¨ï¼ArrayList å LinkedList 齿¯ä¸åæ¥çï¼ä¹å°±æ¯ä¸ä¿è¯çº¿ç¨å®å
¨
2. åºå±æ°æ®ç»æï¼
* Arraylist åºå±ä½¿ç¨çæ¯ `Object` æ°ç»
* LinkedList åºå±ä½¿ç¨çæ¯ååé¾è¡¨æ°æ®ç»æï¼JDK1.6 ä¹å为循ç¯é¾è¡¨ï¼JDK1.7 åæ¶äºå¾ªç¯ï¼
3. æå
¥åå 餿¯å¦åå
ç´ ä½ç½®çå½±åï¼
* ArrayList éç¨æ°ç»åå¨ï¼æä»¥æå
¥åå é¤å
ç´ åå
ç´ ä½ç½®çå½±å
* LinkedListé ç¨é¾è¡¨åå¨ï¼æä»¥å¯¹äº`add(E e)`æ¹æ³çæå
¥ï¼å é¤å
ç´ ä¸åå
ç´ ä½ç½®çå½±å
4. æ¯å¦æ¯æå¿«ééæºè®¿é®ï¼
* LinkedList 䏿¯æé«æçéæºå
ç´ è®¿é®ï¼ArrayList æ¯æ
* å¿«ééæºè®¿é®å°±æ¯éè¿å
ç´ çåºå·å¿«éè·åå
ç´ å¯¹è±¡(对åºäº `get(int index)` æ¹æ³)
5. å
å空é´å ç¨ï¼
* ArrayList çç©ºé´æµªè´¹ä¸»è¦ä½ç°å¨å¨ list å表çç»å°¾ä¼é¢çä¸å®ç容é空é´
* LinkedList ç空é´è±è´¹åä½ç°å¨å®çæ¯ä¸ä¸ªå
ç´ é½éè¦æ¶èæ¯ ArrayListæ´å¤ç空é´ï¼å 为è¦åæ¾ç´æ¥åç»§åç´æ¥å驱以忰æ®ï¼
***
#### Set
##### æ¦è¿°
Set ç³»åéåï¼
* HashSetï¼æ·»å çå
ç´ æ¯æ åºï¼ä¸éå¤ï¼æ ç´¢å¼ç
* LinkedHashSetï¼æ·»å çå
ç´ æ¯æåºï¼ä¸éå¤ï¼æ ç´¢å¼ç
* TreeSetï¼ä¸éå¤ï¼æ ç´¢å¼ï¼æç
§å¤§å°é»è®¤ååºæåº
**注æ**ï¼æ²¡æç´¢å¼ï¼ä¸è½ä½¿ç¨æ®é for 循ç¯éå
***
##### HashSet
åå¸å¼ï¼
- åå¸å¼ï¼JDK æ ¹æ®å¯¹è±¡çå°åæè
å符串æè
æ°å计ç®åºæ¥çæ°å¼
- è·ååå¸å¼ï¼Object ç±»ä¸ç public int hashCode()
- åå¸å¼çç¹ç¹
- åä¸ä¸ªå¯¹è±¡å¤æ¬¡è°ç¨ hashCode() æ¹æ³è¿åçåå¸å¼æ¯ç¸åç
- é»è®¤æ
åµä¸ï¼ä¸å对象çåå¸å¼æ¯ä¸åçï¼èéå hashCode() æ¹æ³ï¼å¯ä»¥å®ç°è®©ä¸å对象çåå¸å¼ç¸å
**HashSet åºå±å°±æ¯åºäº HashMap å®ç°ï¼å¼æ¯ PRESENT = new Object()**
Set éåæ·»å çå
ç´ æ¯æ åºï¼ä¸éå¤çã
* æ¯å¦ä½å»éå¤çï¼
```java
1.å¯¹äºæå¼ç¹æ§çï¼Setéåå¯ä»¥ç´æ¥å¤æè¿è¡å»éå¤ã
2.对äºå¼ç¨æ°æ®ç±»åç类对象ï¼Seté忝æç
§å¦ä¸æµç¨è¿è¡æ¯å¦éå¤ç夿ã
Setéåä¼è®©ä¸¤ä¸¤å¯¹è±¡ï¼å
è°ç¨èªå·±çhashCode()æ¹æ³å¾å°å½¼æ¤çåå¸å¼ï¼æè°çå
åå°åï¼
ç¶åæ¯è¾ä¸¤ä¸ªå¯¹è±¡çåå¸å¼æ¯å¦ç¸åï¼å¦æä¸ç¸ååç´æ¥è®¤ä¸ºä¸¤ä¸ªå¯¹è±¡ä¸éå¤ã
妿åå¸å¼ç¸åï¼ä¼ç»§ç»è®©ä¸¤ä¸ªå¯¹è±¡è¿è¡equalsæ¯è¾å
容æ¯å¦ç¸åï¼å¦æç¸å认为ççéå¤äº
妿ä¸ç¸å认为ä¸éå¤ã
Setéåä¼å
让对象è°ç¨hashCode()æ¹æ³è·å两个对象çåå¸å¼æ¯è¾
/ \
false true
/ \
ä¸éå¤ ç»§ç»è®©ä¸¤ä¸ªå¯¹è±¡è¿è¡equalsæ¯è¾
/ \
false true
/ \
ä¸éå¤ éå¤äº
```
* Set ç³»åéåå
ç´ æ åºçæ ¹æ¬åå
Set ç³»åéåæ·»å å
ç´ æ åºçæ ¹æ¬åå æ¯å 为**åºå±éç¨äºåå¸è¡¨åå¨å
ç´ **ã
* JDK 1.8 ä¹åï¼åå¸è¡¨ = æ°ç»ï¼åå§å®¹é16) + é¾è¡¨ + ï¼åå¸ç®æ³ï¼
* JDK 1.8 ä¹åï¼åå¸è¡¨ = æ°ç»ï¼åå§å®¹é16) + é¾è¡¨ + çº¢é»æ + ï¼åå¸ç®æ³ï¼
* å½é¾è¡¨é¿åº¦è¶
è¿éå¼ 8 ä¸å½åæ°ç»çé¿åº¦ > 64æ¶ï¼å°é¾è¡¨è½¬æ¢ä¸ºçº¢é»æ ï¼åå°äºæ¥æ¾æ¶é´
* å½é¾è¡¨é¿åº¦è¶
è¿éå¼ 8 ä¸å½åæ°ç»çé¿åº¦ < 64æ¶ï¼æ©å®¹

æ¯ä¸ªå
ç´ ç hashcode() çå¼è¿è¡ååºçç®æ³è¿ç®ï¼è®¡ç®åºçå¼ç¸åçåå
¥ä¸ä¸ªæ°ç»åä¸ï¼ä»¥é¾è¡¨çå½¢å¼åå¨ï¼å¦æé¾è¡¨é¿åº¦è¶
è¿8å°±éåçº¢é»æ åå¨ï¼æä»¥è¾åºçå
ç´ æ¯æ åºçã
* å¦ä½è®¾ç½®åªè¦å¯¹è±¡å
容䏿 ·ï¼å°±å¸æéå认为éå¤ï¼**éå hashCode å equals æ¹æ³**
****
##### Linked
LinkedHashSet 为ä»ä¹æ¯æåºçï¼
LinkedHashSet åºå±ä¾ç¶æ¯ä½¿ç¨åå¸è¡¨åå¨å
ç´ çï¼ä½æ¯æ¯ä¸ªå
ç´ é½é¢å¤å¸¦ä¸ä¸ªé¾æ¥ç»´æ¤æ·»å 顺åºï¼ä¸å
å¢å æ¥å¿«ï¼è¿æé¡ºåºï¼ç¼ºç¹æ¯å¤äºä¸ä¸ªåå¨é¡ºåºçé¾ä¼**å å
å空é´**ï¼èä¸ä¸å
许éå¤ï¼æ ç´¢å¼
****
##### TreeSet
TreeSet éåèªæåºçæ¹å¼ï¼
1. æå¼ç¹æ§çå
ç´ ç´æ¥å¯ä»¥ååºæåºï¼æµ®ç¹åï¼æ´åï¼
2. å符串类åçå
ç´ ä¼æç
§é¦å符çç¼å·æåº
3. 对äºèªå®ä¹çå¼ç¨æ°æ®ç±»åï¼TreeSet é»è®¤æ æ³æåºï¼æ§è¡çæ¶åæ¥éï¼å 为ä¸ç¥éæåºè§å
èªå®ä¹çå¼ç¨æ°æ®ç±»åï¼TreeSet é»è®¤æ æ³æåºï¼éè¦å®å¶æåºçè§åï¼æ¹æ¡æ 2 ç§ï¼
* ç´æ¥ä¸º**对象çç±»**å®ç°æ¯è¾å¨è§åæ¥å£ Comparableï¼éåæ¯è¾æ¹æ³ï¼
æ¹æ³ï¼`public int compareTo(Employee o): this æ¯æ¯è¾è
, o æ¯è¢«æ¯è¾è
`
* æ¯è¾è
大äºè¢«æ¯è¾è
ï¼è¿åæ£æ°
* æ¯è¾è
å°äºè¢«æ¯è¾è
ï¼è¿åè´æ°
* æ¯è¾è
çäºè¢«æ¯è¾è
ï¼è¿å 0
* ç´æ¥ä¸º**éå**设置æ¯è¾å¨ Comparator 对象ï¼éåæ¯è¾æ¹æ³ï¼
æ¹æ³ï¼`public int compare(Employee o1, Employee o2): o1 æ¯è¾è
, o2 被æ¯è¾è
`
* æ¯è¾è
大äºè¢«æ¯è¾è
ï¼è¿åæ£æ°
* æ¯è¾è
å°äºè¢«æ¯è¾è
ï¼è¿åè´æ°
* æ¯è¾è
çäºè¢«æ¯è¾è
ï¼è¿å 0
注æï¼å¦æç±»åéåé½å¸¦ææ¯è¾è§åï¼ä¼å
使ç¨éåèªå¸¦çæ¯è¾è§å
```java
public class TreeSetDemo{
public static void main(String[] args){
Set students = new TreeSet<>();
Collections.add(students,s1,s2,s3);
System.out.println(students);//æç
§å¹´é¾æ¯è¾ ååº
Set s = new TreeSet<>(new Comparator(){
@Override
public int compare(Student o1, Student o2) {
// o1æ¯è¾è
o2被æ¯è¾è
return o2.getAge() - o1.getAge();//éåº
}
});
}
}
public class Student implements Comparable{
private String name;
private int age;
// éåäºæ¯è¾æ¹æ³ã
// e1.compareTo(o)
// æ¯è¾è
ï¼this
// 被æ¯è¾è
ï¼o
// éæ±ï¼æç
§å¹´é¾æ¯è¾ ååºï¼å¹´é¾ç¸åæç
§å§å
@Override
public int compareTo(Student o) {
int result = this.age - o.age;
return result == 0 ? this.getName().compareTo(o.getName):result;
}
}
```
æ¯è¾å¨åçï¼åºå±æ¯ä»¥ç¬¬ä¸ä¸ªå
ç´ ä¸ºåºåï¼å ä¸ä¸ªæ°å
ç´ ï¼å°±ä¼å第ä¸ä¸ªå
ç´ æ¯ï¼å¦æå¤§äºï¼å°±ç»§ç»å大äºçå
ç´ è¿è¡æ¯è¾ï¼ç´å°éå°æ¯æ°å
ç´ å¤§çå
ç´ ä¸ºæ¢ï¼æ¾å¨è¯¥ä½ç½®ç左边ï¼çº¢é»æ ï¼
***
#### Queue
Queueï¼éåï¼å
è¿å
åºçç¹æ§
PriorityQueue æ¯ä¼å
级éåï¼åºå±åå¨ç»æä¸º Object[]ï¼é»è®¤å®ç°ä¸ºå°é¡¶å ï¼æ¯æ¬¡åºéæå°çå
ç´
æé æ¹æ³ï¼
* `public PriorityQueue()`ï¼æé é»è®¤é¿åº¦ä¸º 11 çéåï¼æ°ç»ï¼
* `public PriorityQueue(Comparator super E> comparator)`ï¼å©ç¨æ¯è¾å¨èªå®ä¹å æåºçè§å
```java
Queue pq = new PriorityQueue<>((v1, v2) -> v2 - v1);//å®ç°å¤§é¡¶å
å¸¸ç¨ APIï¼
* `public boolean offer(E e)`ï¼å°æå®çå
ç´ æå
¥å°æ¤ä¼å
级éåç**å°¾é¨**
* `public E poll() `ï¼æ£ç´¢å¹¶å 餿¤éåç**头å
ç´ **ï¼å¦ææ¤éå为空ï¼åè¿å null
* `public E peek()`ï¼æ£ç´¢ä½ä¸å 餿¤éåç头ï¼å¦ææ¤éå为空ï¼åè¿å null
* `public boolean remove(Object o)`ï¼ä»è¯¥éåä¸å 餿å®å
ç´ ï¼å¦æåå¨ï¼ï¼å é¤å
ç´ e ä½¿ç¨ o.equals(e) æ¯è¾ï¼å¦æéåå
å«å¤ä¸ªè¿æ ·çå
ç´ ï¼å é¤ç¬¬ä¸ä¸ª
****
#### Collections
java.utils.Collectionsï¼éå**å·¥å
·ç±»**ï¼Collections å¹¶ä¸å±äºéåï¼æ¯ç¨æ¥æä½éåçå·¥å
·ç±»
Collections æå 个常ç¨çAPIï¼
* `public static boolean addAll(Collection super T> c, T... e)`ï¼ç»éå对象æ¹éæ·»å å
ç´
* `public static void shuffle(List> list)`ï¼æä¹±éå顺åº
* `public static void sort(List list)`ï¼å°éåä¸å
ç´ æç
§é»è®¤è§åæåº
* `public static void sort(List list,Comparator super T> )`ï¼éåä¸å
ç´ æç
§æå®è§åæåº
* `public static List synchronizedList(List list)`ï¼è¿åç±æå® list æ¯æç线ç¨å®å
¨ list
* `public static Set singleton(T o)`ï¼è¿åä¸ä¸ªåªå
嫿å®å¯¹è±¡çä¸å¯åç»
```java
public class CollectionsDemo {
public static void main(String[] args) {
Collection names = new ArrayList<>();
Collections.addAll(names,"å¼ ","ç","æ","èµµ");
List scores = new ArrayList<>();
Collections.addAll(scores, 98.5, 66.5 , 59.5 , 66.5 , 99.5 );
Collections.shuffle(scores);
Collections.sort(scores); // é»è®¤ååºæåºï¼
System.out.println(scores);
List students = new ArrayList<>();
Collections.addAll(students,s1,s2,s3,s4);
Collections.sort(students,new Comparator(){
})
}
}
public class Student{
private String name;
private int age;
}
```
***
### Map
#### æ¦è¿°
Collection æ¯åå¼éåä½ç³»ï¼Mapé忝ä¸ç§ååéåï¼æ¯ä¸ªå
ç´ å
å«ä¸¤ä¸ªå¼ã
Mapéåçæ¯ä¸ªå
ç´ çæ ¼å¼ï¼key=valueï¼é®å¼å¯¹å
ç´ ï¼ï¼Mapéåä¹è¢«ç§°ä¸ºé®å¼å¯¹éå
Mapéåç宿´æ ¼å¼ï¼`{key1=value1, key2=value2, key3=value3, ...}`
```
Mapéåçä½ç³»ï¼
Map(æ¥å£,Mapéåçç¥å®ç±»)
/ \
TreeMap HashMap(å®ç°ç±»,ç»å
¸çï¼ç¨çæå¤)
\
LinkedHashMap(å®ç°ç±»)
```
Map éåçç¹ç¹ï¼
1. Map éåçç¹ç¹é½æ¯ç±é®å³å®ç
2. Map éåç鮿¯æ åºï¼ä¸éå¤çï¼æ ç´¢å¼çï¼Setï¼
3. Map éåç弿 è¦æ±ï¼Listï¼
4. Map éåçé®å¼å¯¹é½å¯ä»¥ä¸º null
5. Map éååé¢éå¤çé®å¯¹åºå
ç´ ä¼è¦çåé¢çå
ç´
HashMapï¼å
ç´ æç
§é®æ¯æ åºï¼ä¸éå¤ï¼æ ç´¢å¼ï¼å¼ä¸åè¦æ±
LinkedHashMapï¼å
ç´ æç
§é®æ¯æåºï¼ä¸éå¤ï¼æ ç´¢å¼ï¼å¼ä¸åè¦æ±
***
#### 常ç¨API
Map éåçå¸¸ç¨ API
* `public V put(K key, V value)`ï¼ææå®çé®ä¸å¼æ·»å å° Map éåä¸ï¼**éå¤çé®ä¼è¦çåé¢çå¼å
ç´ **
* `public V remove(Object key)`ï¼ææå®çé®å¯¹åºçé®å¼å¯¹å
ç´ å¨éåä¸å é¤ï¼è¿å被å é¤å
ç´ çå¼
* `public V get(Object key)`ï¼æ ¹æ®æå®çé®ï¼å¨ Map éåä¸è·å对åºçå¼
* `public Set keySet()`ï¼è·å Map éå䏿æçé®ï¼åå¨å° **Set éå**ä¸
* `public Collection values()`ï¼è·åå
¨é¨å¼çéåï¼åå¨å° **Collection éå**
* `public Set> entrySet()`ï¼è·åMapéå䏿æçé®å¼å¯¹å¯¹è±¡çéå
* `public boolean containsKey(Object key)`ï¼å¤æè¯¥éå䏿¯å¦ææ¤é®
```java
public class MapDemo {
public static void main(String[] args) {
Map maps = new HashMap<>();
maps.put(.....);
System.out.println(maps.isEmpty());//false
Integer value = maps.get("....");//è¿åé®å¼å¯¹è±¡
Set keys = maps.keySet();//è·åMapéå䏿æçé®ï¼
//Mapéåç鮿¯æ åºä¸éå¤çï¼æä»¥è¿åçæ¯ä¸ä¸ªSetéå
Collection values = maps.values();
//Mapéåç弿¯ä¸åè¦æ±çï¼å¯è½éå¤ï¼æä»¥å¼è¦ç¨Collectioné忥æ¶!
}
}
```
***
#### éåæ¹å¼
Mapéåçé忹弿ï¼3ç§ã
1. â鮿¾å¼âçæ¹å¼éåï¼å
è·å Map éåå
¨é¨çé®ï¼åæ ¹æ®éå鮿¾å¼ã
2. âé®å¼å¯¹âçæ¹å¼éåï¼é¾åº¦è¾å¤§ï¼éç¨å¢å¼º for æè
è¿ä»£å¨
3. JDK 1.8 å¼å§ä¹åçæ°ææ¯ï¼foreachï¼éç¨ Lambda 表达å¼
éåå¯ä»¥ç´æ¥è¾åºå
容ï¼å 为åºå±éåäº toString() æ¹æ³
```java
public static void main(String[] args){
Map maps = new HashMap<>();
//(1)鮿¾å¼
Set keys = maps.keySet();
for(String key : keys) {
System.out.println(key + "=" + maps.get(key));
}
//Iterator iterator = hm.keySet().iterator();
//(2)é®å¼å¯¹
//(2.1)æ®éæ¹å¼
Set> entries = maps.entrySet();
for (Map.Entry entry : entries) {
System.out.println(entry.getKey() + "=>" + entry.getValue());
}
//(2.2)è¿ä»£å¨æ¹å¼
Iterator> iterator = maps.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = iterator.next();
System.out.println(entry.getKey() + "=" + entry.getValue());
}
//(3) Lamda
maps.forEach((k,v) -> {
System.out.println(k + "==>" + v);
})
}
```
***
#### HashMap
##### åºæ¬ä»ç»
HashMap åºäºåå¸è¡¨ç Map æ¥å£å®ç°ï¼æ¯ä»¥ key-value åå¨å½¢å¼åå¨ï¼ä¸»è¦ç¨æ¥åæ¾é®å¼å¯¹
ç¹ç¹ï¼
* HashMap çå®ç°ä¸æ¯åæ¥çï¼è¿æå³çå®ä¸æ¯çº¿ç¨å®å
¨ç
* key æ¯å¯ä¸ä¸éå¤çï¼åºå±çåå¸è¡¨ç»æï¼ä¾èµ hashCode æ¹æ³å equals æ¹æ³ä¿è¯é®çå¯ä¸
* keyãvalue é½å¯ä»¥ä¸ºnullï¼ä½æ¯ key ä½ç½®åªè½æ¯ä¸ä¸ªnull
* HashMap ä¸çæ å°ä¸æ¯æåºçï¼å³å忝æ åºç
* **key è¦åå¨çæ¯èªå®ä¹å¯¹è±¡ï¼éè¦éå hashCode å equals æ¹æ³ï¼é²æ¢åºç°å°åä¸åå
容ç¸åç key**
JDK7 å¯¹æ¯ JDK8ï¼
* 7 = æ°ç» + é¾è¡¨ï¼8 = æ°ç» + é¾è¡¨ + çº¢é»æ
* 7 䏿¯å¤´ææ³ï¼å¤çº¿ç¨å®¹æé æç¯ï¼8 䏿¯å°¾ææ³
* 7 çæ©å®¹æ¯å
¨é¨æ°æ®éæ°å®ä½ï¼8 䏿¯ä½ç½®ä¸åæè
å½åä½ç½® + æ§ size 大尿¥å®ç°
* 7 æ¯å
夿æ¯å¦è¦æ©å®¹åæå
¥ï¼8 䏿¯å
æå
¥åçæ¯å¦è¦æ©å®¹
åºå±æ°æ®ç»æï¼
* åå¸è¡¨ï¼Hash tableï¼ä¹å«æ£å表ï¼ï¼æ ¹æ®å
³é®ç å¼èç´æ¥è®¿é®çæ°æ®ç»æãéè¿æå
³é®ç 弿 å°å°è¡¨ä¸ä¸ä¸ªä½ç½®æ¥è®¿é®è®°å½ï¼ä»¥å å¿«æ¥æ¾çé度ï¼è¿ä¸ªæ å°å½æ°å«åæ£å彿°ï¼åæ¾è®°å½çæ°ç»å«åæ£å表
* JDK1.8 ä¹å HashMap ç±æ°ç»+é¾è¡¨ç»æ
* æ°ç»æ¯ HashMap ç主ä½
* é¾è¡¨åæ¯ä¸ºäºè§£å³åå¸å²çªèåå¨çï¼**æé¾æ³è§£å³å²çª**ï¼ï¼æé¾æ³å°±æ¯å¤´ææ³ï¼ä¸¤ä¸ªå¯¹è±¡è°ç¨ç hashCode æ¹æ³è®¡ç®çåå¸ç å¼ï¼é®çåå¸ï¼ä¸è´å¯¼è´è®¡ç®çæ°ç»ç´¢å¼å¼ç¸å
* JDK1.8 以å HashMap ç±**æ°ç»+é¾è¡¨ +çº¢é»æ **æ°æ®ç»æç»æ
* è§£å³åå¸å²çªæ¶æäºè¾å¤§çåå
* å½é¾è¡¨é¿åº¦**è¶
è¿ï¼å¤§äºï¼éå¼**ï¼æè
çº¢é»æ çè¾¹çå¼ï¼é»è®¤ä¸º 8ï¼å¹¶ä¸å½åæ°ç»ç**é¿åº¦å¤§äºçäº 64 æ¶**ï¼æ¤ç´¢å¼ä½ç½®ä¸çæææ°æ®æ¹ä¸ºçº¢é»æ åå¨
* å³ä½¿åå¸å½æ°åå¾å好ï¼ä¹å¾é¾è¾¾å°å
ç´ ç¾åç¾åååå¸ãå½ HashMap 䏿大éçå
ç´ é½åæ¾å°åä¸ä¸ªæ¡¶ä¸æ¶ï¼å°±ç¸å½äºä¸ä¸ªé¿çåé¾è¡¨ï¼åå¦åé¾è¡¨æ n 个å
ç´ ï¼éåç**æ¶é´å¤æåº¦æ¯ O(n)**ï¼æä»¥ JDK1.8 ä¸å¼å
¥äº çº¢é»æ ï¼æ¥æ¾**æ¶é´å¤æåº¦ä¸º O(logn)**ï¼æ¥ä¼åè¿ä¸ªé®é¢ï¼ä½¿å¾æ¥æ¾æçæ´é«

åèè§é¢ï¼https://www.bilibili.com/video/BV1nJ411J7AA
***
##### ç»§æ¿å
³ç³»
HashMap ç»§æ¿å
³ç³»å¦ä¸å¾æç¤ºï¼

说æï¼
* Cloneable 空æ¥å£ï¼è¡¨ç¤ºå¯ä»¥å
éï¼ å建并è¿å HashMap 对象çä¸ä¸ªå¯æ¬ã
* Serializable åºå忥å£ï¼å±äºæ è®°æ§æ¥å£ï¼HashMap 对象å¯ä»¥è¢«åºåååååºååã
* AbstractMap ç¶ç±»æä¾äº Map å®ç°æ¥å£ï¼ä»¥æå¤§é度å°åå°å®ç°æ¤æ¥å£æéçå·¥ä½
***
##### æå屿§
1. åºååçæ¬å·
```java
private static final long serialVersionUID = 362498820763181265L;
```
2. éåçåå§å容éï¼**å¿
é¡»æ¯äºç n 次å¹** ï¼
```java
// é»è®¤çåå§å®¹éæ¯16 -- 1<<4ç¸å½äº1*2ç4次æ¹---1*16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
```
HashMap æé æ¹æ³æå®éåçåå§å容é大å°ï¼
```java
HashMap(int initialCapacity)// æé ä¸ä¸ªå¸¦æå®åå§å®¹éåé»è®¤å è½½å å (0.75) ç空 HashMap
```
* 为ä»ä¹å¿
é¡»æ¯ 2 ç n 次å¹ï¼ç¨ä½è¿ç®æ¿ä»£åä½è®¡ç®ï¼åå° rehash ç代价ï¼ç§»å¨çèç¹å°ï¼
HashMap 䏿·»å å
ç´ æ¶ï¼éè¦æ ¹æ® key ç hash å¼ç¡®å®å¨æ°ç»ä¸çå
·ä½ä½ç½®ã为äºåå°ç¢°æï¼ææ°æ®åé
ååï¼æ¯ä¸ªé¾è¡¨é¿åº¦å¤§è´ç¸åï¼å®ç°è¯¥æ¹æ³å°±æ¯å模 `hash%length`ï¼è®¡ç®æºä¸ç´æ¥æ±ä½æçä¸å¦ä½ç§»è¿ç®ï¼ **`hash % length == hash & (length-1)` çåææ¯ length æ¯ 2 ç n 次å¹**
æ£åå¹³ååå¸ï¼2 ç n æ¬¡æ¹æ¯ 1 åé¢ n 个 0ï¼2 ç n æ¬¡æ¹ -1 æ¯ n 个 1ï¼å¯ä»¥**ä¿è¯æ£åçååæ§**ï¼åå°ç¢°æ
```java
ä¾å¦é¿åº¦ä¸º8æ¶åï¼3&(8-1)=3 2&(8-1)=2 ï¼ä¸åä½ç½®ä¸ï¼ä¸ç¢°æï¼
ä¾å¦é¿åº¦ä¸º9æ¶åï¼3&(9-1)=0 2&(9-1)=0 ï¼é½å¨0ä¸ï¼ç¢°æäºï¼
```
* 妿è¾å
¥å¼ä¸æ¯ 2 çå¹ä¼æä¹æ ·ï¼
å建 HashMap 对象æ¶ï¼HashMap éè¿ä½ç§»è¿ç®åæè¿ç®å¾å°çè¯å®æ¯ 2 ç广¬¡æ°ï¼å¹¶ä¸æ¯å¤§äºé£ä¸ªæ°çæè¿çæ°åï¼åºå±éç¨ tableSizeFor() æ¹æ³
3. é»è®¤çè´è½½å åï¼é»è®¤å¼æ¯ 0.75
```java
static final float DEFAULT_LOAD_FACTOR = 0.75f;
```
4. éåæå¤§å®¹é
```java
// éåæå¤§å®¹éçä¸éæ¯ï¼2ç30次å¹
static final int MAXIMUM_CAPACITY = 1 << 30;// 0100 0000 0000 0000 0000 0000 0000 0000 = 2 ^ 30
```
5. å½é¾è¡¨çå¼è¶
è¿ 8 åä¼è½¬çº¢é»æ ï¼JDK1.8 æ°å¢ï¼
```java
// 彿¡¶(bucket)ä¸çç»ç¹æ°å¤§äºè¿ä¸ªå¼æ¶ä¼è½¬æçº¢é»æ
static final int TREEIFY_THRESHOLD = 8;
```
为ä»ä¹ Map æ¡¶ä¸èç¹ä¸ªæ°å¤§äº 8 æè½¬ä¸ºçº¢é»æ ï¼
* å¨ HashMap 䏿䏿®µæ³¨é说æï¼**空é´åæ¶é´çæè¡¡**
```java
TreeNodeså ç¨ç©ºé´å¤§çº¦æ¯æ®éèç¹ç两åï¼æä»¥æä»¬åªå¨ç®±åå
å«è¶³å¤çèç¹æ¶æä½¿ç¨æ èç¹ãå½èç¹åå°(ç±äºå é¤æè°æ´å¤§å°)æ¶ï¼å°±ä¼è¢«è½¬æ¢åæ®éçæ¡¶ãå¨ä½¿ç¨åå¸è¯å¥½çç¨æ·hashcodeæ¶ï¼å¾å°ä½¿ç¨æ ç®±ãçæ³æ
åµä¸ï¼å¨éæºåå¸ç ä¸ï¼ç®±åä¸èç¹çé¢çæä»"æ³æ¾åå¸"ï¼é»è®¤è°æ´éå¼ä¸º0.75ï¼å¹³ååæ°çº¦ä¸º0.5ï¼å°½ç®¡ç±äºè°æ´ç²åº¦çå·®å¼å¾å¤§ãå¿½ç¥æ¹å·®ï¼å表大å°kç颿åºç°æ¬¡æ°æ¯(exp(-0.5)*pow(0.5, k)/factorial(k))
0: 0.60653066
1: 0.30326533
2: 0.07581633
3: 0.01263606
4: 0.00157952
5: 0.00015795
6: 0.00001316
7: 0.00000094
8: 0.00000006
more: less than 1 in ten million
ä¸ä¸ªbinä¸é¾è¡¨é¿åº¦è¾¾å°8个å
ç´ çæ¦ç为0.00000006ï¼å 乿¯ä¸å¯è½äºä»¶ï¼æä»¥æä»¬éæ©8è¿ä¸ªæ°å
```
* å
¶ä»è¯´æ³
çº¢é»æ ç平忥æ¾é¿åº¦æ¯ log(n)ï¼å¦æé¿åº¦ä¸º 8ï¼å¹³åæ¥æ¾é¿åº¦ä¸º log(8)=3ï¼é¾è¡¨ç平忥æ¾é¿åº¦ä¸º n/2ï¼å½é¿åº¦ä¸º 8 æ¶ï¼å¹³åæ¥æ¾é¿åº¦ä¸º 8/2=4ï¼è¿ææè½¬æ¢ææ çå¿
è¦ï¼é¾è¡¨é¿åº¦å¦ææ¯å°äºçäº 6ï¼6/2=3ï¼è log(6)=2.6ï¼è½ç¶é度ä¹å¾å¿«çï¼ä½è½¬å为æ ç»æåçææ çæ¶é´å¹¶ä¸ç
6. å½é¾è¡¨çå¼å°äº 6 åä¼ä»çº¢é»æ 转åé¾è¡¨
```java
// 彿¡¶(bucket)ä¸çç»ç¹æ°å°äºè¿ä¸ªå¼æ¶æ 转é¾è¡¨
static final int UNTREEIFY_THRESHOLD = 6;
```
7. å½ Map éé¢çæ°é**大äºçäº**è¿ä¸ªé弿¶ï¼è¡¨ä¸çæ¡¶æè½è¿è¡æ å½¢å ï¼å¦åæ¡¶å
å
ç´ è¶
è¿ 8 æ¶ä¼æ©å®¹ï¼è䏿¯æ å½¢åã为äºé¿å
è¿è¡æ©å®¹ãæ å½¢åéæ©çå²çªï¼è¿ä¸ªå¼ä¸è½å°äº 4 * TREEIFY_THRESHOLD (8)
```java
// æ¡¶ä¸ç»æè½¬åä¸ºçº¢é»æ 对åºçæ°ç»é¿åº¦æå°çå¼
static final int MIN_TREEIFY_CAPACITY = 64;
```
åå ï¼æ°ç»æ¯è¾å°çæ
åµä¸åä¸ºçº¢é»æ ç»æï¼åèä¼é使çï¼çº¢é»æ éè¦è¿è¡å·¦æï¼å³æï¼åè²è¿äºæä½æ¥ä¿æå¹³è¡¡
8. table ç¨æ¥åå§åï¼å¿
é¡»æ¯äºç n 次å¹ï¼
```java
// åå¨å
ç´ çæ°ç»
transient Node[] table;
```
9. HashMap ä¸**åæ¾å
ç´ ç个æ°**
```java
// åæ¾å
ç´ ç个æ°ï¼HashMapä¸K-Vç宿¶æ°éï¼ä¸æ¯tableæ°ç»çé¿åº¦
transient int size;
```
10. è®°å½ HashMap çä¿®æ¹æ¬¡æ°
```java
// æ¯æ¬¡æ©å®¹åæ´æ¹mapç»æç计æ°å¨
transient int modCount;
```
11. è°æ´å¤§å°ä¸ä¸ä¸ªå®¹éçå¼è®¡ç®æ¹å¼ä¸ºï¼å®¹é * è´è½½å åï¼å®¹éæ¯æ°ç»çé¿åº¦
```java
// 临çå¼ï¼å½å®é
大å°(容é*è´è½½å å)è¶
è¿ä¸´ç弿¶ï¼ä¼è¿è¡æ©å®¹
int threshold;
```
12. **åå¸è¡¨çå è½½å å**
```java
final float loadFactor;
```
* å è½½å åçæ¦è¿°
loadFactor å è½½å åï¼æ¯ç¨æ¥è¡¡é HashMap 满çç¨åº¦ï¼è¡¨ç¤º HashMap ççå¯ç¨åº¦ï¼å½±å hash æä½å°åä¸ä¸ªæ°ç»ä½ç½®çæ¦çï¼è®¡ç® HashMap ç宿¶å è½½å åçæ¹æ³ä¸º **size/capacity**ï¼è䏿¯å ç¨æ¡¶çæ°éå»é¤ä»¥ capacityï¼capacity æ¯æ¡¶çæ°éï¼ä¹å°±æ¯ table çé¿åº¦ length
å½ HashMap 容纳çå
ç´ å·²ç»è¾¾å°æ°ç»é¿åº¦ç 75% æ¶ï¼è¡¨ç¤º HashMap æ¥æ¤éè¦æ©å®¹ï¼èæ©å®¹è¿ä¸ªè¿ç¨æ¶åå° rehashãå¤å¶æ°æ®çæä½ï¼é常æ¶èæ§è½ï¼æä»¥å¼åä¸å°½éåå°æ©å®¹ç次æ°ï¼éè¿å建 HashMap éåå¯¹è±¡æ¶æå®åå§å®¹éæ¥é¿å
```java
HashMap(int initialCapacity, float loadFactor)//æé æå®åå§å®¹éåå è½½å åç空HashMap
```
* 为ä»ä¹å è½½å å设置为 0.75ï¼åå§å临ç弿¯ 12ï¼
loadFactor å¤ªå¤§å¯¼è´æ¥æ¾å
ç´ æçä½ï¼åæ¾çæ°æ®æ¥æ¤ï¼å¤ªå°å¯¼è´æ°ç»çå©ç¨çä½ï¼åæ¾çæ°æ®ä¼å¾åæ£ãloadFactor çé»è®¤å¼ä¸º **0.75f æ¯å®æ¹ç»åºçä¸ä¸ªæ¯è¾å¥½ç临çå¼**
* threshold 计ç®å
¬å¼ï¼capacityï¼æ°ç»é¿åº¦é»è®¤16ï¼ * loadFactorï¼é»è®¤ 0.75ï¼ãå½ size >= threshold çæ¶åï¼é£ä¹å°±è¦èè对æ°ç»ç resizeï¼æ©å®¹ï¼ï¼è¿å°±æ¯è¡¡éæ°ç»æ¯å¦éè¦æ©å¢çä¸ä¸ªæ åï¼ æ©å®¹åç HashMap 容鿝ä¹å容éç**两å**
***
##### æé æ¹æ³
* æé ä¸ä¸ªç©ºç HashMap ï¼**é»è®¤åå§å®¹éï¼16ï¼åé»è®¤è´è½½å åï¼0.75ï¼**
```java
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR;
// å°é»è®¤çå è½½å å0.75èµå¼ç»loadFactorï¼å¹¶æ²¡æå建æ°ç»
}
```
* æé ä¸ä¸ªå
·ææå®çåå§å®¹éåé»è®¤è´è½½å åï¼0.75ï¼HashMap
```java
// æå®â容é大å°âçæé 彿°
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
```
* æé ä¸ä¸ªå
·ææå®çåå§å®¹éåè´è½½å åç HashMap
```java
public HashMap(int initialCapacity, float loadFactor) {
// è¿è¡å¤æ
// å°æå®çå è½½å åèµå¼ç»HashMapæååéçè´è½½å åloadFactor
this.loadFactor = loadFactor;
// æåè°ç¨äºtableSizeFor
this.threshold = tableSizeFor(initialCapacity);
}
```
* å¯¹äº `this.threshold = tableSizeFor(initialCapacity)`
JDK8 以åçæé æ¹æ³ä¸ï¼å¹¶æ²¡æå¯¹ table è¿ä¸ªæååéè¿è¡åå§åï¼table çåå§å被æ¨è¿å°äº put æ¹æ³ä¸ï¼å¨ put æ¹æ³ä¸ä¼å¯¹ threshold éæ°è®¡ç®
* å
å«å¦ä¸ä¸ª `Map` çæé 彿°
```java
// æé ä¸ä¸ªæ å°å
³ç³»ä¸æå® Map ç¸åçæ° HashMap
public HashMap(Map extends K, ? extends V> m) {
// è´è½½å åloadFactorå为é»è®¤çè´è½½å å0.75
this.loadFactor = DEFAULT_LOAD_FACTOR;
putMapEntries(m, false);
}
```
putMapEntries æºç åæï¼
```java
final void putMapEntries(Map extends K, ? extends V> m, boolean evict) {
//è·ååæ°éåçé¿åº¦
int s = m.size();
if (s > 0) {
//夿忰éåçé¿åº¦æ¯å¦å¤§äº0
if (table == null) { // 夿tableæ¯å¦å·²ç»åå§å
// pre-size
// æªåå§åï¼s为mçå®é
å
ç´ ä¸ªæ°
float ft = ((float)s / loadFactor) + 1.0F;
int t = ((ft < (float)MAXIMUM_CAPACITY) ?
(int)ft : MAXIMUM_CAPACITY);
// 计ç®å¾å°çt大äºéå¼ï¼ååå§åéå¼
if (t > threshold)
threshold = tableSizeFor(t);
}
// å·²åå§åï¼å¹¶ä¸må
ç´ ä¸ªæ°å¤§äºéå¼ï¼è¿è¡æ©å®¹å¤ç
else if (s > threshold)
resize();
// å°mä¸çææå
ç´ æ·»å è³HashMapä¸
for (Map.Entry extends K, ? extends V> e : m.entrySet()) {
K key = e.getKey();
V value = e.getValue();
putVal(hash(key), key, value, false, evict);
}
}
}
```
`float ft = ((float)s / loadFactor) + 1.0F` è¿ä¸è¡ä»£ç ä¸ä¸ºä»ä¹è¦å 1.0F ï¼
s / loadFactor çç»ææ¯å°æ°ï¼å 1.0F ç¸å½äºæ¯å¯¹å°æ°åä¸ä¸ªåä¸åæ´ä»¥å°½å¯è½çä¿è¯æ´å¤§å®¹éï¼æ´å¤§ç容éè½å¤åå° resize çè°ç¨æ¬¡æ°ï¼è¿æ ·å¯ä»¥åå°æ°ç»çæ©å®¹
***
##### æåæ¹æ³
* hash()ï¼HashMap æ¯æ¯æ Key 为空çï¼HashTable æ¯ç´æ¥ç¨ Key æ¥è·å HashCodeï¼key ä¸ºç©ºä¼æå¼å¸¸
* &ï¼æä½ä¸è¿ç®ï¼ï¼ç¸åçäºè¿å¶æ°ä½ä¸ï¼é½æ¯ 1 çæ¶åï¼ç»æä¸º 1ï¼å¦å为é¶
* ^ï¼æä½å¼æè¿ç®ï¼ï¼ç¸åçäºè¿å¶æ°ä½ä¸ï¼æ°åç¸åï¼ç»æä¸º 0ï¼ä¸å为 1ï¼**ä¸è¿ä½å æ³**
0 1 ç¸äºå & | ^ è¿ç®ï¼ç»æåºç° 0 å 1 çæ°éå嫿¯ 3:1ã1:3ã1:1ï¼æä»¥å¼ææ¯æå¹³åç
```java
static final int hash(Object key) {
int h;
// 1ï¼å¦ækeyçäºnullï¼å¯ä»¥çå°å½keyçäºnullçæ¶å乿¯æåå¸å¼çï¼è¿åçæ¯0
// 2ï¼å¦ækeyä¸çäºnullï¼é¦å
计ç®åºkeyçhashCodeèµå¼ç»h,ç¶åä¸hæ 符å·å³ç§»16ä½åçäºè¿å¶è¿è¡æä½å¼æ
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
```
è®¡ç® hash çæ¹æ³ï¼å° hashCode æ 符å·å³ç§» 16 ä½ï¼é« 16bit åä½ 16bit åå¼æï¼æ°å¨è¿ç®
åå ï¼å½æ°ç»é¿åº¦å¾å°ï¼åè®¾æ¯ 16ï¼é£ä¹ n-1 å³ä¸º 1111 ï¼è¿æ ·çå¼å hashCode() ç´æ¥åæä½ä¸æä½ï¼å®é
ä¸åªä½¿ç¨äºåå¸å¼çå 4 ä½ã妿å½åå¸å¼çé«ä½ååå¾å¤§ï¼ä½ä½ååå¾å°ï¼å°±å¾å®¹æé æåå¸å²çªäºï¼æä»¥è¿é**æé«ä½ä½é½å©ç¨èµ·æ¥ï¼è®©é«16 ä½ä¹åä¸è¿ç®**ï¼ä»èè§£å³äºè¿ä¸ªé®é¢
åå¸å²çªçå¤çæ¹å¼ï¼
* 弿¾å®åæ³ï¼çº¿æ§æ¢æ¥æ³ï¼ThreadLocalMap 使ç¨ï¼ï¼å¹³æ¹æ¢æ¥æ³ï¼i + 1^2ãi - 1^2ãi + 2^2â¦â¦ï¼ãå鿣åï¼å¤ä¸ªåå¸å½æ°ï¼
* é¾å°åæ³ï¼æé¾æ³
* put()ï¼jdk1.8 åæ¯å¤´ææ³ (é¾å°åæ³)ï¼å¤çº¿ç¨ä¸æ©å®¹åºç°å¾ªç¯é¾è¡¨ï¼jdk1.8 以åå¼å
¥çº¢é»æ ï¼æå
¥æ¹æ³åæå°¾ææ³
ç¬¬ä¸æ¬¡è°ç¨ put æ¹æ³æ¶å建æ°ç» Node[] tableï¼å 为æ£å表èè´¹å
åï¼ä¸ºäºé²æ¢å
åæµªè´¹ï¼æä»¥**å»¶è¿åå§å**
å卿°æ®æ¥éª¤ï¼åå¨è¿ç¨ï¼ï¼
1. å
éè¿ hash å¼è®¡ç®åº key æ å°å°åªä¸ªæ¡¶ï¼åå¸å¯»å
2. å¦ææ¡¶ä¸æ²¡æç¢°æå²çªï¼åç´æ¥æå
¥
3. 妿åºç°ç¢°æå²çªï¼å¦æè¯¥æ¡¶ä½¿ç¨çº¢é»æ å¤çå²çªï¼åè°ç¨çº¢é»æ çæ¹æ³æå
¥æ°æ®ï¼å¦åéç¨ä¼ ç»çé¾å¼æ¹æ³æå
¥ï¼å¦æé¾çé¿åº¦è¾¾å°ä¸´çå¼ï¼åæé¾è½¬åä¸ºçº¢é»æ
4. 妿æ°ç»ä½ç½®ç¸åï¼éè¿ equals æ¯è¾å
容æ¯å¦ç¸åï¼ç¸ååæ°ç value è¦çæ§ valueï¼ä¸ç¸ååå°æ°çé®å¼å¯¹æ·»å å°åå¸è¡¨ä¸
5. æå夿 size æ¯å¦å¤§äºéå¼ thresholdï¼åè¿è¡æ©å®¹
```java
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
```
putVal() æ¹æ³ä¸ key å¨è¿éæ§è¡äºä¸ä¸ hash()ï¼å¨ putVal 彿°ä¸ä½¿ç¨å°äºä¸è¿° hash 彿°è®¡ç®çåå¸å¼ï¼
```java
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {
//ãããããããããããããã
if ((p = tab[i = (n - 1) & hash]) == null){//è¿éçn表示æ°ç»é¿åº¦16
//.....
} else {
if (e != null) { // existing mapping for key
V oldValue = e.value;
//onlyIfAbsenté»è®¤ä¸ºfalseï¼æä»¥å¯ä»¥è¦çå·²ç»åå¨çæ°æ®ï¼å¦æä¸ºtrue说æä¸è½è¦ç
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
// 妿è¿éå
许è¦çï¼å°±ç´æ¥è¿åäº
return oldValue;
}
}
// å¦ææ¯æ·»å æä½ï¼modCount ++ï¼å¦æä¸æ¯æ¿æ¢ï¼ä¸ä¼èµ°è¿éçé»è¾ï¼modCountç¨æ¥è®°å½é»è¾çåå
++modCount;
// æ°éå¤§äºæ©å®¹éå¼
if (++size > threshold)
resize();
afterNodeInsertion(evict);
return null;
}
```
* `(n - 1) & hash`ï¼è®¡ç®ä¸æ ä½ç½®
* 使°æ¬è´¨æ¯ä¸æå餿³ï¼æå©ä½çæ°åå»ï¼è¿ç®æçè¦æ¯ä½è¿ç®ä½
* treeifyBin()
èç¹æ·»å 宿ä¹åå¤ææ¤æ¶èç¹ä¸ªæ°æ¯å¦å¤§äº TREEIFY_THRESHOLD 临çå¼ 8ï¼å¦æå¤§äºåå°é¾è¡¨è½¬æ¢ä¸ºçº¢é»æ ï¼è½¬æ¢çº¢é»æ çæ¹æ³ treeifyBinï¼æ´ä½ä»£ç å¦ä¸ï¼
```java
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
//转æ¢ä¸ºçº¢é»æ tab表示æ°ç»å hash表示åå¸å¼
treeifyBin(tab, hash);
```
1. 妿å½åæ°ç»ä¸ºç©ºæè
æ°ç»çé¿åº¦å°äºè¿è¡æ å½¢åçé MIN_TREEIFY_CAPACITY = 64 就廿©å®¹ï¼è䏿¯å°èç¹åä¸ºçº¢é»æ
2. å¦ææ¯æ å½¢åéåæ¡¶ä¸çå
ç´ ï¼å建ç¸å个æ°çæ å½¢èç¹ï¼å¤å¶å
容ï¼å»ºç«èµ·èç³»ï¼ç±»ä¼¼ååé¾è¡¨è½¬æ¢ä¸ºååé¾è¡¨
3. 让桶ä¸ç第ä¸ä¸ªå
ç´ å³æ°ç»ä¸çå
ç´ æåæ°å»ºççº¢é»æ çèç¹ï¼ä»¥åè¿ä¸ªæ¡¶éçå
ç´ å°±æ¯çº¢é»æ è䏿¯é¾è¡¨æ°æ®ç»æäº
* tableSizeFor()ï¼å建 HashMap æå®å®¹éæ¶ï¼HashMap éè¿ä½ç§»è¿ç®åæè¿ç®å¾å°æ¯æå®åå§å容é大çæå°ç 2 ç n 次å¹
```java
static final int tableSizeFor(int cap) {//int cap = 10
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
```
åæç®æ³ï¼
1. `int n = cap - 1`ï¼é²æ¢ cap å·²ç»æ¯ 2 çå¹ã妿 cap å·²ç»æ¯ 2 çå¹ï¼ 䏿§è¡å 1 æä½ï¼åæ§è¡å®åé¢çæ 符å·å³ç§»æä½ä¹åï¼è¿åç capacity å°æ¯è¿ä¸ª cap ç 2 å
2. n=0 ï¼cap-1 ä¹åï¼ï¼åç»è¿åé¢çå æ¬¡æ 符å·å³ç§»ä¾ç¶æ¯ 0ï¼è¿åç capacity æ¯ 1ï¼æåæ n+1
3. |ï¼æä½æè¿ç®ï¼ï¼ç¸åçäºè¿å¶æ°ä½ä¸ï¼é½æ¯ 0 çæ¶åï¼ç»æä¸º 0ï¼å¦å为 1
4. æ ¸å¿ææ³ï¼**ææé«ä½æ¯ 1 çä½ä»¥åå³è¾¹çä½å
¨é¨ç½® 1**ï¼ç»æå 1 åå°±æ¯å¤§äºæå®å®¹éçæå°ç 2 ç n 次å¹
ä¾å¦åå§åçå¼ä¸º 10ï¼
* ç¬¬ä¸æ¬¡å³ç§»
```java
int n = cap - 1;//cap=10 n=9
n |= n >>> 1;
00000000 00000000 00000000 00001001 //9
00000000 00000000 00000000 00000100 //9å³ç§»ä¹åå为4
--------------------------------------------------
00000000 00000000 00000000 00001101 //æä½æä¹åæ¯13
//使å¾nçäºè¿å¶è¡¨ç¤ºä¸ä¸æé«ä½ç1ç´§é»çå³è¾¹ä¸ä½ä¸º1
```
* ç¬¬äºæ¬¡å³ç§»
```java
n |= n >>> 2;//néè¿ç¬¬ä¸æ¬¡å³ç§»å为äºï¼n=13
00000000 00000000 00000000 00001101 // 13
00000000 00000000 00000000 00000011 // 13å³ç§»ä¹åå为3
-------------------------------------------------
00000000 00000000 00000000 00001111 //æä½æä¹åæ¯15
//æ 符å·å³ç§»ä¸¤ä½ï¼ä¼å°æé«ä½ä¸¤ä¸ªè¿ç»ç1å³ç§»ä¸¤ä½ï¼ç¶ååä¸åæ¥çnåææä½ï¼è¿æ ·nçäºè¿å¶è¡¨ç¤ºçé«ä½ä¸ä¼æ4个è¿ç»ç1
```
注æï¼å®¹éæå¤§æ¯ 32bit çæ£æ°ï¼å æ¤æå `n |= n >>> 16`ï¼æå¤æ¯ 32 个 1ï¼ä½æ¯è¿å·²ç»æ¯è´æ°äºï¼ã卿§è¡ tableSizeFor ä¹åï¼å¯¹ initialCapacity åäºå¤æï¼å¦æå¤§äº MAXIMUM_CAPACITY(2 ^ 30)ï¼åå MAXIMUM_CAPACITYï¼å¦æå°äº MAXIMUM_CAPACITY(2 ^ 30)ï¼ä¼æ§è¡ç§»ä½æä½ï¼æä»¥ç§»ä½æä½ä¹åï¼æå¤§ 30 个 1ï¼å 1 ä¹åå¾ 2 ^ 30
* å¾å°ç capacity 被èµå¼ç»äº threshold
```java
this.threshold = tableSizeFor(initialCapacity);//initialCapacity=10
```
* JDK 11
```java
static final int tableSizeFor(int cap) {
//æ 符å·å³ç§»ï¼é«ä½è¡¥0
//-1è¡¥ç : 11111111 11111111 11111111 11111111
int n = -1 >>> Integer.numberOfLeadingZeros(cap - 1);
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
//è¿åæé«ä½ä¹åç0ç使°
public static int numberOfLeadingZeros(int i) {
if (i <= 0)
return i == 0 ? 32 : 0;
// 妿i>0ï¼é£ä¹å°±è¡¨æå¨äºè¿å¶è¡¨ç¤ºä¸å
¶è³å°æä¸ä½ä¸º1
int n = 31;
// içæé«ä½1å¨é«16ä½ï¼æiå³ç§»16ä½ï¼è®©æé«ä½1è¿å
¥ä½16ä½ç»§ç»éè¿å¤æ
if (i >= 1 << 16) { n -= 16; i >>>= 16; }
if (i >= 1 << 8) { n -= 8; i >>>= 8; }
if (i >= 1 << 4) { n -= 4; i >>>= 4; }
if (i >= 1 << 2) { n -= 2; i >>>= 2; }
return n - (i >>> 1);
}
```
* resize()ï¼
å½ HashMap ä¸ç**å
ç´ ä¸ªæ°**è¶
è¿ `(æ°ç»é¿åº¦)*loadFactor(è´è½½å å)` æè
é¾è¡¨è¿é¿æ¶ï¼é¾è¡¨é¿åº¦ > 8ï¼æ°ç»é¿åº¦ < 64ï¼ï¼å°±ä¼è¿è¡æ°ç»æ©å®¹ï¼å建æ°çæ°ç»ï¼ä¼´é䏿¬¡éæ° hash åé
ï¼å¹¶ä¸éå hash è¡¨ä¸ææçå
ç´ éå¸¸èæ¶ï¼æä»¥è¦å°½éé¿å
resize
æ©å®¹æºå¶ä¸ºæ©å®¹ä¸ºåæ¥å®¹éç 2 åï¼
```java
if (oldCap > 0) {
if (oldCap >= MAXIMUM_CAPACITY) {
// 以åç容éå·²ç»æ¯æå¤§å®¹éäºï¼è¿æ¶è°å¤§ æ©å®¹éå¼ threshold
threshold = Integer.MAX_VALUE;
return oldTab;
}
else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
oldCap >= DEFAULT_INITIAL_CAPACITY)
newThr = oldThr << 1; // double threshold
}
else if (oldThr > 0) // åå§åçthresholdèµå¼ç»newCap
newCap = oldThr;
else {
newCap = DEFAULT_INITIAL_CAPACITY;
newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
}
```
HashMap å¨è¿è¡æ©å®¹åï¼èç¹**è¦ä¹å°±å¨åæ¥çä½ç½®ï¼è¦ä¹å°±è¢«åé
å°"åä½ç½®+æ§å®¹é"çä½ç½®**
夿ï¼e.hash ä¸ oldCap 对åºçææé«ä½ä¸ç弿¯ 1ï¼å³å½åæ°ç»é¿åº¦ n äºè¿å¶ä¸º 1 çä½ä¸º x ä½ï¼å¦æ key çåå¸å¼ x ä½ä¹ä¸º 1ï¼åæ©å®¹åçç´¢å¼ä¸º now + n
注æï¼è¿éè¦æ±**æ°ç»é¿åº¦ 2 çå¹**

æ®éèç¹ï¼æææèç¹åæé«ä½ä½ä¸¤ä¸ªé¾è¡¨ï¼è½¬ç§»å°æ°ç»
```java
// éåææçèç¹
do {
next = e.next;
// oldCap æ§æ°ç»å¤§å°ï¼2 ç n 次å¹
if ((e.hash & oldCap) == 0) {
if (loTail == null)
loHead = e; //æåä½ä½é¾è¡¨å¤´èç¹
else
loTail.next = e;
loTail = e; //æåä½ä½é¾è¡¨å°¾èç¹
}
else {
if (hiTail == null)
hiHead = e;
else
hiTail.next = e;
hiTail = e;
}
} while ((e = next) != null);
if (loTail != null) {
loTail.next = null; // ä½ä½é¾è¡¨çæåä¸ä¸ªèç¹å¯è½å¨ååå¸è¡¨ä¸æåå
¶ä»èç¹ï¼éè¦æå¼
newTab[j] = loHead;
}
```
çº¢é»æ èç¹ï¼æ©å®¹æ¶ split æ¹æ³ä¼å°æ **ææé«ä½åä½ä½ä¸¤ä¸ªé¾è¡¨**ï¼å¤æé¿åº¦æ¯å¦å°äºçäº 6
```java
//妿ä½ä½é¾è¡¨é¦èç¹ä¸ä¸ºnullï¼è¯´ææè¿ä¸ªé¾è¡¨åå¨
if (loHead != null) {
//妿é¾è¡¨ä¸çå
ç´ å°äºçäº6
if (lc <= UNTREEIFY_THRESHOLD)
//é£å°±ä»çº¢é»æ 转é¾è¡¨äºï¼ä½ä½é¾è¡¨ï¼è¿ç§»å°æ°æ°ç»ä¸ä¸æ ä¸åï¼è¿æ¯çäºåæ°ç»å°ä¸æ
tab[index] = loHead.untreeify(map);
else {
//ä½ä½é¾è¡¨ï¼è¿ç§»å°æ°æ°ç»ä¸ä¸æ ä¸åï¼æä½ä½é¾è¡¨æ´ä¸ªèµå¼å°è¿ä¸ªä¸æ ä¸
tab[index] = loHead;
//妿é«ä½é¦èç¹ä¸ä¸ºç©ºï¼è¯´æåæ¥ççº¢é»æ å·²ç»è¢«æåæä¸¤ä¸ªé¾è¡¨äº
if (hiHead != null)
//éè¦æå»ºæ°ççº¢é»æ äº
loHead.treeify(tab);
}
}
```
â
* remove()ï¼å 餿¯é¦å
å
æ¾å°å
ç´ çä½ç½®ï¼å¦ææ¯é¾è¡¨å°±éåé¾è¡¨æ¾å°å
ç´ ä¹åå é¤ã妿æ¯ç¨çº¢é»æ å°±éåæ ç¶åæ¾å°ä¹ååå é¤ï¼æ å°äº 6 çæ¶åéå为é¾è¡¨
```java
final Node removeNode(int hash, Object key, Object value,
boolean matchValue, boolean movable) {
Node[] tab; Node p; int n, index;
// èç¹æ°ç»tabä¸ä¸ºç©ºãæ°ç»é¿åº¦n大äº0ãæ ¹æ®hashå®ä½å°çèç¹å¯¹è±¡pï¼
// 该èç¹ä¸ºæ çæ ¹èç¹æé¾è¡¨çé¦èç¹ï¼ä¸ä¸ºç©ºï¼ä»è¯¥èç¹påä¸éåï¼æ¾å°é£ä¸ªåkeyå¹é
çèç¹å¯¹è±¡
if ((tab = table) != null && (n = tab.length) > 0 &&
(p = tab[index = (n - 1) & hash]) != null) {
Node node = null, e; K k; V v;//临æ¶åéï¼å¨åè¦è¿åçèç¹ä¿¡æ¯
//keyåvalueé½ç¸çï¼ç´æ¥è¿å该èç¹
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
node = p;
else if ((e = p.next) != null) {
//å¦ææ¯æ èç¹ï¼è°ç¨getTreeNodeæ¹æ³ä»æ ç»æä¸æ¥æ¾æ»¡è¶³æ¡ä»¶çèç¹
if (p instanceof TreeNode)
node = ((TreeNode)p).getTreeNode(hash, key);
//éåé¾è¡¨
else {
do {
//eèç¹ç鮿¯å¦åkeyç¸çï¼eèç¹å°±æ¯è¦å é¤çèç¹ï¼èµå¼ç»nodeåé
if (e.hash == hash &&
((k = e.key) == key ||
(key != null && key.equals(k)))) {
node = e;
//è·³åºå¾ªç¯
break;
}
p = e;//æå½åèç¹pæåe ç»§ç»éå
} while ((e = e.next) != null);
}
}
//妿nodeä¸ä¸ºç©ºï¼è¯´ææ ¹æ®keyå¹é
å°äºè¦å é¤çèç¹
//妿ä¸éè¦å¯¹æ¯value弿è
对æ¯valueå¼ä½æ¯valueå¼ä¹ç¸çï¼å¯ä»¥ç´æ¥å é¤
if (node != null && (!matchValue || (v = node.value) == value ||
(value != null && value.equals(v)))) {
if (node instanceof TreeNode)
((TreeNode)node).removeTreeNode(this, tab, movable);
else if (node == p)//nodeæ¯é¦èç¹
tab[index] = node.next;
else //node䏿¯é¦èç¹
p.next = node.next;
++modCount;
--size;
//LinkedHashMap
afterNodeRemoval(node);
return node;
}
}
return null;
}
```
* get()
1. éè¿ hash å¼è·å该 key æ å°å°çæ¡¶
2. æ¡¶ä¸ç key å°±æ¯è¦æ¥æ¾ç keyï¼åç´æ¥æ¾å°å¹¶è¿å
3. æ¡¶ä¸ç key 䏿¯è¦æ¾ç keyï¼åæ¥çåç»çèç¹ï¼
* 妿åç»èç¹æ¯çº¢é»æ èç¹ï¼éè¿è°ç¨çº¢é»æ çæ¹æ³æ ¹æ® key è·å value
* 妿åç»èç¹æ¯é¾è¡¨èç¹ï¼åéè¿å¾ªç¯éåé¾è¡¨æ ¹æ® key è·å value
4. çº¢é»æ èç¹è°ç¨çæ¯ getTreeNode æ¹æ³éè¿æ å½¢èç¹ç find æ¹æ³è¿è¡æ¥
* æ¥æ¾çº¢é»æ ï¼ä¹åæ·»å æ¶å·²ç»ä¿è¯è¿ä¸ªæ æ¯æåºçï¼å æ¤æ¥æ¾æ¶å°±æ¯æåæ¥æ¾ï¼æçæ´é«ã
* è¿éåæå
¥æ¶ä¸æ ·ï¼å¦æå¯¹æ¯èç¹çåå¸å¼ç¸çå¹¶ä¸éè¿ equals 夿å¼ä¹ç¸çï¼å°±ä¼å¤æ key ç¸çï¼ç´æ¥è¿åï¼ä¸ç¸çå°±ä»åæ ä¸é彿¥æ¾
5. æ¶é´å¤æåº¦ O(1)
* è¥ä¸ºæ ï¼å卿 ä¸éè¿ key.equals(k) æ¥æ¾ï¼**O(logn)**
* è¥ä¸ºé¾è¡¨ï¼åå¨é¾è¡¨ä¸éè¿ key.equals(k) æ¥æ¾ï¼**O(n)**
****
##### å¹¶åå¼å¸¸
HashMap å ArrayList 䏿 ·ï¼å
é¨éç¨ modCount ç¨æ¥è®°å½éåç»æåçååçæ¬¡æ°ï¼ç»æåçååæ¯ææ·»å æè
å é¤è³å°ä¸ä¸ªå
ç´ çæææä½ï¼æè
æ¯è°æ´å
鍿°ç»ç大å°ï¼ä»
ä»
åªæ¯è®¾ç½®å
ç´ çå¼ä¸ç®ç»æåçåå
å¨è¿è¡åºååæè
è¿ä»£çæä½æ¶ï¼éè¦æ¯è¾æä½åå modCount æ¯å¦æ¹åï¼å¦æ**å
¶ä»çº¿ç¨æ¤æ¶ä¿®æ¹äºéåå
é¨çç»æ**ï¼å°±ä¼ç´æ¥æåº ConcurrentModificationException å¼å¸¸
```java
HashMap map = new HashMap();
Iterator iterator = map.keySet().iterator();
```
```java
final class KeySet extends AbstractSet {
// åºå±è·åçæ¯ KeyIterator
public final Iterator iterator() {
return new KeyIterator();
}
}
final class KeyIterator extends HashIterator implements Iterator {
// åè° HashMap.HashIterator#nextNode
public final K next() {
return nextNode().key;
}
}
```
```java
abstract class HashIterator {
Node next; // next entry to return
Node current; // current entry
int expectedModCount; // for ãfast-failãï¼å¿«é失败
int index; // current slot
HashIterator() {
// æå½å map çæ°éèµå¼ç» expectedModCountï¼è¿ä»£æ¶å¤æ
expectedModCount = modCount;
Node[] t = table;
current = next = null;
index = 0;
if (t != null && size > 0) { // advance to first entry
do {} while (index < t.length && (next = t[index++]) == null);
}
}
public final boolean hasNext() {
return next != null;
}
// iterator.next() ä¼è°ç¨è¿ä¸ªå½æ°
final Node nextNode() {
Node[] t;
Node e = next;
// è¿éä¼å¤æ éåçç»ææ¯å¦åçäºååï¼ååå modCount 伿¹åï¼ç´æ¥æåºå¹¶åå¼å¸¸
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
if (e == null)
throw new NoSuchElementException();
if ((next = (current = e).next) == null && (t = table) != null) {
do {} while (index < t.length && (next = t[index++]) == null);
}
return e;
}
// è¿ä»£å¨å
许å é¤éåçå
ç´ ï¼ãå é¤åä¼éç½® expectedModCount = modCountã
public final void remove() {
Node p = current;
if (p == null)
throw new IllegalStateException();
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
current = null;
K key = p.key;
removeNode(hash(key), key, null, false, false);
// 忥expectedModCount
expectedModCount = modCount;
}
}
```
***
#### LinkedMap
##### åçåæ
LinkedHashMap æ¯ HashMap çåç±»
* ä¼ç¹ï¼æ·»å çå
ç´ æç
§é®æåºä¸éå¤çï¼æåºçåå æ¯åºå±ç»´æ¤äºä¸ä¸ªååé¾è¡¨
* 缺ç¹ï¼ä¼å ç¨ä¸äºå
å空é´
å¯¹æ¯ Setï¼
* HashSet éåç¸å½äºæ¯ HashMap éåçé®ï¼ä¸å¸¦å¼
* LinkedHashSet éåç¸å½äºæ¯ LinkedHashMap éåçé®ï¼ä¸å¸¦å¼
* åºå±åçå®å
¨ä¸æ ·ï¼é½æ¯åºäºåå¸è¡¨æç
§é®å卿°æ®çï¼åªæ¯ Map å¤äºä¸ä¸ªé®çå¼
æºç è§£æï¼
* **å
é¨ç»´æ¤äºä¸ä¸ªååé¾è¡¨**ï¼ç¨æ¥ç»´æ¤æå
¥é¡ºåºæè
LRU 顺åº
```java
transient LinkedHashMap.Entry head;
transient LinkedHashMap.Entry tail;
```
* accessOrder å³å®äºé¡ºåºï¼é»è®¤ä¸º false ç»´æ¤çæ¯æå
¥é¡ºåºï¼å
è¿å
åºï¼ï¼true 为访é®é¡ºåºï¼**LRU 顺åº**ï¼
```java
final boolean accessOrder;
```
* ç»´æ¤é¡ºåºç彿°
```java
void afterNodeAccess(Node p) {}
void afterNodeInsertion(boolean evict) {}
```
* put()
```java
// è°ç¨ç¶ç±»HashMapçputæ¹æ³
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict)
â afterNodeInsertion(evict);// evict为true
```
afterNodeInsertionæ¹æ³ï¼å½ removeEldestEntry() æ¹æ³è¿å true æ¶ä¼ç§»é¤æè¿æä¹
æªä½¿ç¨çèç¹ï¼ä¹å°±æ¯é¾è¡¨é¦é¨èç¹ first
```java
void afterNodeInsertion(boolean evict) {
LinkedHashMap.Entry first;
// evict åªæå¨æå»º Map çæ¶åæä¸º falseï¼è¿é为 true
if (evict && (first = head) != null && removeEldestEntry(first)) {
K key = first.key;
removeNode(hash(key), key, null, false, true);//ç§»é¤å¤´èç¹
}
}
```
removeEldestEntry() é»è®¤ä¸º falseï¼å¦æéè¦è®©å®ä¸º trueï¼éè¦ç»§æ¿ LinkedHashMap å¹¶ä¸è¦çè¿ä¸ªæ¹æ³çå®ç°ï¼å¨å®ç° LRU çç¼åä¸ç¹å«æç¨ï¼éè¿ç§»é¤æè¿æä¹
æªä½¿ç¨çèç¹ï¼ä»èä¿è¯ç¼å空é´è¶³å¤ï¼å¹¶ä¸ç¼åçæ°æ®é½æ¯çç¹æ°æ®
```java
protected boolean removeEldestEntry(Map.Entry eldest) {
return false;
}
```
* get()
å½ä¸ä¸ªèç¹è¢«è®¿é®æ¶ï¼å¦æ accessOrder 为 trueï¼åä¼å°è¯¥èç¹ç§»å°é¾è¡¨å°¾é¨ãä¹å°±æ¯è¯´æå®ä¸º LRU 顺åºä¹åï¼å¨æ¯æ¬¡è®¿é®ä¸ä¸ªèç¹æ¶ä¼å°è¿ä¸ªèç¹ç§»å°é¾è¡¨å°¾é¨ï¼é£ä¹é¾è¡¨é¦é¨å°±æ¯æè¿æä¹
æªä½¿ç¨çèç¹
```java
public V get(Object key) {
Node e;
if ((e = getNode(hash(key), key)) == null)
return null;
if (accessOrder)
afterNodeAccess(e);
return e.value;
}
```
```java
void afterNodeAccess(Node e) {
LinkedHashMap.Entry last;
if (accessOrder && (last = tail) != e) {
// åä¸è½¬å
LinkedHashMap.Entry p =
(LinkedHashMap.Entry)e, b = p.before, a = p.after;
p.after = null;
// 夿 p æ¯å¦æ¯é¦èç¹
if (b == null)
//æ¯å¤´èç¹ è®©påç»§èç¹æä¸ºå¤´èç¹
head = a;
else
//䏿¯å¤´èç¹ è®©pçå驱èç¹çnextæåpçåç»§èç¹ï¼ç»´æ¤é¾è¡¨çè¿æ¥
b.after = a;
// 夿pæ¯å¦æ¯å°¾èç¹
if (a != null)
// 䏿¯å°¾èç¹ è®©påç»§èç¹æåpçå驱èç¹
a.before = b;
else
// æ¯å°¾èç¹ è®©lastæåpçå驱èç¹
last = b;
// 夿lastæ¯å¦æ¯ç©º
if (last == null)
// last为空说æpæ¯å°¾èç¹æè
åªæpä¸ä¸ªèç¹
head = p;
else {
// laståpç¸äºè¿æ¥
p.before = last;
last.after = p;
}
tail = p;
++modCount;
}
}
```
* remove()
```java
//è°ç¨HashMapçremoveæ¹æ³
final Node removeNode(int hash, Object key, Object value,boolean matchValue, boolean movable)
â afterNodeRemoval(node);
```
å½ HashMap å é¤ä¸ä¸ªé®å¼å¯¹æ¶è°ç¨ï¼ä¼æå¨ HashMap ä¸å é¤çé£ä¸ªé®å¼å¯¹ä¸å¹¶ä»é¾è¡¨ä¸å é¤
```java
void afterNodeRemoval(Node e) {
LinkedHashMap.Entry p =
(LinkedHashMap.Entry)e, b = p.before, a = p.after;
// 让pèç¹ä¸å驱èç¹ååç»§èç¹æå¼é¾æ¥
p.before = p.after = null;
// 夿pæ¯å¦æ¯å¤´èç¹
if (b == null)
// pæ¯å¤´èç¹ è®©headæåpçåç»§èç¹
head = a;
else
// p䏿¯å¤´èç¹ è®©pçå驱èç¹çnextæåpçåç»§èç¹ï¼ç»´æ¤é¾è¡¨çè¿æ¥
b.after = a;
// 夿pæ¯å¦æ¯å°¾èç¹ï¼æ¯å°±è®©tailæåpçå驱èç¹ï¼ä¸æ¯å°±è®©p.afteræåå驱èç¹ï¼åå
if (a == null)
tail = b;
else
a.before = b;
}
```
***
##### LRU
ä½¿ç¨ LinkedHashMap å®ç°çä¸ä¸ª LRU ç¼åï¼
- è®¾å®æå¤§ç¼åç©ºé´ MAX_ENTRIES 为 3
- ä½¿ç¨ LinkedHashMap çæé 彿°å° accessOrder 设置为 trueï¼å¼å¯ LRU 顺åº
- è¦ç removeEldestEntry() æ¹æ³å®ç°ï¼å¨èç¹å¤äº MAX_ENTRIES å°±ä¼å°æè¿æä¹
æªä½¿ç¨çæ°æ®ç§»é¤
```java
public static void main(String[] args) {
LRUCache cache = new LRUCache<>();
cache.put(1, "a");
cache.put(2, "b");
cache.put(3, "c");
cache.get(1);//æ1æ¾å
¥å°¾é¨
cache.put(4, "d");
System.out.println(cache.keySet());//[3, 1, 4]åªè½å3个ï¼ç§»é¤2
}
class LRUCache extends LinkedHashMap {
private static final int MAX_ENTRIES = 3;
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > MAX_ENTRIES;
}
LRUCache() {
super(MAX_ENTRIES, 0.75f, true);
}
}
```
***
#### TreeMap
TreeMap å®ç°äº SotredMap æ¥å£ï¼æ¯æåºä¸å¯éå¤çé®å¼å¯¹éåï¼åºäºçº¢é»æ ï¼Red-Black treeï¼å®ç°ï¼æ¯ä¸ª key-value é½ä½ä¸ºä¸ä¸ªçº¢é»æ çèç¹ï¼å¦ææé TreeMap 没ææå®æ¯è¾å¨ï¼åæ ¹æ® key æ§è¡èªç¶æåºï¼é»è®¤ååºï¼ï¼å¦ææå®äºæ¯è¾å¨åæç
§æ¯è¾å¨æ¥è¿è¡æåº
TreeMap éåæå®å¤§å°è§åæ 2 ç§æ¹å¼ï¼
* ç´æ¥ä¸ºå¯¹è±¡çç±»å®ç°æ¯è¾å¨è§åæ¥å£ Comparableï¼éåæ¯è¾æ¹æ³
* ç´æ¥ä¸ºéå设置æ¯è¾å¨ Comparator 对象ï¼éåæ¯è¾æ¹æ³
说æï¼TreeSet éåçåºå±æ¯åºäº TreeMapï¼åªæ¯é®çéå±å¼ä¸ºç©ºå¯¹è±¡èå·²
æå屿§ï¼
* Entry èç¹
```java
static final class Entry implements Map.Entry {
K key;
V value;
Entry left; //å·¦å©åèç¹
Entry right; //å³å©åèç¹
Entry parent; //ç¶èç¹
boolean color = BLACK; //èç¹çé¢è²ï¼å¨çº¢é»æ ä¸åªæä¸¤ç§é¢è²ï¼çº¢è²åé»è²
}
```
* compare()
```java
//妿comparator为nullï¼éç¨comparable.compartToè¿è¡æ¯è¾ï¼å¦åéç¨æå®æ¯è¾å¨æ¯è¾å¤§å°
final int compare(Object k1, Object k2) {
return comparator == null ? ((Comparable super K>)k1).compareTo((K)k2)
: comparator.compare((K)k1, (K)k2);
}
```
åèæç« ï¼https://blog.csdn.net/weixin_33991727/article/details/91518677
***
#### WeakMap
WeakHashMap æ¯åºäºå¼±å¼ç¨çï¼å
é¨ç Entry ç»§æ¿ WeakReferenceï¼è¢«å¼±å¼ç¨å
³èç对象å¨**ä¸ä¸æ¬¡åå¾åæ¶æ¶ä¼è¢«åæ¶**ï¼å¹¶ä¸æé æ¹æ³ä¼ å
¥å¼ç¨éåï¼ç¨æ¥å¨æ¸
çå¯¹è±¡å®æä»¥åæ¸
çå¼ç¨
```java
private static class Entry extends WeakReference