HashMap的原理
HashMap的結構如圖所示:
Map里面保存的是key-value鍵值對,鍵值對是以LinkedList的結構保存在Bucket中,HashMap的key和value值可以為null。
HashMap的工作原理
HashMap保存對象用put(K key, V value),獲取某對象用get(K key)。當我們保存對象是首先對Key調用hashCode方法,返回的值作為Bucket的位置,講鍵值對保存到Bucket之中。獲取對象時,我們同樣先對key調用hashcode方法,查找到Bucket的位置,從而返回value的值。
若兩個對象是否可以產生相同的hashcode?
兩個對象可以產生相同的hashcode,由于HashMap是根據Bucket存儲的,Bucket中的數據結構是LinkedList,故,若兩對象hashcode相同則會依次存放在LinkedList中,當查找對象的時候根據hashCode進行查找找到相應的Bucket,然后依次在LinkedList中查找對象,若key只與查找的key值相同(equals)則找到該對象。
若HashMap的大小超過其負載因子的容量怎么辦?
若超過其敷在引資的容量則將會創建一個以前大小兩倍的HashMap,然后將entity通過運算hashcode的方式重新保存到新的HashMap之中。
??!但是,由于Bucket中的對象是以LinkedList進行保存的,所以在新的HashMap中,兩處于同一個Bucket中的對象的順序會發生反轉(LinkedList鏈表,查詢從頭查詢,插入式從鏈表頭插入),那么問題就來了,若有兩個線程同時操作此HashMap,若第一個線程剛好已經完成擴展HashMap的操作,而第二個線程剛好開始擴展HashMap,這個時候就會出現,已經擴展的HashMap作為原始數據,被第二個線程擴展(因此可以看到HashMap并非線程安全的)。
HashTable與HashMap的區別
HashTable幾乎可以等價HashMap,HashTable是JDK1.0的java特性,它是線程安全的,而HashMap并非線程安全的,HashTable支持序列化,因此在單線程的環境下HashTable相比HashMap效率要第。HashTable不支持key和value為空,而HashMap沒有這個限制。