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相同,對象不一定相同。
Haspmap 是線程不安全的,原因是keylist 存儲問題。讓hashmap安全的方法,用hashtable,concurrentHaspMap, 加鎖,用synchronized方法。