成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

初探HashMap之構(gòu)造方法

fanux / 3563人閱讀

摘要:創(chuàng)建時傳入初始化容量和負(fù)載系數(shù)初始化容量顧名思義這個參數(shù)定義了這個的初始大小小于零會拋出非法參數(shù)異常大于的三十次方則默認(rèn)等于的三十次方負(fù)載因子當(dāng)你的需要擴(kuò)容時擴(kuò)容容量添加方法會用到此方法無符號右移相當(dāng)于加一做或運算后把值存到左邊的變量或運

1.創(chuàng)建HashMap時傳入初始化容量和負(fù)載系數(shù)

initialCapacity(初始化容量):顧名思義,這個參數(shù)定義了這個HashMap的初始大小;小于零會拋出非法參數(shù)異常,大于MAXIMUM_CAPACITY(2的三十次方)則默認(rèn)等于2的三十次方
loadFactor(負(fù)載因子):

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);
    this.loadFactor = loadFactor;
    this.threshold = tableSizeFor(initialCapacity);
}

threshold:當(dāng)你的HashMap需要擴(kuò)容時,擴(kuò)容容量(添加方法put會用到此方法)

static final int tableSizeFor(int cap) {
    int n = cap - 1;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

">>>":無符號右移(相當(dāng)于加一)
"|="做或運算后把值存到左邊的變量("或運算":有1結(jié)果為1,全為0結(jié)果為0)
為什么要對cap做減1操作?這是為了防止cap已經(jīng)是2的冪.如果cap已經(jīng)是2的冪,又沒有執(zhí)行這個減1操作,則執(zhí)行完后面的幾條無符號右移操作之后,返回的capacity將是這個cap的2倍.最后+1,使之成為2的冪
非常牛的一個算法,用于找到大于等于initialCapacity的最小的2的冪(不懂的http://www.th7.cn/Program/jav... 這里不做贅述)

2.創(chuàng)建HashMap時只傳入初始化容量
public HashMap(int initialCapacity) {
    this(initialCapacity, DEFAULT_LOAD_FACTOR);
}

默認(rèn)負(fù)載因子DEFAULT_LOAD_FACTOR = 0.75f

3.創(chuàng)建HashMap時不傳入任何參數(shù)
public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
}
4.創(chuàng)建HashMap時傳入一個實現(xiàn)了Map接口的對象,此HashMap創(chuàng)建后會包括此Map的所有內(nèi)容
public HashMap(Map m) {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
    putMapEntries(m, false);
}
final void putMapEntries(Map m, boolean evict) {
    int s = m.size();
    if (s > 0) {
        if (table == null) {
            float ft = ((float)s / loadFactor) + 1.0F;
            int t = ((ft < (float)MAXIMUM_CAPACITY) ?
                     (int)ft : MAXIMUM_CAPACITY);
            if (t > threshold)
                threshold = tableSizeFor(t);
        }
        else if (s > threshold) // 傳入Map的size大于擴(kuò)容容量,resize方法為重新初始化一下容量
            resize();
        for (Map.Entry e : m.entrySet()) {
            K key = e.getKey();
            V value = e.getValue();
            putVal(hash(key), key, value, false, evict);// 相當(dāng)于put方法,請看下回分解
        }
    }
}

table:Node類型,做為空判斷是否為新創(chuàng)建.
ft:是否要擴(kuò)容的操作(為什么+1我現(xiàn)在只有個模糊的感覺,先留個坑)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67970.html

相關(guān)文章

  • JAVA 持有對象——容器初探(持續(xù)補充)

    摘要:類庫中提供了一套相當(dāng)完整的容器類來解決這個問題,其中基本類型有,,,,這些對象類型被稱為集合類。但是,類庫中使用了來指代集合類中的子集,,,所以集合類也被稱為容器。五類型是能夠?qū)ο笥成涞狡渌麑ο蟮囊环N容器,有區(qū)別于的方法。 引言 如果一個程序只包含固定數(shù)量的且其生命周期都是已知對象,那么這是一個非常簡單的程序——《think in java》 了解容器前,先提出一個問題,ArrayL...

    aikin 評論0 收藏0
  • 初探Kotlin+SpringBoot聯(lián)合編程

    摘要:是一門最近比較流行的靜態(tài)類型編程語言,而且和一樣同屬系。這個生成的構(gòu)造函數(shù)是合成的,因此不能從或中直接調(diào)用,但可以使用反射調(diào)用。 showImg(https://segmentfault.com/img/remote/1460000012958496); Kotlin是一門最近比較流行的靜態(tài)類型編程語言,而且和Groovy、Scala一樣同屬Java系。Kotlin具有的很多靜態(tài)語言...

    xiaokai 評論0 收藏0
  • 初探Java8中的HashMap

    摘要:當(dāng)沖突的個數(shù)比較少時,使用鏈表,否則使用紅黑樹。這樣做的好處是,最壞的情況下即所有的都沖突,采用鏈表的話查找時間為而采用紅黑樹為,這也是中性能提升的奧秘,詳細(xì)的測試可以看這篇博文。 HashMap是我們最常用的集合之一,同時Java8也提升了HashMap的性能。本著學(xué)習(xí)的原則,在這探討一下HashMap。 原理 簡單講解下HashMap的原理:HashMap基于Hash算法,我們...

    William_Sang 評論0 收藏0
  • Android Flux架構(gòu)初探

    摘要:跟一樣,它不是為移動應(yīng)用設(shè)計的,但是它的特性和簡單可以讓我們很好的在安卓項目中采用。架構(gòu)在安卓開發(fā)中使用設(shè)計規(guī)范的目的是建立一個在簡單性與易擴(kuò)展易測試之間都比較平衡的架構(gòu)。第一步是找到元素和安卓組件之間的映射。一個,裝載了本次操作。 序言 之前寫過一篇關(guān)于Android項目如何架構(gòu)的,有MVC和MCVP,前幾天又看到了新的一種架構(gòu),當(dāng)然并不是新出的,出了有一段時間,當(dāng)前被應(yīng)用的并不是很...

    blankyao 評論0 收藏0

發(fā)表評論

0條評論

fanux

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<