發(fā)布時(shí)間:2021-11-01 17:18:40來源:有考培訓(xùn)網(wǎng)綜合
西安英泰Java培訓(xùn)機(jī)構(gòu)好不好?Java中的hashCode方法就是根據(jù)一定的規(guī)則將與對(duì)象相關(guān)的信息(比如對(duì)象的存儲(chǔ)地址,對(duì)象的字段等)映射成一個(gè)數(shù)值,這個(gè)數(shù)值稱作為散列值。如果集合中已經(jīng)存在一萬條數(shù)據(jù)或者更多的數(shù)據(jù),如果采用equals方法去逐一比較,效率必然是一個(gè)問題。
西安英泰Java培訓(xùn)機(jī)構(gòu)好不好?
英泰移動(dòng)通信培訓(xùn)學(xué)校成立于2006年,總部位于西安,自成立以來,始終堅(jiān)持高端IT技能人才的培養(yǎng),目前共12個(gè)基地,遍布西安、太原、成都等城市。開設(shè)專業(yè)有:物聯(lián)網(wǎng)、JavaEE及大數(shù)據(jù)、人工智能、PHP、UI設(shè)計(jì)、數(shù)據(jù)通信、4G/5G無線網(wǎng)絡(luò)、Python開發(fā)共8個(gè)專業(yè)。目前IMTI英泰移動(dòng)服務(wù)外包基地已成為行業(yè)知名企業(yè),是廣大有志青年實(shí)訓(xùn)IT夢(mèng)想值得信賴的搖籃。英泰移動(dòng)通信培訓(xùn)學(xué)校與華為、百度、騰訊、阿里巴巴、神州數(shù)碼、東軟軟件、科大訊飛、大疆科技等知名企業(yè)有著長(zhǎng)期戰(zhàn)略人才合作關(guān)系,并被工業(yè)和信息化教育部與考試中心授予“全國(guó)信息技術(shù)人才培養(yǎng)工程培訓(xùn)基地”陜西省調(diào)研組評(píng)為“重合同信譽(yù)單位”,“4G/5G移動(dòng)互聯(lián)網(wǎng)高技能人才培養(yǎng)基地”,“高端IT人才培養(yǎng)示范基地”。
此時(shí)hashCode方法的作用就體現(xiàn)出來了,當(dāng)集合要添加新的對(duì)象時(shí),先調(diào)用這個(gè)對(duì)象的hashCode方法,得到對(duì)應(yīng)的hashcode值,實(shí)際上在HashMap的具體實(shí)現(xiàn)中會(huì)用一個(gè)table保存已經(jīng)存進(jìn)去的對(duì)象的hashcode值,如果table中沒有該hashcode值,它就可以直接存進(jìn)去,不用再進(jìn)行任何比較了;
如果存在該hashcode值,就調(diào)用它的equals方法與新元素進(jìn)行比較,相同的話就不存了,不相同就散列其它的地址,所以這里存在一個(gè)沖突解決的問題,這樣一來實(shí)際調(diào)用equals方法的次數(shù)就大大降低了。
另外注意,默認(rèn)的hashCode會(huì)發(fā)起native調(diào)用,如果用hashCode對(duì)兩個(gè)對(duì)象對(duì)比,會(huì)導(dǎo)致開銷增大。
hashcode方法的作用
只要覆蓋了equals方法,就必須覆蓋hashCode方法。hashCode方法返回一個(gè)整數(shù),用于哈希表數(shù)據(jù)結(jié)構(gòu)。如果兩個(gè)對(duì)象經(jīng)equals方法測(cè)試是相等的,它們就要具有相同的哈希碼。
不相等的對(duì)象要具有不相等的哈希碼(為了哈希表的操作效率),這一點(diǎn)很重要,但不是強(qiáng)制要求,較低要求是不相等的對(duì)象不能共用一個(gè)哈希碼。為了滿足較低要求,hashCode方法要使用稍微復(fù)雜的算法或位操作。
Object.hashCode方法和Object.equals方法協(xié)同工作,返回對(duì)象的哈希碼。這個(gè)哈希碼基于對(duì)象的身份生成,而不是對(duì)象的相等性。(如果需要使用基于身份的哈希碼,可以通過靜態(tài)方法System.identityHashCode獲取Object.hashCode方法的返回值。)
hashCode和equal方法
hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用來在散列存儲(chǔ)結(jié)構(gòu)中確定對(duì)象的存儲(chǔ)地址的;
如果兩個(gè)對(duì)象相同,就是適用于equals(Java.lang.Object)方法,那么這兩個(gè)對(duì)象的hashCode一定要相同;
如果對(duì)象的equals方法被重寫,那么對(duì)象的hashCode也盡量重寫,并且產(chǎn)生hashCode使用的對(duì)象,一定要和equals方法中使用的一致,否則就會(huì)違反上面提到的第2點(diǎn);
兩個(gè)對(duì)象的hashCode相同,并不一定表示兩個(gè)對(duì)象就相同,也就是不一定適用于equals(Java.lang.Object)方法,只能夠說明這兩個(gè)對(duì)象在散列存儲(chǔ)結(jié)構(gòu)中,如Hashtable,他們"存放在同一個(gè)籃子里"。
Comparable::compareTo方法
如果一個(gè)類實(shí)現(xiàn)了Comparable接口,就可以比較一個(gè)實(shí)例是小于、大于還是等于另一個(gè)實(shí)例。這也表明,實(shí)現(xiàn)Comparable接口的類可以排序。
因?yàn)閏ompareTo方法不在Object類中聲明,所以由每個(gè)類自行決定實(shí)例能否排序。如果能排序就定義compareTo方法,實(shí)現(xiàn)實(shí)例排序的方式。
compareTo方法返回一個(gè)int類型的值,這個(gè)值需要進(jìn)一步說明。如果當(dāng)前對(duì)象(this)小于傳入的對(duì)象,compareTo方法應(yīng)該返回一個(gè)負(fù)數(shù);如果兩個(gè)對(duì)象相等,應(yīng)該返回0;如果當(dāng)前對(duì)象大于傳入的對(duì)象,應(yīng)該返回一個(gè)正數(shù)。
clone方法
Object類定義了一個(gè)名為clone的方法,這個(gè)方法的作用是返回一個(gè)對(duì)象,并把這個(gè)對(duì)象的字段設(shè)為和當(dāng)前對(duì)象一樣。clone方法不常用,原因有兩個(gè)。
其一,只有類實(shí)現(xiàn)了Java.lang.Cloneable接口,這個(gè)方法才有用。Cloneable接口沒有定義任何方法(是個(gè)標(biāo)記接口),因此若想實(shí)現(xiàn)這個(gè)接口,只需在類簽名的implements子句中列出這個(gè)接口即可。
其二,clone方法聲明為protected,因此,如果想讓其他類復(fù)制你的對(duì)象,你的類必須實(shí)現(xiàn)Cloneable接口,并覆蓋clone方法,而且要把clone方法聲明為public。
clone方法很難正確實(shí)現(xiàn),而副本構(gòu)造方法實(shí)現(xiàn)起來更容易也更安全;
finalize方法
一種古老的資源管理技術(shù)叫終結(jié)(finalization),開發(fā)者應(yīng)該知道有這么一種技術(shù)。然而,這種技術(shù)幾乎完全廢棄了,任何情況下,大多數(shù)Java開發(fā)者都不應(yīng)該直接使用。
只有少數(shù)應(yīng)用場(chǎng)景適合使用終結(jié),而且只有少數(shù)Java開發(fā)者會(huì)遇到這種場(chǎng)景。如果有任何疑問,就不要使用終結(jié),處理資源的try語句往往是正確的替代品。
終結(jié)機(jī)制的作用是自動(dòng)釋放不再使用的資源。垃圾回收自動(dòng)釋放的是對(duì)象使用的內(nèi)存資源,不過對(duì)象可能會(huì)保存其他類型的資源,例如打開的文件和網(wǎng)絡(luò)連接。垃圾回收程序不會(huì)為你釋放這些額外的資源,因此,終結(jié)機(jī)制的作用是讓開發(fā)者執(zhí)行清理任務(wù),例如關(guān)閉文件、中斷網(wǎng)絡(luò)連接、刪除臨時(shí)文件,等等。
終結(jié)機(jī)制的工作方式是這樣的:如果對(duì)象有finalize方法(一般叫作終結(jié)方法),那么不再使用這個(gè)對(duì)象(或?qū)ο蟛豢蛇_(dá))后的某個(gè)時(shí)間會(huì)調(diào)用這個(gè)方法,但要在垃圾回收程序回收分配給這個(gè)對(duì)象的空間之前調(diào)用。終結(jié)方法用于清理對(duì)象使用的資源。