(PSï¼æ«æ[é¦é¡µéé¢çäºç»´ç ](README.md)è¿ç¾¤ï¼å享æèªå·±å¨ççææ¯èµæç»å¤§å®¶ï¼å¸æå大家ä¸èµ·å¦ä¹ è¿æ¥ï¼)
ä¸é¢æ¯ä¸»è¦æ¯èªå·±çäºãç¯çJava讲ä¹ãåï¼å¦ä¹ å°ä¸äºä¹åæ²¡ææ¡çææ¯ç¹ï¼åçè§£çï¼ä¹åä¼ç»§ç»æ´æ°åå®åã
#### [1.Javaä¸ç夿æ¯ä»ä¹ï¼](#Javaä¸ç夿æ¯ä»ä¹ï¼)
#### [2.Javaä¸åéï¼ä»£ç åï¼æé å¨ä¹é´æ§è¡é¡ºåºæ¯æä¹æ ·çï¼](#javaä¸åéï¼ä»£ç åï¼æé å¨ä¹é´æ§è¡é¡ºåºæ¯æä¹æ ·çï¼)
#### [3.finalå
³é®åæåªäºä½ç¨ï¼](#finalå
³é®åæåªäºä½ç¨ï¼)
#### [4.Integerç±»ä¼è¿è¡ç¼ååï¼](#Integerç±»ä¼è¿è¡ç¼ååï¼)
#### [5.æ½è±¡ç±»æåªäºç¹ç¹ï¼](#æ½è±¡ç±»æåªäºç¹ç¹ï¼)
#### [6.Stringï¼StringBufferåStringBuilderä¹é´çåºå«æ¯ä»ä¹ï¼](#Stringï¼StringBufferåStringBuilderä¹é´çåºå«æ¯ä»ä¹ï¼)
#### [7.ç¼è¯åç¼ç¨è¯è¨ï¼è§£éåç¼ç¨è¯è¨ï¼ä¼ªç¼è¯åè¯è¨çåºå«æ¯ä»ä¹ï¼](#ç¼è¯åç¼ç¨è¯è¨ï¼è§£éåç¼ç¨è¯è¨ï¼ä¼ªç¼è¯åè¯è¨çåºå«æ¯ä»ä¹ï¼)
#### [8.Javaä¸çè®¿é®æ§å¶ç¬¦æåªäºï¼](#Javaä¸çè®¿é®æ§å¶ç¬¦æåªäºï¼)
#### [9.Javaçæé 卿åªäºç¹ç¹ï¼](#Javaçæé 卿åªäºç¹ç¹ï¼)
#### [10.Javaä¸çå
é¨ç±»æ¯æä¹æ ·çï¼](#Javaä¸çå
é¨ç±»æ¯æä¹æ ·çï¼)
#### [11.Javaä¸ç注解æ¯ä»ä¹ï¼](#Javaä¸ç注解æ¯ä»ä¹)
#### [12.为ä»ä¹hashCode()åequal()æ¹æ³è¦ä¸èµ·éåï¼](#为ä»ä¹hashCode()åequal()æ¹æ³è¦ä¸èµ·éåï¼)
#### [13.Java䏿åªäºæ°æ®ç±»åï¼](#Java䏿åªäºæ°æ®ç±»åï¼)
#### [14.å
è£
ç±»åååºæ¬ç±»åçåºå«æ¯ä»ä¹ï¼](#å
è£
ç±»åååºæ¬ç±»åçåºå«æ¯ä»ä¹ï¼)
### Javaä¸ç夿æ¯ä»ä¹ï¼
**夿**æçæ¯ç¸åç±»åçåéå¨è°ç¨åä¸ä¸ªæ¹æ³æ¶åç°åºå¤ç§**ä¸åçè¡ä¸ºç¹å¾**ãèé æè¿ä¸ç°è±¡çåå å¨äºJavaä¸çåéæä¸¤ä¸ªç±»åï¼
* ç¼è¯æ¶ç±»åï¼ç±å£°æåéæ¶çç±»åå³å®ã
* è¿è¡æ¶ç±»åï¼ç±å®é
èµå¼ç»åéç对象çç±»åå³å®ï¼
å½ä¸ä¸ªåéç两个类åä¸ä¸è´ï¼å°±ä¼åºç°å¤æã
```java
//BaseClassæ¯SubClassçç¶ç±»
BaseClass a = new BaseClass();
BaseClass b = new SubClass();
a.baseMethod()//åéaè°ç¨baseMethod()æ¹æ³ï¼å®é
ä¸ä¼è°ç¨BaseClassçbaseMethod()æ¹æ³,伿å°111
b.baseMethod()//åébè°ç¨baseMethodæ¹æ³ï¼å®é
ä¸ä¼è°ç¨SubClassçéåbaseMethod()æ¹æ³ï¼ä¼æå°222
Class BaseClass {
void baseMethod() {
System.out.println("111");
}
}
Class SubClass {
void baseMethod() {
System.out.println("222");
}
}
è¾åºç»æï¼
111
222
```
ä¾å¦è¿ä¸ªä¾åä¸ï¼
##### 对äºåéaèè¨
aç**ç¼è¯ç±»åæ¯BaseClass**ï¼**å®é
ç±»å乿¯BaseClass**ï¼æä»¥è°ç¨baseMethod()伿§è¡BaseClass#baseMethod()æ¹æ³ï¼æå°åº111ã
##### 对äºåébèè¨
bçç**ç¼è¯ç±»åæ¯BaseClass**ï¼ä½æ¯å®é
èµå¼æ¶ï¼ç»åébèµå¼çæ¯SubClasså¯¹è±¡ï¼æä»¥bç**å®é
ç±»åæ¯SubClass**ãèSubClasséåäºç¶ç±»BaseClass#baseMethod()æ¹æ³ï¼æä»¥è°ç¨baseMethod()æ¹æ³ä¼è°ç¨SubClass#baseMethod()ï¼ä»èæå°åº222ã
aåbçç¼è¯ç±»åç¸åï¼å´å±ç°åºäºä¸åçè¡ä¸ºç¹å¾ï¼è¿å°±æ¯å¤æã
ï¼PSï¼å¦æç´æ¥å¯¹bè°ç¨åªæSubClassæçæ¹æ³ï¼ç¼è¯æ¶ä¼æ¥éï¼ä½æ¯å¯ä»¥éè¿åå°è¿è¡è°ç¨ãï¼
### Javaä¸åéï¼ä»£ç åï¼æé å¨ä¹é´æ§è¡é¡ºåºæ¯æä¹æ ·çï¼
Javaç¨åºä¸ç±»ä¸ä¸ªå
ç´ çåå§å顺åº
åå§åçå忝ï¼
* å
åå§å**éæ**é¨åï¼ååå§å**卿**é¨åï¼
* å
åå§å**ç¶ç±»**é¨åï¼ååå§å**åç±»**é¨åï¼
* å
åå§å**åé**ï¼ååå§å**代ç å**å**æé å¨**ã
æä»¥ä¾ç
§è¿ä¸ªè§åå¯ä»¥å¾åºæ»ä½é¡ºåºæ¯ï¼
1.ç¶ç±»çéææååéï¼å¦ææ¯ç¬¬ä¸æ¬¡å 载类ï¼
2.ç¶ç±»çéæä»£ç åï¼å¦ææ¯ç¬¬ä¸æ¬¡å 载类ï¼
3.åç±»çéææååéï¼å¦ææ¯ç¬¬ä¸æ¬¡å 载类ï¼
4.åç±»çéæä»£ç åï¼å¦ææ¯ç¬¬ä¸æ¬¡å 载类ï¼
5.ç¶ç±»çæ®éæååé
6.ç¶ç±»ç卿代ç å
7.ç¶ç±»çæé 卿¹æ³
8.åç±»çæ®éæååé
9.åç±»ç卿代ç å
10.åç±»çæé 卿¹æ³
ä¸é¢åäºä¸ä¸ªDemoè¿è¡éªè¯:
```java
public class Base {
static Instance staticInstance = new Instance("1---Baseç±»çéææååéstaticInstance");
static {
System.out.println("2---Baseç±»çéæä»£ç åæ§è¡äº");
}
Instance instance = new Instance("5---Baseç±»çæ®éæååéinstance");
{
System.out.println("6---Baseç±»ç卿代ç åæ§è¡äº");
}
Base() {
System.out.println("7---Baseç±»çæé 卿¹æ³æ§è¡äº");
}
}
public class Child extends Base {
static Instance staticInstance = new Instance("3---Childç±»çéææååéstaticInstance");
static {
System.out.println("4---Childç±»çéæä»£ç åæ§è¡äº");
}
Instance instance = new Instance("8---Childç±»çæ®éæååéinstance");
{
System.out.println("9----Childç±»ç卿代ç åæ§è¡äº");
}
Child() {
System.out.println("10---Childç±»çæé 卿¹æ³æ§è¡äº");
}
public static void main(String[] args) {
Child child = new Child();
}
}
```
è¾åºç»æå¦ä¸ï¼
```
1---Baseç±»çéææååéstaticInstanceè¿è¡äºåå§å
2---Baseç±»çéæä»£ç åæ§è¡äº
3---Childç±»çéææååéstaticInstanceè¿è¡äºåå§å
4---Childç±»çéæä»£ç åæ§è¡äº
5---Baseç±»çæ®éæååéinstanceè¿è¡äºåå§å
6---Baseç±»ç卿代ç åæ§è¡äº
7---Baseç±»çæé 卿¹æ³æ§è¡äº
8---Childç±»çæ®éæååéinstanceè¿è¡äºåå§å
9----Childç±»ç卿代ç åæ§è¡äº
10---Childç±»çæé 卿¹æ³æ§è¡äº
```
说æç¡®å®æ¯æç
§ä¸é¢çæ§è¡é¡ºåºæ§è¡çã
### finalå
³é®åæåªäºä½ç¨ï¼
##### 修饰类
final修饰类æ¶ï¼ç±»ä¸è½è¢«ç»§æ¿ï¼å¹¶ä¸ç±»ä¸çæææ¹æ³é½è¢«éå¼å°ä½¿ç¨final修饰ã
##### ä¿®é¥°æ¹æ³
finalä¿®é¥°æ¹æ³æ¶ï¼æä¸¤ä¸ªä½ç¨ï¼
* æ¹æ³ä¸è½è¢«åç±»éåã
* å¯ä»¥è®©æ¹æ³è½¬æ¢ä¸ºå
èè°ç¨ï¼æåæçãï¼æ©æçJavaçæ¬æ¯è¿æ ·ï¼æè¿ççæ¬å·²ç»æ²¡æè¿äºä¼åäºï¼å ä¸ºå¦ææ¹æ³è¿å¤§æ¶ï¼å
åµè°ç¨æ æ³å¸¦æ¥æ§è½æåãï¼
* 修饰åé
final修饰çåé䏿¦åå§åï¼å°±ä¸è½è¢«ä¿®æ¹ãå½final修饰å®ä¾åéæ¶ï¼å¯ä»¥å¨å¨å®ä¹åéæ¶èµåå¼ï¼ä¹å¯ä»¥å¨å®ä¹æ¶ä¸èµå¼ï¼å¨å¨æä»£ç åï¼ææé å¨ä¸èµåå¼ãï¼åªè½èµå¼ä¸æ¬¡ï¼ã
妿finalåéå¨å£°ææ¶å°±æå®äºåå§å¼ï¼å¹¶ä¸å¨ç¼è¯æ¶å¯ä»¥ç¡®å®ä¸æ¥ï¼é£ä¹å¨ç¼è¯æ¶ï¼finalåéæ¬è´¨ä¸ä¼åæä¸ä¸ªå®åéï¼ææç¨å°è¯¥åéçå°æ¹é½ç´æ¥æ¿æ¢æè¯¥åéçå¼ã
### Integerç±»ä¼è¿è¡ç¼ååï¼
```java
Intger a = new Integer(127);
Intger b = Interger.valueOf(127);
Intger c = Interger.valueOf(127);
Intger d = Interger.valueOf(128);
Intger e = Interger.valueOf(128);
System.out.println(a == b); //è¾åºfalse
System.out.println(b == c); //è¾åºtrue
System.out.println(d == e); //è¾åºfalse
```
ä¸é¢è¿ç§ä¾åçåå æ¯å¦æ
* éè¿new Interger()å建Intergerå¯¹è±¡ï¼æ¯æ¬¡è¿åå
¨æ°çInteger对象
* éè¿Interger.valueOf()å建Interger对象ï¼å¦æå¼å¨-128å°127ä¹é´ï¼ä¼è¿åç¼åç对象(åå§åæ¶)ã
##### å®ç°åç
Integerç±»ä¸æä¸ä¸ªéæå
é¨ç±»IntegerCachï¼å¨å è½½Integerç±»æ¶ä¼åæ¶å è½½IntegerCacheç±»ï¼IntegerCacheç±»çéæä»£ç åä¸ä¼å建å¼ä¸º-128å°127çInteger对象ï¼ç¼åå°cacheæ°ç»ä¸ï¼ä¹åè°ç¨Integer#valueOfæ¹æ³æ¶ï¼å¤æä½¿ç¨æç¼åçIntegerå¯¹è±¡ï¼æåè¿åï¼æ åè°ç¨new Integer()å建ã
PSï¼ï¼127æ¯é»è®¤çè¾¹çå¼ï¼ä¹å¯ä»¥éè¿è®¾ç½®JVMåæ°java.lang.Integer.IntegerCache.highæ¥è¿è¡èªå®ä¹ãï¼
```java
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
//cacheæ¯ä¸ä¸ªIntegeræ°ç»ï¼ç¼åäº-128å°127çInteger对象
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
//IntegerCacheæ¯Integerç±»ä¸çéæå
é¨ç±»ï¼Integerç±»å¨å è½½æ¶ä¼åæ¶å è½½IntegerCacheç±»ï¼IntegerCacheç±»çéæä»£ç åä¸ä¼
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// 127æ¯é»è®¤çè¾¹çå¼ï¼ä¹å¯ä»¥éè¿è®¾ç½®JVMåæ°java.lang.Integer.IntegerCache.highæ¥è¿è¡èªå®ä¹ã
int h = 127;
String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// cacheæ°ç»çé¿åº¦ä¸è½è¶
è¿Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// highå¼å¿
须大äºçäº127ï¼ä¸ç¶ä¼æåºå¼å¸¸
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
```
### æ½è±¡ç±»æåªäºç¹ç¹ï¼
ä»å¤ä¸ªå
·ä½çç±»ä¸æ½è±¡åºæ¥çç¶ç±»å«åæ½è±¡ç±»ï¼æ½è±¡ç±»å°±åæ¯ä¸ä¸ªæ¨¡æ¿ãæ½è±¡ç±»ä½¿ç¨abstractå
³é®åä¿®é¥°ï¼æ½è±¡ç±»å¯ä»¥æ¥ææ½è±¡æ¹æ³ï¼ä½¿ç¨abstractä¿®é¥°çæ¹æ³ï¼ç±åç±»æ¥æä¾æ¹æ³çå®ç°ï¼ãæ½è±¡ç±»çç¹ç¹å¦ä¸ï¼
1.å¯ä»¥å
嫿½è±¡æ¹æ³
æ½è±¡æ¹æ³ä¸æ®éæ¹æ³çåºå«å¨äºï¼æ½è±¡ç±»ä¸æä¾æ½è±¡æ¹æ³çå®ç°ï¼ç±ç»§æ¿æ½è±¡ç±»çåç±»å®ç°æ½è±¡æ¹æ³ã
2.ä¸è½å®ä¾å
乿£å 为å
嫿½è±¡æ¹æ³ï¼æ½è±¡ç±»ä¸è½è¢«å®ä¾åãæ½è±¡ç±»çæé å¨ä¸è½ç¨äºå建å®ä¾ï¼æ¯ä»
æä¾ç»åç±»è°ç¨çã餿¤ä»¥å¤ï¼æ½è±¡ç±»è·æ®éç±»ä¸æ ·ï¼å¯ä»¥æ¥ææååéï¼æ®éæ¹æ³ï¼æé å¨ï¼åå§ååï¼å
é¨ç±»ï¼æä¸¾çã
3.æ½è±¡ç±»å¯ä»¥è¢«ç»§æ¿
ç»§æ¿æ½è±¡ç±»çåç±»å¦æå®ç°äºæææ½è±¡æ¹æ³ï¼é£ä¹å¯ä»¥ä½ä¸ºæ®é类使ç¨ï¼å¦åä¹åªè½ä½ä¸ºæ½è±¡ç±»ã
### Stringï¼StringBufferåStringBuilderä¹é´çåºå«æ¯ä»ä¹ï¼
##### 1.å¯åæ§
Stringæ¯ä¸ä¸ªä¸å¯åç±»ï¼ä»»ä½å¯¹Stringæ¹å齿¯ä¼äº§çä¸ä¸ªæ°çStringå¯¹è±¡ï¼æä»¥Stringç±»æ¯ä½¿ç¨finalæ¥è¿è¡ä¿®é¥°çãèStringBufferåStringBuilderæ¯å¯åç±»ï¼å¯¹åºçåç¬¦ä¸²çæ¹åä¸ä¼äº§çæ°ç对象ã
##### 2.æ§è¡æç
å½é¢ç¹å¯¹å符串è¿è¡ä¿®æ¹æ¶ï¼ä½¿ç¨Stringä¼çæä¸äºä¸´æ¶å¯¹è±¡ï¼å¤ä¸äºéå æä½ï¼æ§è¡æçéä½ã
```java
stringA = StringA + "2";
//å®é
ä¸çä»·äº
{
StringBuffer buffer = new StringBuffer(stringA)
buffer.append("2");
return buffer.toString();
}
```
å¨å¯¹stringAè¿è¡ä¿®æ¹æ¶ï¼å®é
䏿¯å
æ ¹æ®å符串å建ä¸ä¸ªStringBuffer对象ï¼ç¶åè°ç¨append()æ¹æ³å¯¹å符串修æ¹ï¼åè°ç¨toString()è¿åä¸ä¸ªå符串ã
##### 3.线ç¨å®å
¨
StringBufferçè¯»åæ¹æ³é½ä½¿ç¨äºsynchronized修饰ï¼å䏿¶é´åªæä¸ä¸ªçº¿ç¨è¿è¡æä½ï¼æä»¥æ¯çº¿ç¨å®å
¨çï¼èStringBuilder䏿¯çº¿ç¨å®å
¨çã
### Objectç±»æåªäºèªå¸¦æ¹æ³ï¼
#### registerNatives()
é¦å
Objectç±»æä¸ä¸ªæ¬å°æ¹æ³registerNatives()ï¼ä¼å¨ç±»å è½½æ¶è°ç¨ï¼ä¸»è¦æ¯å°Objectç±»ä¸çä¸äºæ¬å°æ¹æ³ç»å®å°æå®ç彿°ä¸å»ï¼ä¾¿äºä¹åè°ç¨ãä¾å¦å°hashCodeåcloneæ¬å°æ¹æ³ç»å®å°JVM_IHashCodeåJVM_IHashCode彿°ã
```java
private static native void registerNatives();
static {
registerNatives();
}
```
æ³æ·±å
¥äºè§£çæåå¯ä»¥ççè¿ä¸¤ç¯æç« ï¼
[Javaä¹Threadæºç registerNatives()æ·±å
¥çè§£](https://juejin.im/post/5dbb959151882523b5402c8f)
[Objectç±»ä¸çregisterNativesæ¹æ³çä½ç¨æ·±å
¥ä»ç»](https://blog.csdn.net/Saintyyu/article/details/90452826)
#### getClass()
**getClass()**æ¹æ³ä¼è¿å对象ç**è¿è¡æ¶**ç±»ã
```java
public final native Class> getClass();
```
å
·ä½å¯ä»¥çä¸é¢è¿ä¸ªä¾å:
æä¸ä¸ªç±»Sonï¼ç»§æ¿äºFatherç±»ï¼instanceçç¼è¯ç±»åæ¯Fatherï¼å®é
èµå¼çæ¯ä¸ä¸ªSonå¯¹è±¡ï¼æä»¥è°ç¨instance.getClass()è·åçæ¯instance对象çè¿è¡æ¶ç±»åï¼æå°çç±»åæ¯"com.test.Son"ã
```java
package com.test;
class Father {}
class Son extends Father {}
Father instance = new Son();
Class class1 = instance.getClass();
System.out.println("class1 is"class1);
```
è¾åºç»æï¼
```java
class1 is class com.test.Son
```
##### Classs.forName()
ä¸**getClass()**ç±»ä¼¼çæ¹æ³è¿æä¸¤ä¸ªï¼ä¸ä¸ªæ¯Classç±»ä¸ç**forName()**æ¹æ³ï¼ä¹æ¯å¨**è¿è¡æ¶**ï¼æ ¹æ®ä¼ å
¥çç±»åå»å 载类ï¼ç¶åè¿åä¸ç±»å
³èçClass对象ã乿£æ¯å 为æ¯å¨æå è½½ï¼å¨ç¼è¯æ¶å¯ä»¥æ²¡æè¿ä¸ªç±»ï¼ä¹ä¸ä¼å¯¹ç±»åè¿è¡æ£éªï¼æä»¥æå¯è½æåºClassNotFoundExceptionå¼å¸¸ã
```java
public static Class> forName(String className)
throws ClassNotFoundException {
Class> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
```
å¯ä»¥èªå·±å°è¯è¿è¡ä¸ä¸è¿æ®µä»£ç
```java
Class class2 = null;
try {
class2 = Class.forName("com.test.Son");//妿å®é
ä¸åå¨com.test.Sonè¿ä¸ªç±»ï¼é£ä¹ä¼æåºClassNotFoundExceptionå¼å¸¸
System.out.println(class2);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
```
```java
class2 is class com.test.Son
```
##### ç±»å+.class
è¿æä¸ç§æ¹å¼æ¯ä½¿ç¨**ç±»å+.class**æ¥è·åç±»å
³èçClass对象ï¼ä¸ä¸é¢ä¸¤ç§æ¹æ³ä¸åä¹å¤å¨äºï¼å®è¿åçæ¯ç¼è¯æ¶ç±»åï¼ä¹å°±æ¯å¨ç¼è¯æ¶ï¼ç±»å è½½å¨å°ç±»å è½½å°JVMä¸ï¼ç¶ååå§åä¸ä¸ªClass对象è¿åã
```java
Class class3 = Son.class;
System.out.println(class3);
```
è¾åºç»æï¼
```java
class3 is class com.test.Son
```
PS:æ 论æ¯ä½¿ç¨åªç§æ¹å¼æ¥è·åç±»å
³èçClass对象ï¼ç±»é½æ¯åªä¼å è½½ä¸æ¬¡ï¼å¦æè·åClass对象æ¶ï¼ä¸ä¼éå¤å 载类ã
### 为ä»ä¹hashCode()åequals()æ¹æ³è¦ä¸èµ·éåï¼
#### hashCode()åequals()æ¹æ³
å¯ä»¥çå°Obejctç±»ä¸çæºç å¦ä¸ï¼å¯ä»¥çå°equals()æ¹æ³çé»è®¤å®ç°æ¯å¤æä¸¤ä¸ªå¯¹è±¡çå
åå°åæ¯å¦ç¸åæ¥å³å®è¿åç»æã
```java
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
```
ç½ä¸å¾å¤å客说hashCodeçé»è®¤å®ç°æ¯è¿åå
åå°åï¼å
¶å®ä¸å¯¹ï¼ä»¥OpenJDK为ä¾ï¼hashCodeçé»è®¤è®¡ç®æ¹æ³æ5ç§ï¼æè¿åéæºæ°çï¼æè¿åå
åå°åï¼å
·ä½éç¨åªä¸ç§è®¡ç®æ¹æ³åå³äºè¿è¡æ¶åºåJVMçå
·ä½å®ç°ã(å¯ä»¥çè§£Objectç±»hashCodeé»è®¤å®ç°æ¯å¯¹ææå¯¹è±¡è¿åçå¼é½ä¸ä¸æ ·ã)
æå
´è¶£çæåå¯ä»¥ççè¿ç¯å客
[JavaçObject.hashCode()çè¿åå¼å°åºæ¯ä¸æ¯å¯¹è±¡å
åå°åï¼](https://blog.csdn.net/xusiwei1236/article/details/45152201)
##### hashCode()æ¹æ³çä½ç¨æåªäºï¼
* å¯¹å¯¹è±¡åæ£å
为äºå°ä¸ç»é®å¼å¯¹ååå¾åå¨å¨ä¸ä¸ªæ°ç»ä¸ï¼HashMap对keyçhashCodeè¿è¡è®¡ç®å¾å°ä¸ä¸ªhashå¼ï¼ç¨hash对æ°ç»é¿åº¦å模ï¼å¾å°æ°ç»ä¸æ ï¼å°é®å¼å¯¹åå¨å¨æ°ç»ä¸æ 对åºçé¾è¡¨ä¸ã
* å¿«éå¤æå¯¹è±¡æ¯å¦ä¸ç¸ç
å 为两个对象hashCodeç¸çï¼è°ç¨equals()æ¹æ³çç»æä¸ä¸å®ä¸ºtrueï¼
å 为两个对象è°ç¨equals()æ¹æ³ç¸çï¼hashCodeä¸å®ç¸çã
æä»¥hashCodeä¸ç¸çå¯ä»¥ä½ä¸ºä¸¤ä¸ªå¯¹è±¡ä¸ç¸ççå¿«é夿æ¡ä»¶ã
å¨å¾HashMap䏿·»å ä¸ä¸ªé®å¼å¯¹æ¶ï¼è®¡ç®å¾å°æ°ç»ä¸æ åï¼ä¼éåæ°ç»ä¸æ ä¸åå¨çé¾è¡¨ä¸ï¼æ¿keyçhashCode䏿¯ä¸ªèç¹çhashCodeè¿è¡æ¯è¾ï¼ç¸çæ¶ï¼æè°ç¨equals()æ¹æ³è¿è¡ç»§ç»è°ç¨ï¼è约æ¶é´ãï¼å¨ä¸äºç±»çequal()æ¹æ³çèªå®ä¹å®ç°ä¸ä¹ä¼å¯¹hashCodeè¿è¡å¤æï¼ã
##### åå¦åªéåhashCode()æ¹æ³ï¼ç»æï¼HashMapå¯ä»¥åå¨ä¸¤ä¸ªå
åå°åä¸ç¸åï¼ä½æ¯ç¸ççå¯¹è±¡ï¼æ æ³ä¿è¯å»éï¼
æ¤æ¶equals()æ¹æ³çå®ç°æ¯é»è®¤å®ç°ï¼ä¹å°±æ¯å½ä¸¤ä¸ªå¯¹è±¡çå
åå°åç¸çæ¶ï¼equals()æ¹æ³æè¿åtrueï¼å设两个é®å¼å¯¹ï¼å®ä»¬çkeyç±»å齿¯TestObjectï¼çå¼é½æ¯testï¼ä½æ¯ç±äºæ¯ä½¿ç¨new String()å建èæçå符串对象ï¼key1åkey2çå
åå°åä¸ç¸çï¼æä»¥key1==key2çç»æä¼æ¯falseï¼TestObjectçequals()æ¹æ³é»è®¤å®ç°æ¯å¤æä¸¤ä¸ªå¯¹è±¡çå
åå°åï¼æä»¥ key1.equals(key2)ä¹ä¼æ¯falseï¼ æä»¥ä¸¤ä¸ªé®å¼å¯¹å¯ä»¥éå¤å°æ·»å å°hashMapä¸å»ã
```java
public class TestObject {
Integer a;
public TestObject(Integer a) {
this.a = a;
}
@Override
public int hashCode() {
return a;
}
public static void main(String[] args) {
TestObject key1 = new TestObject(1);
TestObject key2 = new TestObject(1);
System.out.println("key1çhashCode为"+ key1 +"key2çhashCode为" + key2);
System.out.println("key1.equals(key2)çç»æä¸º"+(key1.equals(key2)));
HashMap