天天看點

LinkedHashMap<String, Bitmap>(0, 0.75f, true) LinkedHashMap的加載因子和初始容量配置設定

/** @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,如需轉載請自行聯系原作者

繼續閱讀