上一篇 <<<如何自定義注解
下一篇 >>>十大經(jīng)典排序算法匯總-動(dòng)畫(huà)演示
Object類的常用方法
hashCode教沾、equals孝治、wait、notify升酣、finalize、clone僻孝、toString
eqauls方法和hashCode方法
1.Object 的 hashcode 方法是本地方法消略,也就是用 c 或 c++ 實(shí)現(xiàn)的,該方法直接返回對(duì)象的內(nèi)存地址章钾,讓后再轉(zhuǎn)換整數(shù)墙贱。
//Object類中的hashCode寫法
public native int hashCode();
2.equals方法
規(guī)定:
1).兩個(gè)對(duì)象的Hashcode值相等,但是兩個(gè)對(duì)象的內(nèi)容值不一定相等【存在Hash沖突的問(wèn)題贱傀,比如a和97的hash值都為97】
2).兩個(gè)對(duì)象的值Equals比較相等的情況下惨撇,則兩個(gè)對(duì)象的Hashcode值一定相等;
//Object類中的equals寫法
public boolean equals(Object obj) {
return (this == obj);
}
結(jié)論:
兩個(gè)對(duì)象相等府寒,則hashcode一定相等魁衙。
兩個(gè)對(duì)象不等,hashcode不一定不等椰棘,也可能會(huì)相等纺棺。
hashcode相等,兩個(gè)對(duì)象不一定相等邪狞。
hashcode不等祷蝌,則兩個(gè)對(duì)象一定不等。
JaryeEntity t1 = new JaryeEntity("a",21);
JaryeEntity t2 = new JaryeEntity("a",21);
System.out.println(t1.equals(t2));
結(jié)果為false帆卓,因?yàn)閑quals默認(rèn)是比較內(nèi)存地址的
我們重寫了equals方法之后巨朦,為什么一定要重寫hashcode?
【阿里的開(kāi)發(fā)規(guī)范明確強(qiáng)調(diào)】關(guān)于 hashCode 和 equals 的處理剑令,遵循如下規(guī)則:
1) 只要覆寫 equals糊啡,就必須覆寫 hashCode。
2) 因?yàn)?Set 存儲(chǔ)的是不重復(fù)的對(duì)象吁津,依據(jù) hashCode 和 equals 進(jìn)行判斷棚蓄,所以 Set 存儲(chǔ)的對(duì)象必須覆
寫這兩個(gè)方法堕扶。
3) 如果自定義對(duì)象作為 Map 的鍵,那么必須覆寫 hashCode 和 equals梭依。
說(shuō)明:String 已覆寫 hashCode 和 equals 方法稍算,所以我們可以愉快地使用 String 對(duì)象作為 key 來(lái)使用。
Map中若不定義hashCode和equals將會(huì)出現(xiàn)內(nèi)存泄露演示
HashMap<HashKey2, Integer> map = new HashMap<HashKey2, Integer>(1000);
while (true) {
// new 多個(gè)不同對(duì)象 參數(shù)都是相同的內(nèi)容役拴,但是對(duì)象的內(nèi)存地址不同糊探。
HashKey2 p = new HashKey2("jarye", "123");
// 如果沒(méi)有重寫 equals 底層默認(rèn)采用==比較兩個(gè)對(duì)象內(nèi)存地址 強(qiáng)引用
map.put(p, 1);
counter++;
if (counter % 1000 == 0) {
System.out.println("map size: " + map.size());
System.out.println("運(yùn)行" + counter
+ "次后,可用內(nèi)存剩余" + Runtime.getRuntime().freeMemory() / (1024 * 1024) + "MB");
}
}
相關(guān)文章鏈接:
<<<Java基礎(chǔ)-反射機(jī)制
<<<Java基礎(chǔ)-字節(jié)碼技術(shù)
<<<Java基礎(chǔ)-創(chuàng)建對(duì)象的方式匯總
<<<Java基礎(chǔ)-對(duì)象布局
<<<Java基礎(chǔ)-對(duì)象的引用類型
<<<Class文件分析一個(gè)類為啥最多支持65535個(gè)接口
<<<如何自定義注解
<<<十大經(jīng)典排序算法匯總-動(dòng)畫(huà)演示
<<<JDK8十大新特性