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

奇怪,為什么ArrayList初始化容量大小為10?

開發(fā)
我們都知道ArrayList和HashMap底層都是基于數(shù)組的,但為什么ArrayList不像用HashMap那樣用16作為初始容量大小,而是采用10呢?

看ArrayList源碼時(shí),無意中看到ArrayList的初始化容量大小為10,這就奇怪了!我們都知道ArrayList和HashMap底層都是基于數(shù)組的,但為什么ArrayList不像用HashMap那樣用16作為初始容量大小,而是采用10呢?

于是各方查找資料,求證了這個(gè)問題,這篇文章就給大家講講。

為什么HashMap的初始化容量為16?

在聊ArrayList的初始化容量時(shí),要先來回顧一下HashMap的初始化容量。這里以Java 8源碼為例,HashMap中的相關(guān)因素有兩個(gè):初始化容量及裝載因子:

/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

/**
* The load factor used when none specified in constructor.
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;

在HashMap當(dāng)中,數(shù)組的默認(rèn)初始化容量為16,當(dāng)數(shù)據(jù)填充到默認(rèn)容量的0.75時(shí),就會進(jìn)行2倍擴(kuò)容。當(dāng)然,使用者也可以在初始化時(shí)傳入指定大小。但需要注意的是,最好是2的n次方的數(shù)值,如果未設(shè)置為2的n次方,HashMap也會將其轉(zhuǎn)化,反而多了一步操作。

關(guān)于HashMap的實(shí)現(xiàn)原理的內(nèi)容,這里就不再贅述,網(wǎng)絡(luò)上已經(jīng)有太多文章講這個(gè)了。有一點(diǎn)我們需要知道的是HashMap計(jì)算Key值坐標(biāo)的算法,也就是通過對Key值進(jìn)行Hash,進(jìn)而映射到數(shù)組中的坐標(biāo)。

此時(shí),保證HashMap的容量是2的n次方,那么在hash運(yùn)算時(shí)就可以采用位運(yùn)行直接對內(nèi)存進(jìn)行操作,無需轉(zhuǎn)換成十進(jìn)制,效率會更高。

通常,可以認(rèn)為,HashMap之所以采用2的n次方,同時(shí)默認(rèn)值為16,有以下方面的考量:

  • 減少hash碰撞;
  • 提高M(jìn)ap查詢效率;
  • 分配過小防止頻繁擴(kuò)容;
  • 分配過大浪費(fèi)資源;

總之,HashMap之所以采用16作為默認(rèn)值,是為了減少hash碰撞,同時(shí)提升效率。

ArrayList的初始化容量是10嗎?

下面,先來確認(rèn)一下ArrayList的初始化容量是不是10,然后在討論為什么是這個(gè)值。

先來看看Java 8中,ArrayList初始化容量的源碼:

/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;

很明顯,默認(rèn)的容器初始化值為10。而且從JDK1.2到JDK1.6,這個(gè)值也始終都為10。

從JDK1.7開始,在初始化ArrayList的時(shí)候,默認(rèn)值初始化為空數(shù)組:

    /**
* Shared empty array instance used for default sized empty instances. We
* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
* first element is added.
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

此處肯定有朋友說,Java 8中ArrayList默認(rèn)初始化大小為0,不是10。而且還會發(fā)現(xiàn)構(gòu)造方法上的注釋有一些奇怪:構(gòu)造一個(gè)初始容量10的空列表。什么鬼?明明是空的啊!

保留疑問,先來看一下ArrayList的add方法:

    public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}

在add方法中調(diào)用了ensureCapacityInternal方法,進(jìn)入該方法一開始是一個(gè)空容器所以size=0?傳入的minCapacity=1:

    private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

上述方法中先通過calculateCapacity來計(jì)算容量:

    private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}

會發(fā)現(xiàn)minCapacity?被重新賦值為10 (DEFAULT_CAPACITY=10?),傳入ensureExplicitCapacity(minCapacity);這minCapacity=10,下面是方法體:

    private void ensureExplicitCapacity(int minCapacity) {
modCount++;

// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}

private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}

上述代碼中g(shù)row方法是用來處理擴(kuò)容的,將容量擴(kuò)容為原來的1.5倍。

了解上面的處理流程,我們會發(fā)現(xiàn),本質(zhì)上ArrayList的初始化容量還是10,只不過使用懶加載而已,這是Java 8為了節(jié)省內(nèi)存而進(jìn)行的優(yōu)化而已。所以,自始至終,ArrayList的初始化容量都是10。

這里再多提一下懶加載的好處,當(dāng)有成千上萬的ArrayList存在程序當(dāng)中,10個(gè)對象的默認(rèn)大小意味著在創(chuàng)建時(shí)為底層數(shù)組分配10個(gè)指針(40 或80字節(jié))并用空值填充它們,一個(gè)空數(shù)組(用空值填充)占用大量內(nèi)存。如果能夠延遲初始化數(shù)組,那么就能夠節(jié)省大量的內(nèi)存空間。Java 8的改動就是出于上述目的。

為什么ArrayList的初始化容量為10?

最后,我們來探討一下為什么ArrayList的初始化容量為10。其實(shí),可以說沒有為什么,就是“感覺”10挺好的,不大不小,剛剛好,眼緣!

首先,在討論HashMap的時(shí)候,我們說到HashMap之所以選擇2的n次方,更多的是考慮到hash算法的性能與碰撞等問題。這個(gè)問題對于ArrayList的來說并不存在。ArrayList只是一個(gè)簡單的增長陣列,不用考慮算法層面的優(yōu)化。只要超過一定的值,進(jìn)行增長即可。所以,理論上來講ArrayList的容量是任何正值即可。

ArrayList的文檔中并沒有說明為什么選擇10,但很大的可能是出于性能損失與空間損失之間的最佳匹配考量。10,不是很大,也不是很小,不會浪費(fèi)太多的內(nèi)存空間,也不會折損太多性能。

如果非要問當(dāng)初到底為什么選擇10,可能只有問問這段代碼的作者“Josh Bloch”了吧。

如果你仔細(xì)觀察,還會發(fā)現(xiàn)一些其他有意思的初始化容量數(shù)字:

ArrayList-10
Vector-10
HashSet-16
HashMap-16
HashTable-11

ArrayList與Vector初始化容量一樣,為10;HashSet、HashMap初始化容量一樣,為16;而HashTable獨(dú)獨(dú)使用11,又是一個(gè)很有意思的問題。

小結(jié)

有很多問題是沒有明確原因、明確的答案的。就好像一個(gè)女孩兒對你沒感覺,可能是因?yàn)槟悴粔蚝茫部赡苁撬呀?jīng)愛上別人了,但也有很大可能你是不會知道答案。但在尋找原因和答案的過程中,還是能夠?qū)W到很多,成長很多的。沒有對比就沒有傷害,比如HashMap與ArrayList的對比,沒有對比就不知道是否適合,還比如HashMap與ArrayList。當(dāng)然,你還可以試試特立獨(dú)行的HashTable,或許適合你呢。

責(zé)任編輯:趙寧寧 來源: 程序新視界
相關(guān)推薦

2019-04-15 08:49:59

阿里巴巴容量集合

2023-11-12 23:08:17

C++初始化

2018-05-29 14:57:59

HashMap容量初始化

2011-04-07 17:39:16

SQL Server數(shù)

2025-08-28 04:11:00

靜態(tài)成員變量存儲

2009-11-11 15:29:15

ADO初始化

2019-11-04 13:50:36

Java數(shù)組編程語言

2009-09-08 09:48:34

LINQ初始化數(shù)組

2011-06-17 15:29:44

C#對象初始化器集合初始化器

2021-03-12 10:30:11

SpringMVC流程初始化

2010-07-28 10:22:33

FlexApplica

2022-07-06 10:37:45

SpringServlet初始化

2020-12-03 09:50:52

容器IoC流程

2021-04-28 20:44:01

HashMap容量性能

2024-01-15 06:34:09

Gin鏡像容器

2020-08-02 22:54:04

Python編程語言開發(fā)

2019-09-17 07:31:53

MySQL表容量數(shù)據(jù)庫

2009-09-18 11:15:52

C#數(shù)組初始化

2009-09-25 16:55:08

Hibernate初始

2011-03-16 10:52:20

點(diǎn)贊
收藏

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

日韩高清欧美激情| 成人97精品毛片免费看| 91免费版在线看| 欧美亚洲日本黄色| 亚洲精品成人无码| 欧美一卡二卡| 99re这里都是精品| 日本三级韩国三级久久| 亚洲一级黄色录像| 福利一区二区| 亚洲男人电影天堂| 国产伦精品一区二区三区免费视频| 日本少妇毛茸茸高潮| 日本成人中文| 欧美丝袜一区二区三区| 亚洲国产日韩欧美| a天堂视频在线| 亚洲人人精品| 一区二区欧美亚洲| www.成年人| 55av亚洲| 欧美激情一区在线观看| 91久久精品www人人做人人爽| 国产大片aaa| 国产伦乱精品| 精品人伦一区二区三区蜜桃网站| 日韩欧美一区二区三区四区| 99在线观看精品视频| 99在线|亚洲一区二区| 自拍偷拍亚洲精品| 国产污在线观看| 日韩综合av| 欧美吻胸吃奶大尺度电影 | 亚洲va欧美va天堂v国产综合| 日韩精品av一区二区三区| 蜜桃av中文字幕| 国产一区二区三区香蕉| 国产精品成人一区二区| 国产成人免费观看视频 | 成人在线播放网址| av网址在线| 国产精品国产三级国产| 欧美日韩在线精品| 日韩精品一二| av色综合久久天堂av综合| 亚洲一区二区三区视频| 国产毛片在线视频| 国精品**一区二区三区在线蜜桃| 国产日韩欧美另类| 影音先锋国产资源| 捆绑变态av一区二区三区| 国产精品视频久久久久| 中文字幕 自拍偷拍| 日本亚洲免费观看| 国产精品黄色av| 欧美一区二区三区不卡视频| 亚洲综合社区| 国产91久久婷婷一区二区| 久久久久久久久久影院| 亚洲乱码视频| 91精品国产电影| 天天综合网入口| 免费视频一区| 国产精品精品一区二区三区午夜版 | 在线视频一二三区| 成人福利片网站| 亚洲欧美日韩精品久久久久| 女同性恋一区二区| 国内小视频在线看| 午夜精品福利一区二区蜜股av| 午夜免费福利小电影| 欧美aa一级| 色婷婷久久久久swag精品| 国产福利影院在线观看| 伊人国产精品| 精品国产三级a在线观看| 黑丝av在线播放| 在线成人动漫av| 中文字幕精品网| 亚洲一级理论片| 欧美 日韩 国产精品免费观看| 欧美高跟鞋交xxxxxhd| 97免费在线观看视频| 日韩国产精品久久久久久亚洲| 国产精品一二区| 亚洲av无码国产精品永久一区| 9人人澡人人爽人人精品| 日本一区视频在线播放| 国产精品扒开做爽爽爽的视频 | 国产小视频91| 国产天堂av在线| 一区二区三区精品视频在线观看| 国产成人亚洲综合青青| 国产成人麻豆精品午夜在线| 99久久亚洲一区二区三区青草| 日韩.欧美.亚洲| 9191在线播放| 色成人在线视频| 女教师高潮黄又色视频| 最新国产精品视频| 久久久91精品国产| 国产精品人人人人| 国产激情偷乱视频一区二区三区| 免费av一区二区三区| 哥也色在线视频| 色噜噜偷拍精品综合在线| 性生交大片免费看l| 国产一区二区三区四区五区| 欧美精品久久久久久久| 91丨九色丨海角社区| 成人黄页在线观看| 曰韩不卡视频| 日韩电影免费观| 欧美成人性福生活免费看| 日本黄色网址大全| 国模 一区 二区 三区| 国产精品老牛影院在线观看| 黄色一级a毛片| 综合欧美亚洲日本| 十八禁视频网站在线观看| 成功精品影院| 久久久精品影院| 国产亚洲久一区二区| 99久久综合狠狠综合久久| 国产高清不卡无码视频| 欧美男男gaygay1069| 亚洲美女av在线播放| 国产精品99精品| 国产一区视频导航| 一区二区视频国产| 精品日本视频| 一区二区欧美日韩视频| 怡红院av久久久久久久| 91视视频在线直接观看在线看网页在线看 | www.色就是色.com| 成人影院天天5g天天爽无毒影院| 欧美一级bbbbb性bbbb喷潮片| 丰满少妇一级片| 樱花草国产18久久久久| 亚洲综合伊人久久| 99九九热只有国产精品| 国产视频999| 日本免费在线观看| 欧美日韩在线亚洲一区蜜芽| 精品人伦一区二区| 日韩国产精品久久久久久亚洲| 欧美影视一区二区| 亚洲精品粉嫩美女一区| 亚洲无亚洲人成网站77777| 青青视频在线免费观看| 久久久不卡影院| 免费在线观看的av网站| 中文有码一区| 国产成人精品一区| av黄色在线观看| 欧美日韩中文字幕一区二区| а天堂中文在线资源| 久久er99精品| 公共露出暴露狂另类av| 日韩精品成人在线观看| 欧美人与物videos| 日韩一区二区三区不卡| 亚洲成人精品一区| av直播在线观看| 日韩中文字幕一区二区三区| 污视频在线免费观看一区二区三区| 国产亚洲一区二区手机在线观看| 国产一区二区三区日韩欧美| 一级黄色片免费| 亚洲精品一卡二卡| 日本黄色免费观看| 天堂va蜜桃一区二区三区漫画版| 日韩精品一线二线三线| 成人av在线播放| 午夜精品久久久99热福利| 青青久草在线| 欧美视频一区二区| 免费在线一区二区三区| 99久久精品免费看国产免费软件| 国产一级片黄色| 婷婷激情图片久久| 国产一区二区在线观看免费播放| 亚洲1234区| 久久综合电影一区| 高清不卡一区二区三区| 国产成人av免费| 亚洲欧美日韩中文播放| 97香蕉碰碰人妻国产欧美| 久久在线91| xxxxxx在线观看| 亚洲bt欧美bt精品777| 国产视频999| cao在线视频| 综合激情国产一区| 色综合免费视频| 欧美色电影在线| 国产特黄大片aaaa毛片| 国产精品久久久久久久久动漫| 欧美日韩一区二区区别是什么 | 精品网站aaa| 国产男人精品视频| 国产传媒在线观看| 久久久精品一区| 日本啊v在线| 欧美大片在线观看| 伊人成人在线观看| 偷拍与自拍一区| 亚洲欧美小视频| 国产偷v国产偷v亚洲高清| 中文字幕在线视频一区二区| 老司机亚洲精品| 国产一区二区四区| 99久久久久国产精品| 欧美黑人3p| julia中文字幕一区二区99在线| 国产精品你懂得| 日产福利视频在线观看| 久久99热精品这里久久精品| 91九色在线porn| 亚洲精品在线不卡| 欧美 日韩 人妻 高清 中文| 欧美日韩精品一区二区天天拍小说 | 一区二区三区在线观看视频| 亚洲自拍偷拍图| 久久久久久久久久久久久久| 欧美一级理论片| 狠狠狠狠狠狠狠| 亚洲成人av电影在线| 丰满少妇被猛烈进入一区二区| 国产日韩精品视频一区| 黄色国产在线观看| 成人丝袜高跟foot| 亚洲最大视频网| 国产美女精品人人做人人爽| 日本久久精品一区二区| 久久久久国内| 欧美 国产 小说 另类| 日韩午夜电影| 91免费黄视频| 亚洲黄色影片| 日韩五码在线观看| 在线成人www免费观看视频| 在线观看污视频| 亚洲欧美在线专区| 福利网在线观看| 久久综合av| 一卡二卡3卡四卡高清精品视频| 欧美在线电影| 日韩三级电影免费观看| 成人免费看片39| 日韩片电影在线免费观看| 精品国产一级毛片| 亚洲视频精品一区| 国产精品88久久久久久| 中文字幕一区二区三区四区五区人| 色777狠狠狠综合伊人| 一区二区三区国产福利| 亚洲v在线看| 国产 欧美 日本| 亚洲激情午夜| 人妻内射一区二区在线视频 | 99国产精品欲| 日韩视频一区二区三区| 国产高潮在线观看| 亚洲精品一区二区三区影院| 天天干天天摸天天操| 亚洲免费伊人电影在线观看av| 九色在线免费| 尤物tv国产一区| 成人无遮挡免费网站视频在线观看| 成人444kkkk在线观看| 欧美人体视频xxxxx| 1769国产精品| 国产成+人+综合+亚洲欧美| 成人免费自拍视频| 91蝌蚪精品视频| 欧美日韩免费高清| 欧美好骚综合网| 久久99久久久久久| 久色成人在线| 国产探花一区二区三区| 91免费观看视频| 乱老熟女一区二区三区| 亚洲国产成人av| 最新中文字幕第一页| 日韩西西人体444www| 天堂在线中文资源| yw.139尤物在线精品视频| а√在线天堂官网| 国产精品一区二区三区在线播放| 国产精品亚洲综合在线观看| 韩日午夜在线资源一区二区| 日本久久一二三四| 你真棒插曲来救救我在线观看| 日日夜夜精品免费视频| 国产精品嫩草69影院| 久久精品亚洲一区二区三区浴池| 我要看黄色一级片| 日韩欧美一区视频| 成人av手机在线| 中文字幕日韩高清| 第一福利在线视频| 91精品中国老女人| 蜜臀av免费一区二区三区| 97超碰人人爱| 蜜桃视频第一区免费观看| 男女一区二区三区| 亚洲色图在线看| 亚洲欧美自拍视频| 精品国产一区久久| 欧美性videos| 日韩av大片在线| 精品按摩偷拍| 97在线免费视频观看| 日本最新不卡在线| 疯狂揉花蒂控制高潮h| 亚洲在线视频一区| 国产美女无遮挡永久免费| 亚洲四色影视在线观看| 三级中文字幕在线观看| 91嫩草视频在线观看| 成人精品中文字幕| 凹凸国产熟女精品视频| 成人av网站免费| 加勒比婷婷色综合久久| 欧美日韩精品免费| 国产免费a∨片在线观看不卡| 国模吧一区二区三区| 日韩在线亚洲| 日本女人高潮视频| 精品制服美女丁香| 国产成人精品亚洲精品| 午夜激情在线| 成人在线免费观看视视频| 精品久久久中文字幕| 蜜臀av午夜一区二区三区| 中文字幕资源在线观看| 中文字幕色av一区二区三区| av首页在线观看| 在线日韩精品视频| 欧洲av一区二区| 日韩亚洲视频在线| 日韩国产精品久久| 91社区视频在线观看| 91黄色在线观看| 成人在线免费公开观看视频| 国产精品久久久久高潮| 国产欧美一区二区精品久久久| 日本一道本久久| 99久久er热在这里只有精品15| 国内免费精品视频| 亚洲国产又黄又爽女人高潮的| 国产精品探花在线| 精品不卡一区二区三区| 在线综合亚洲| 国产吞精囗交久久久| 91九色02白丝porn| 国产精品二线| 国产日韩专区在线| 欧美精品成人| 黄色激情在线观看| 五月婷婷色综合| 久久电影视频| 国产精品视频永久免费播放| 色喇叭免费久久综合| 毛片毛片毛片毛片毛| 亚洲国产精品自拍| 性猛交xxxx| 国产精品视频自在线| 欧美激情第8页| 日本丰满少妇裸体自慰| 欧美日韩一区中文字幕| dy888亚洲精品一区二区三区| 91精品久久香蕉国产线看观看| 亚洲激情网站| 91系列在线播放| 黄毛片在线观看| 日本一区二区三区视频免费看| 美女诱惑一区二区| 日本妇女毛茸茸| 亚洲精品电影网站| 欧美伊人亚洲伊人色综合动图| 老司机午夜免费福利视频| www.在线欧美| 亚洲永久精品视频| 欧美精品videos| 狠狠做六月爱婷婷综合aⅴ| 久久久久亚洲av无码麻豆| 精品久久久久久久久中文字幕| 国产精品久久久久一区二区国产| 91精品天堂| 天堂精品中文字幕在线| 欧美三级 欧美一级| 亚洲人午夜色婷婷| 精品视频一区二区三区| 97在线免费公开视频| 亚洲精品国产品国语在线app| 日韩三级电影网| 999在线免费观看视频| 日韩电影在线免费观看|