/** @param maxSize Maximum sum of the sizes of the Bitmaps in this cache */
public LruMemoryCache(int maxSize) {
if (maxSize <= 0) {
throw new IllegalArgumentException("maxSize <= 0");
}
this.maxSize = maxSize;
this.map = new LinkedHashMap<String, Bitmap>(0, 0.75f, true);
}
上面這段代碼是github上面一個比較有名的開源項目中的一段,大概就是一個用LinkedHashMap來實作lru,我的問題LinkedHashMap構造函數的前2個參數,初始容量竟然是0?那加載因子0.75有何意義?據我所知,擴充容量時,是用初始容量*加載因子,這樣的話,這個擴充的容量不是始終都是0了嗎,初始也為0,擴充也為0,那這個hashmap還有何意義?不知道哪裡了解錯了
第一個網友的回答如下:
你再看看HashMap的源代碼,看看是怎麼擴容的。
上面這段代碼沒有什麼特别的地方,隻是初始化了一個長度為0的HashMap,順便設定了LinkedHashMap的通路順序(第三個參數), 這種情況一般是建立時不确定Map中是否會有值及幾個值,比較保守的寫法,不想浪費空間。
預設的構造方法是長度為16, 如果你不确定map中是否能放夠16個鍵值,那麼16的長度就浪費了。這樣寫也有不利的地方,多了幾次運作時的擴容操作,作者可能認為空間更重要吧。
第二個網友的回答如下:
看看源碼就知道了
其實第一個參數是你要設定的初始大小;而程式内部實際的初始大小是1;
如果你設定的初始大小(initialCapacity)小于1, 那麼map大小就是預設的1;
否則會不斷左移(乘2)直到capacity大于你設定的initialCapacity;
public LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder) {
super(initialCapacity, loadFactor);//這裡調用父類HashMap的構造方法;
this.accessOrder = accessOrder;
}
public HashMap(int initialCapacity, float loadFactor) {
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal initial capacity: " +
initialCapacity);
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
if (loadFactor <= 0 || Float.isNaN(loadFactor))
throw new IllegalArgumentException("Illegal load factor: " +
loadFactor);
// Find a power of 2 >= initialCapacity
int capacity = 1; // 預設是1
while (capacity < initialCapacity)//不斷翻倍直到大于人為設定的大小
capacity <<= 1;
this.loadFactor = loadFactor;
threshold = (int)(capacity * loadFactor);//的确如你所言,後面如果需要增大長度,按照capacity*loadFactor取整後增長;
table = new Entry[capacity];
init();
本文轉自農夫山泉别墅部落格園部落格,原文連結:http://www.cnblogs.com/yaowen/p/6358045.html,如需轉載請自行聯系原作者