HashMap的存儲原理
H ashMap是<key, value>,不能用來存儲重復的鍵
1、調用key的hashCode()方法生成一個hash值h1,如果這個h1在haspMap中不存在,那麽直接將<key, value>值存進去。
2、如果h1已經存在,那麽找到HashMap中所有hash值為h1的key,然後分別調用key的equals()方法判斷當前添加的key值是否與已經存在的key值相同。
2.1、如果equals()返回的是true,說明key相同,說明key值已經存在,那麽會用新的value值覆蓋舊的value值
2.2、如果equals()返回的是false,說明key在hashMap裏不存在,因此會在HashMap中創建新的映射關系。 這種情況會產生沖突。采用鏈地址
查找的過程:具體:從HashMap中通過key查找value時,首先調用key的hashCode()方法來獲取key的hash值h,那麽這樣可以確定鍵為key的所有值得首地址(keyList)。如果h對應的key值有多個,那麽程序會遍歷所有的key,通過調用所有的key的equals()方法來判斷key的內容是否相等。只有當equals()方法的返回值為true時,對應的value才是正確的結果。
Object類默認的hashCode()方法和equals()方法的比較規則如下:當參數obj引用的對象與當前對象為同一個對象時,就返回true,否則返回false。hashCode()方法會返回對象存儲的內存地址。
因此,如果想根據對象的相關屬性來定義對象是否相同的邏輯,就需要重寫equals方法,一旦重寫了equals方法,那麽必須重寫hashcode方法。
當定義類作為hashMap的key時,最好把這個類定義為不可變類。。
如果兩個對象相等,那麽這兩個對象有相同的hashcode,但是hashcode相同,對象不一定相同。
HashMap的存儲原理