精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

阿里面試:HashMap是如何實(shí)現(xiàn)擴(kuò)容?哪三步?

開(kāi)發(fā) 前端
為了盡可能地減少擴(kuò)容操作的次數(shù),通常會(huì)將負(fù)載因子設(shè)置為一個(gè)較小的值,例如0.75,以保證哈希表的容量能夠滿足存儲(chǔ)需求,同時(shí)又不會(huì)造成太多的空間浪費(fèi)。

1.達(dá)到閾值開(kāi)始擴(kuò)容

如下圖所示:

圖片圖片

HashMap的擴(kuò)容機(jī)制是當(dāng)HashMap中的元素個(gè)數(shù)超過(guò)了負(fù)載因子(loadFactor)與初始容量(initialCapacity)的乘積時(shí),就會(huì)觸發(fā)擴(kuò)容機(jī)制。

默認(rèn)的構(gòu)造函數(shù)指定了擴(kuò)容因子:0.75, 默認(rèn)容量是16,如下所示:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 相當(dāng)于16
static final float DEFAULT_LOAD_FACTOR = 0.75f;


public HashMap(int initialCapacity) {
    this(initialCapacity, DEFAULT_LOAD_FACTOR);
}

元素?cái)?shù)量達(dá)到了閾值(即負(fù)載因子 * 桶的數(shù)量)時(shí),會(huì)觸發(fā)擴(kuò)容操作,也就是說(shuō)第1次擴(kuò)容的動(dòng)作會(huì)在元素個(gè)數(shù)達(dá)到12(16*0.75)的時(shí)候觸發(fā)擴(kuò)容。

為了盡可能地減少擴(kuò)容操作的次數(shù),通常會(huì)將負(fù)載因子設(shè)置為一個(gè)較小的值,例如0.75,以保證哈希表的容量能夠滿足存儲(chǔ)需求,同時(shí)又不會(huì)造成太多的空間浪費(fèi)。

2.開(kāi)始擴(kuò)容執(zhí)行

HashMap通過(guò)resize()方法進(jìn)行擴(kuò)容,容量規(guī)則為2的冪次。

如下所示:

final Node<K,V>[] resize() {
    Node<K,V>[] oldTab = table;
    int oldCap = (oldTab == null) ? 0 : oldTab.length;
    int oldThr = threshold;
    int newCap, newThr = 0;
    //以前的容量大于0,也就是hashMap中已經(jīng)有元素了,或者new對(duì)象的時(shí)候設(shè)置了初始容量
    if (oldCap > 0) {
        //如果以前的容量大于限制的最大容量1<<30,則設(shè)置臨界值為int的最大值2^31-1
        if (oldCap >= MAXIMUM_CAPACITY) {
            threshold = Integer.MAX_VALUE;
            return oldTab;
        }
        /**
         * 如果以前容量的2倍小于限制的最大容量,同時(shí)大于或等于默認(rèn)的容量16,則設(shè)置臨界值為以前臨界值的2
         * 倍,因?yàn)閠hreshold = loadFactor*capacity,capacity擴(kuò)大了2倍,loadFactor不變,
         * threshold自然也擴(kuò)大2倍。
         */
        else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&
                 oldCap >= DEFAULT_INITIAL_CAPACITY)
            newThr = oldThr << 1; // double threshold
    }
    /**
     * 在HashMap構(gòu)造器Hash(int initialCapacity, float loadFactor)中有一句代碼,this.threshold    
     * = tableSizeFor(initialCapacity), 表示在調(diào)用構(gòu)造器時(shí),默認(rèn)是將初始容量暫時(shí)賦值給了
     * threshold臨界值,因此此處相當(dāng)于將上一次的初始容量賦值給了新的容量。什么情況下會(huì)執(zhí)行到這句?當(dāng)調(diào)用    
     * 了HashMap(int initialCapacity)構(gòu)造器,還沒(méi)有添加元素時(shí)
     */
    else if (oldThr > 0) 
        newCap = oldThr;
    /**
     * 調(diào)用了默認(rèn)構(gòu)造器,初始容量沒(méi)有設(shè)置,因此使用默認(rèn)容量DEFAULT_INITIAL_CAPACITY(16),臨界值
     * 就是16*0.75
     */
    else {               
        newCap = DEFAULT_INITIAL_CAPACITY;
        newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
    }
    //對(duì)臨界值做判斷,確保其不為0,因?yàn)樵谏厦娴诙N情況(oldThr > 0),并沒(méi)有計(jì)算newThr
    if (newThr == 0) {
        float ft = (float)newCap * loadFactor;
        newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?
                  (int)ft : Integer.MAX_VALUE);
    }
    threshold = newThr;
    
    @SuppressWarnings({"rawtypes","unchecked"})
    /**構(gòu)造新表,初始化表中數(shù)據(jù)*/
    Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];
    //將剛創(chuàng)建的新表賦值給table
    table = newTab;
    if (oldTab != null) {
        //遍歷將原來(lái)table中的數(shù)據(jù)放到擴(kuò)容后的新表中來(lái)
        for (int j = 0; j < oldCap; ++j) {
            Node<K,V> e;
            if ((e = oldTab[j]) != null) {
                oldTab[j] = null;
                //沒(méi)有鏈表Node節(jié)點(diǎn),直接放到新的table中下標(biāo)為【e.hash & (newCap - 1)】位置即可
                if (e.next == null)
                    newTab[e.hash & (newCap - 1)] = e;
                //如果是treeNode節(jié)點(diǎn),則樹(shù)上的節(jié)點(diǎn)放到newTab中
                else if (e instanceof TreeNode)
                    ((TreeNode<K,V>)e).split(this, newTab, j, oldCap);
                //如果e后面還有鏈表節(jié)點(diǎn),則遍歷e所在的鏈表,
                else { // 保證順序
                    Node<K,V> loHead = null, loTail = null;
                    Node<K,V> hiHead = null, hiTail = null;
                    Node<K,V> next;
                    do {
                        //記錄下一個(gè)節(jié)點(diǎn)
                        next = e.next;
                        /**
                         * newTab的容量是以前舊表容量的兩倍,因?yàn)閿?shù)組table下標(biāo)并不是根據(jù)循環(huán)逐步遞增
                         * 的,而是通過(guò)(table.length-1)& hash計(jì)算得到,因此擴(kuò)容后,存放的位置就
                         * 可能發(fā)生變化,那么到底發(fā)生怎樣的變化呢,就是由下面的算法得到.
                         *
                         * 通過(guò)e.hash & oldCap來(lái)判斷節(jié)點(diǎn)位置通過(guò)再次hash算法后,是否會(huì)發(fā)生改變,如
                         * 果為0表示不會(huì)發(fā)生改變,如果為1表示會(huì)發(fā)生改變。到底怎么理解呢,舉個(gè)例子:
                         * e.hash = 13 二進(jìn)制:0000 1101
                         * oldCap = 32 二進(jìn)制:0001 0000
                         *  &運(yùn)算:0  二進(jìn)制:0000 0000
                         * 結(jié)論:元素位置在擴(kuò)容后不會(huì)發(fā)生改變
                         */
                        if ((e.hash & oldCap) == 0) {
                            if (loTail == null)
                                loHead = e;
                            else
                                loTail.next = e;
                            loTail = e;
                        }
                        /**
                         * e.hash = 18 二進(jìn)制:0001 0010
                         * oldCap = 32 二進(jìn)制:0001 0000
                         * &運(yùn)算:32 二進(jìn)制:0001 0000
                         * 結(jié)論:元素位置在擴(kuò)容后會(huì)發(fā)生改變,那么如何改變呢?
                         * newCap = 64 二進(jìn)制:0010 0000
                         * 通過(guò)(newCap-1)&hash
                         * 即0001 1111 & 0001 0010 得0001 0010,32+2 = 34
                         */
                        else {
                            if (hiTail == null)
                                hiHead = e;
                            else
                                hiTail.next = e;
                            hiTail = e;
                        }
                    } while ((e = next) != null);
                    if (loTail != null) {
                        loTail.next = null;
                        /**
                         * 若(e.hash & oldCap) == 0,下標(biāo)不變,將原表某個(gè)下標(biāo)的元素放到擴(kuò)容表同樣
                         * 下標(biāo)的位置上
                         */
                        newTab[j] = loHead;
                    }
                    if (hiTail != null) {
                        hiTail.next = null;
                        /**
                         * 若(e.hash & oldCap) != 0,將原表某個(gè)下標(biāo)的元素放到擴(kuò)容表中
                         * [下標(biāo)+增加的擴(kuò)容量]的位置上
                         */
                        newTab[j + oldCap] = hiHead;
                    }
                }
            }
        }
    }
    return newTab;
}

擴(kuò)容會(huì)將HashMap的容量(即桶的數(shù)量)翻倍,擴(kuò)容的大小是原來(lái)的2倍,并重新計(jì)算每個(gè)元素在新桶中的位置。

3.新建哈希表存儲(chǔ)擴(kuò)容

擴(kuò)容操作需要?jiǎng)?chuàng)建一個(gè)新的哈希表,并將舊哈希表中的元素重新分配到新哈希表的桶中。

重新分配元素時(shí),HashMap會(huì)對(duì)每個(gè)元素的哈希值取模得到一個(gè)新的桶位置,并將元素插入到新的桶中。

擴(kuò)容操作完成后,HashMap將使用新的哈希表來(lái)存儲(chǔ)元素,并釋放舊哈希表的內(nèi)存空間。

責(zé)任編輯:武曉燕 來(lái)源: mikechen的互聯(lián)網(wǎng)架構(gòu)
相關(guān)推薦

2021-09-27 07:11:18

MySQLACID特性

2024-04-28 08:52:33

RabbitMQ延遲隊(duì)列延遲插件

2010-02-26 16:16:15

2010-04-20 20:53:35

實(shí)現(xiàn)網(wǎng)絡(luò)負(fù)載均衡

2010-08-12 10:10:37

FlexMapABC

2009-11-10 12:55:26

VB.NET三維模型

2021-03-02 07:02:45

Linux操作系統(tǒng)

2009-11-16 13:04:04

PHP上傳文件代碼

2010-05-17 09:49:19

DataCore虛擬化

2024-07-05 17:47:21

@Async項(xiàng)目啟動(dòng)類(lèi)

2018-05-10 22:40:44

物聯(lián)網(wǎng)信息化傳統(tǒng)企業(yè)

2021-05-06 11:06:52

人工智能語(yǔ)音識(shí)別聲聞檢索

2013-11-01 10:09:14

Windows 8.1升級(jí)

2020-11-04 00:00:29

Kerberos協(xié)議身份

2011-07-13 09:54:22

VMware故障vSphere

2009-02-04 09:45:05

Java SocketSocket APIJava編程

2024-06-28 07:42:18

2012-08-08 17:05:36

App運(yùn)營(yíng)

2015-06-09 09:25:34

2023-02-17 14:35:15

HashMapNode類(lèi)型
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧洲久久久久久| 日本精品免费观看| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 久久免费视频66| 日韩欧美一区二区三区久久| 视频一区三区| 国产 欧美 自拍| 天堂av在线一区| 久久精品99无色码中文字幕| 秘密基地免费观看完整版中文| 二区三区不卡| 伊人开心综合网| 日本一区二区不卡高清更新| 精品乱子伦一区二区| 久久一区中文字幕| 欧美激情精品久久久久| 国产农村妇女精品一区| 精品午夜电影| 欧美精品日韩综合在线| 欧美亚洲一二三区| 99热国产在线| 欧美激情中文字幕| 久久国产精品免费一区| 国产成人三级在线播放 | 青青色在线视频| 国产精品一区专区| 国产精品久久久久秋霞鲁丝| 日韩精品手机在线| 欧美久久成人| 久久中文精品视频| 国产三级黄色片| 亚洲精品小区久久久久久| 日韩欧美一区中文| 国产美女视频免费看| 日日夜夜天天综合| 天天色天天操综合| 日本黄色片一级片| 成人影院在线看| 国产精品传媒入口麻豆| 日产国产精品精品a∨| 日韩一区二区三区中文字幕| 懂色av噜噜一区二区三区av| 亚洲综合色av| 99视频免费看| 国产一区二区看久久| 国产日本欧美一区| 亚洲一级片免费看| 男女男精品视频网| 国产精品网红直播| 亚洲天堂免费av| 蜜臀av国产精品久久久久| 国产97免费视| 亚洲大尺度在线观看| 久久精品网址| 国产精品va在线播放我和闺蜜| 天天干天天干天天操| 国产一区二区高清| 91成人福利在线| 日韩视频在线观看一区| 玖玖精品视频| 国产精品色婷婷视频| 中文字幕一区二区三区四区免费看 | 欧美大尺度激情区在线播放 | 国产精品久久久久久久久久10秀| 日韩视频―中文字幕| 国产尤物在线播放| 欧美激情综合| 97视频在线观看视频免费视频 | 艳母动漫在线免费观看| 操你啦视频在线| 一区二区三区.www| 丰满爆乳一区二区三区| 欧美黄色网页| 欧美日韩一级黄| av在线免费观看不卡| 国产精品久av福利在线观看| 国产视频久久久久久久| 免费污网站在线观看| 成人vr资源| 欧美黑人xxxx| 无码人妻精品一区二区三区蜜桃91 | 亚洲国产中文在线二区三区免| 欧美va在线播放| 国产网站无遮挡| 成人影视亚洲图片在线| 精品中文字幕在线观看| 日韩福利片在线观看| 日韩精品亚洲专区| 亚洲直播在线一区| 美女毛片在线看| 中文字幕欧美一| 精品少妇在线视频| 日韩经典一区| 亚洲精品一线二线三线| 日韩女同一区二区三区| 欧美 亚欧 日韩视频在线| 51久久精品夜色国产麻豆| 在线免费观看一级片| 丁香婷婷综合色啪| 亚洲精品不卡| av在线最新| 欧美日韩亚洲国产综合| 私密视频在线观看| 国产高清欧美| 清纯唯美日韩制服另类| 国产99对白在线播放| 国产日韩精品一区二区三区| 国内自拍中文字幕| av一区在线播放| 亚洲国产精品嫩草影院久久| 欧美福利在线视频| 国产日韩精品视频一区二区三区| 91精品在线影院| 国产有码在线| 午夜精品久久久久久久久久久| 国产精品一区二区小说| 午夜先锋成人动漫在线| 欧美激情成人在线视频| 97国产成人无码精品久久久| 久久亚洲一区二区三区明星换脸| 免费cad大片在线观看| 久久免费影院| 国产亚洲精品va在线观看| 国产福利拍拍拍| 国产91露脸合集magnet| 在线免费观看一区二区三区| 性高爱久久久久久久久| 亚洲精品99久久久久| 欧美日韩免费一区二区| 国产九色精品成人porny| 亚洲国产精品久久久久久女王| 无遮挡爽大片在线观看视频| 精品国产乱码久久久久久闺蜜| 国产一区二区三区在线视频观看| 美腿丝袜一区二区三区| 日韩高清dvd| 美脚恋feet久草欧美| 日韩av在线一区| 日韩欧美大片在线观看| caoporm超碰国产精品| 中文字幕无码精品亚洲资源网久久| 国产95亚洲| 美女av一区二区三区| 136福利视频导航| 国产精品福利电影一区二区三区四区| chinese少妇国语对白| 免费久久久久久久久| 日本国产精品视频| 精品影院一区| 欧美性大战久久久久久久蜜臀| 国产精品免费无码| 日本美女视频一区二区| 五月天色一区| 欧美高清xxx| 久久精品91久久香蕉加勒比| 国产精品欧美久久久久天天影视| 亚洲私人影院在线观看| 日本成人在线免费| 亚洲黄色av| 欧美二区三区| www.久久.com| 久久精品国产96久久久香蕉| 国产普通话bbwbbwbbw| 一区二区三区在线视频观看58 | 中国女人真人一级毛片| 国产精品女同互慰在线看| 97人人爽人人| 国产精品va| 老司机精品福利在线观看| 三上悠亚国产精品一区二区三区| 在线播放国产一区中文字幕剧情欧美| 亚洲视频在线观看一区二区| 一区二区在线观看免费视频播放| 久久久无码人妻精品无码| 99视频一区| 亚洲福利av在线| 欧美黄视频在线观看| 午夜精品一区二区三区在线视频| 欧美日韩激情视频一区二区三区| 欧美视频在线一区| 日本天堂中文字幕| 久久综合给合久久狠狠狠97色69| 三上悠亚av一区二区三区| 欧美日韩国产欧| 欧美日韩系列| 欧美经典影片视频网站| 国产91对白在线播放| 男人在线资源站| 欧美精品一区二区三区在线| 久久精品99北条麻妃| 亚洲美女免费视频| 成人性生活免费看| 久色婷婷小香蕉久久| 欧美啪啪免费视频| 久久久久免费av| 鲁丝片一区二区三区| 国产一区二区三区精品在线观看| 57pao精品| 午夜羞羞小视频在线观看| 精品一区二区电影| 精品久久人妻av中文字幕| 日本久久一区二区| 久久国产精品波多野结衣av| 国产精品网友自拍| 久久国产精品无码一级毛片| 国精品**一区二区三区在线蜜桃| 九色在线视频观看| 欧美韩日精品| 中文字幕一区二区三区有限公司 | 国产精品17p| 成人激情视频网| 日本免费一区二区三区四区| 欧美激情中文字幕乱码免费| 在线视频91p| 亚洲欧美国产高清va在线播| 亚洲va天堂va欧美ⅴa在线| 欧美三级中文字| www欧美在线| 亚洲成人av一区二区| 欧美日韩精品亚洲精品| 亚洲欧洲国产日韩| 国产视频不卡在线| 久久久久久夜精品精品免费| 最新在线黄色网址| 成人高清视频在线| 日本中文字幕有码| 国产综合色在线| 中文字幕日韩综合| 免费高清成人在线| 三级在线免费看| 日韩极品在线观看| 美女av免费在线观看| 亚洲激情视频| 男人的天堂狠狠干| 亚洲精品在线二区| 丁香婷婷综合激情| 亚洲国产99| 欧日韩免费视频| 亚洲一级电影| 国产日韩亚洲欧美在线| 欧美激情在线| 日韩av中文字幕第一页| 亚洲福利精品| 欧美丰满熟妇bbbbbb百度| aa亚洲婷婷| 无码人妻丰满熟妇区毛片| 美女视频一区免费观看| 男人天堂成人在线| 日韩高清在线电影| 中文字幕在线综合| 极品美女销魂一区二区三区| 久久久久久久久久毛片| 国产精品一区二区你懂的| 欧美污在线观看| 国产suv精品一区二区6| 国产大学生视频| 91蜜桃网址入口| 波多野结衣片子| 中文字幕成人av| 日韩精品一区二区三区在线视频| 亚洲婷婷国产精品电影人久久| 中文字幕五月天| 亚洲激情第一区| 日本特黄特色aaa大片免费| 欧美日韩午夜剧场| 免费黄色一级大片| 欧美一区二区网站| 天堂成人在线观看| 国产亚洲精品美女| 日本高清中文字幕在线| 欧美大片免费观看| 亚洲第一av| 国产日韩精品入口| 国产一区二区三区免费在线| 国产一区二区三区免费不卡| 视频一区中文| 97精品国产97久久久久久粉红| 黄色av日韩| 亚洲精品一二三四五区| 国产一区不卡视频| ass精品国模裸体欣赏pics| 国产精品天干天干在线综合| 亚洲av鲁丝一区二区三区| 天天操天天干天天综合网| 黄色一区二区视频| 欧美成人bangbros| 国产福利片在线| 欧美激情国内偷拍| 成人影院在线免费观看| 成人免费视频视频在| 免费一区二区| 伊人久久在线观看| 日韩激情av在线| 精品国产免费久久久久久婷婷| www国产成人免费观看视频 深夜成人网| 影音先锋男人在线| 亚洲高清视频的网址| 中文字幕日产av| 亚洲护士老师的毛茸茸最新章节| 男人天堂网在线| 久久久成人的性感天堂| 麻豆成全视频免费观看在线看| 成人精品aaaa网站| 九色成人国产蝌蚪91| 欧美激情亚洲天堂| 免费高清成人在线| 永久免费看mv网站入口78| 一区二区在线观看视频| 在线视频欧美亚洲| 亚洲欧美资源在线| 国产在线精彩视频| 国产精品初高中精品久久| 久久伦理在线| 国产一级片黄色| 99re6这里只有精品视频在线观看| 午夜精品久久久久99蜜桃最新版| 色综合久久久久久久| 国产91免费在线观看| 久久精品小视频| 国产69精品久久久久按摩| 欧美日韩国产一二| 国产欧美一区二区色老头| 国产日韩视频一区| 樱花影视一区二区| 国产麻豆精品一区| 日韩亚洲一区二区| 91综合国产| 日韩福利在线| 日本特黄久久久高潮| 五月天精品视频| 丁香五六月婷婷久久激情| 免费看国产片在线观看| 欧美猛交免费看| 精品国产鲁一鲁****| 日本黄色播放器| 久久www免费人成看片高清| 成年人免费视频播放| 欧美视频第二页| www.亚洲.com| 国产精品亚洲美女av网站| 日韩一区二区三区免费播放| 中文字幕永久视频| 欧美国产综合一区二区| 国产精品成人无码| 丝袜亚洲欧美日韩综合| 日韩大陆av| 日本一区二区三区四区五区六区| 国产一区二区三区免费播放| 国产尤物在线播放| 精品人在线二区三区| 人在线成免费视频| 欧美日韩日本网| 蜜臂av日日欢夜夜爽一区| 亚洲区一区二区三| 日韩欧美成人激情| 成人免费高清观看| 久久精品99久久| 日韩在线一区二区三区| 日韩视频在线观看免费视频| 欧美色综合网站| 国产色在线观看| 国产精品久久久久久久小唯西川| 亚洲狠狠婷婷| 人人妻人人澡人人爽| 欧美精品九九99久久| 男插女视频久久久| 久久久久久99| 久久精品久久久精品美女| 免费在线观看一级片| 亚洲黄一区二区| 日韩一级二级| av磁力番号网| 337p粉嫩大胆色噜噜噜噜亚洲| 青青国产在线视频| 欧美成人高清视频| 琪琪久久久久日韩精品| 污片在线免费看| 亚洲一区二区三区四区在线免费观看| 午夜影院免费体验区| 国产欧美日韩精品丝袜高跟鞋| 欧美精品黄色| 四虎永久免费在线观看| 91精品欧美福利在线观看| 狠狠操一区二区三区| 亚洲激情啪啪| 成人精品鲁一区一区二区| 中文字幕人成人乱码亚洲电影| 欧美乱大交xxxxx另类电影| 免费av一区| 欧美日韩一区二区区别是什么 | 亚洲精品97久久中文字幕无码| 日本乱人伦a精品| 久久久久免费av| 国产三级av在线播放| 日韩免费高清视频| 日本另类视频| 国产妇女馒头高清泬20p多| 国产精品高清亚洲| 青梅竹马是消防员在线| 91嫩草免费看|