hashset和hashmap是相同的實現
主要分析hashmap
hashmap實現了map介面,允許放入null元素,與hashtable的主要區別是沒有實現執行緒安全,與treemap的主要區別是不能保證元素的順序,因此,不同時間迭代會得到不同的位置,hashmap是用衝突鍊錶法解決衝突
根據上圖,兩個關鍵的引數是可以影響hashmap的效能的:初始容量(initial capacity)和負載係數 (load factor)。初始容量指定了初始table的大小,負載係數用來指定自動擴容的臨界值。
將物件放入hashmap或者hashset時:hashcode()和equals()。hashcode()方法決定了物件會被放到哪個bucket裡,當多個物件的雜湊值衝突時,equals()方法決定了這些物件是否是「同乙個物件」。
方法剖析:
get()
get(object key) 該方法是根據指定的key返回對應的value,該方法呼叫了getentry(object key)得到相應的entry,然後返回entry.getvalue()。
//getentry()方法
final entrygetentry(object key)
return
null;
}
put()
put(k key, v value)方法是將指定的key,value對新增到map裡,該方法首先會對map做一次查詢,看是否包含該元祖,如果包含就返回,查詢過程類似於getentry()方法;如果沒有找到,則會通過addentry(int hash, k key, v value, int bucketindex)方法插入新的entry,
//addentry()
void addentry(int hash, k key, v value, int bucketindex)
//在衝突鍊錶頭部插入新的entry
entrye = table[bucketindex];
table[bucketindex] = new entry<>(hash, key, value, e);
size++;
}
remove()
remove(object key)的作用是刪除key值對應的entry,該方法的具體邏輯是在removeentryforkey(object key)裡實現的,首先找到key值對應的entry,然後在刪除entry(修改鍊錶的相應指標)。類似於查詢,但是比查詢多了刪除修改指標的部分。
//removeentryforkey()
final entryremoveentryforkey(object key)
prev = e;
e = next;
}return e;
}
Java HashMap原始碼小結
本文基於jdk1.8.hashmap即雜湊表,是一種能以常數平均時間完成插入,刪除和查詢操作的資料結構 雜湊表有兩種實現方式 開放位址方式和衝突鍊錶方式 開放位址方式不需要使用鍊錶,但是要頻繁的再雜湊操作,常用的再雜湊方法有線性探測法,平方探測法,雙雜湊法。衝突鍊錶方式將所有雜湊值相同的鍵用鍊錶串起...
Java HashMap原始碼分析
在平時需要用到鍵值對儲存資料時,我們便會用到hashmap,這篇文章基於jdk1.8,參考前輩的文章,對hashmap進行一定的理解.面試必備 hashmap原始碼解析 jdk8 hashmap之比於arraylist和linkedlist,感覺原始碼複雜得多,由於才學疏淺,本文很大部分參考上面鏈結...
java hashmap原始碼學習二 put get
hashmap裡面兩個最重要的方法就是get和put 一 put object key 方法的實現 public v put k key,v value putval 的基本思路 1.要是table為空,則建立新的table 2.要是table length 1 hash key 為空,則建立新節點...