標籤:相等 size UI 存在 是什麼 避免 編程開發 內容 如何使用
從http://blog.csdn.net/luanlouis/article/details/41576373?utm_source=tuicool&utm_medium=referral 學習到了java中hashmap的內部原理,非常不錯的文章,非常感謝作者的奉獻.以下為主要內容摘錄.
java/scala/c# 語言之中,class 都會含有hashcode,equals之類的方法,這是為什麼?
數組和鏈表的區別是什麼?在編程開發中應該如何使用?
在HashMap內部,採用了數組+鏈表的形式來組織索引值對Entry<Key,Value>。
HashMap內部維護了一個Entry[] table 數組,當我們使用 new HashMap()建立一個HashMap時,Entry[] table 的預設長度為16。Entry[] table的長度又被稱為這個HashMap的容量(capacity);
對於Entry[] table的每一個元素而言,或為null,或為由若干個Entry<Key,Value>組成的鏈表。HashMap中Entry<Key,Value>的數目被稱為HashMap的大小(size);
Entry[] table中的某一個元素及其對應的Entry<Key,Value>又被稱為桶(bucket);
HashMap內部實現原理是什麼?有關hashcode,它是使用數組加鏈表的資料結構的一個經典使用.
Entry<key,value> ,bucket,loadfactor
size>capacity*loadfactor(0.75) then capacity*2
為了提高HashMap的效能:
1.在使用HashMap的過程中,你比較明確它要容納多少Entry<Key,Value>,你應該在建立HashMap的時候直接指定它的容量;
2. 如果你確定HashMap的使用的過程中,大小會非常大,那麼你應該控制好 載入因子的大小,盡量將它設定得大些。避免Entry[] table過大,而利用率覺很低。
HashMap在確定Key是否在HashMap中存在的要求有兩個:
1. Key值是否相等;
2. hashcode是否相等;
所以我們在定義類時,如果重寫了equals()方法,但是hashcode卻沒有保證相等,就會導致當使用該類執行個體作為Key值放入HashMap中,會出現HashMap“工作異常”的問題,會出現你不希望的情況。
1. HashMap是線程不安全的,如果想使用安全執行緒的,可以使用Hashtable;它提供的功能和Hashmap基本一致。HashMap實際上是一個Hashtable的輕量級實現;
2. 允許以Key為null的形式儲存<null,Value>索引值對;
3. HashMap的尋找效率非常高,因為它使用Hash表對進行尋找,可直接定位到Key值所在的桶中;
4. 使用HashMap時,要注意HashMap容量和載入因子的關係,這將直接影響到HashMap的效能問題。載入因子過小,會提高HashMap的尋找效率,但同時也消耗了大量的記憶體空間,載入因子過大,節省了空間,但是會導致HashMap的尋找效率降低。
JAVA中hashmap的分析