Java中的哈希表是一種高效的數(shù)據(jù)結(jié)構(gòu),它使用哈希函數(shù)將一個(gè)值映射到一個(gè)固定的地址上。在Java中,每個(gè)對(duì)象都有一個(gè)首地址和一個(gè)哈希碼。
首地址是一個(gè)指針,指向?qū)ο笤趦?nèi)存中的位置。當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),JVM會(huì)為其分配一塊內(nèi)存,然后返回一個(gè)指向該內(nèi)存的指針。這個(gè)指針就是對(duì)象的首地址。
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } }
在上面的代碼中,當(dāng)我們創(chuàng)建一個(gè)Person對(duì)象時(shí),JVM會(huì)為其分配一塊內(nèi)存,并返回指向該內(nèi)存的指針。這個(gè)指針就是該對(duì)象的首地址。
哈希碼是一個(gè)整數(shù),它是根據(jù)對(duì)象的內(nèi)容計(jì)算得出的。在Java中,每個(gè)對(duì)象都有一個(gè)默認(rèn)的哈希函數(shù),它將一個(gè)對(duì)象的內(nèi)容映射到一個(gè)整數(shù)上。根據(jù)Java的規(guī)定,如果兩個(gè)對(duì)象相等,那么它們的哈希碼也必須相等。
public int hashCode() { int result = 17; result = 31 * result + name.hashCode(); result = 31 * result + age; return result; }
在上面的代碼中,我們?yōu)镻erson類重寫了hashCode方法。在這個(gè)方法中,我們將對(duì)象的內(nèi)容通過(guò)一系列運(yùn)算計(jì)算出一個(gè)整數(shù),并將其返回。根據(jù)Java的規(guī)定,如果兩個(gè)對(duì)象相等,那么它們的哈希碼也必須相等。
當(dāng)我們將一個(gè)對(duì)象存儲(chǔ)到哈希表中時(shí),哈希表會(huì)根據(jù)該對(duì)象的哈希碼計(jì)算出一個(gè)地址,然后將該對(duì)象存儲(chǔ)到該地址上。當(dāng)我們需要從哈希表中取出一個(gè)對(duì)象時(shí),哈希表會(huì)根據(jù)該對(duì)象的哈希碼計(jì)算出一個(gè)地址,并查找該地址上存儲(chǔ)的對(duì)象。如果該地址上存儲(chǔ)的對(duì)象與我們要查找的對(duì)象相等,那么哈希表就會(huì)返回該對(duì)象。如果該地址上存儲(chǔ)的對(duì)象與我們要查找的對(duì)象不相等,那么哈希表就會(huì)遍歷該地址上的鏈表,查找到與我們要查找的對(duì)象相等的對(duì)象,并返回它。