ArrayList底層數(shù)組擴容原理

我們先回顧一下之前的所說過的數(shù)組摄悯,話不多說,上代碼:

老規(guī)則沈跨,我們繼續(xù)畫一畫偷厦,加深一下印象商叹,上圖:

這個圖我們?nèi)サ袅?a target="_blank">ArrayList初探 - 知乎專欄一文圖里那些無用的細節(jié)(方法區(qū),常量池等)只泼,方便大家看起來清晰剖笙,我們用eclipse的debug功能看一下,看是否與我們圖上畫的一致

再看一下執(zhí)行結(jié)果请唱,也在我們期望中弥咪。


好,我們改一下代碼十绑,再往數(shù)組里加添加一個叫“周八”的person對象


執(zhí)行一下


看到了傳說的中數(shù)組下標越界異常聚至。在Java中,數(shù)組一但在堆內(nèi)存中創(chuàng)建本橙,長度是固定的扳躬。

既然是固定的,那我們要往數(shù)組里加一個“周八”用戶怎么辦甚亭?沒辦法贷币,只能重新new長一點的新的數(shù)組,把原來數(shù)組的元素復(fù)制過去亏狰,好吧役纹,開始寫代碼吧,相信大家都會寫


把老數(shù)組的元素循環(huán)一下骚揍,賦值給新的數(shù)組字管,很簡單也很清晰啰挪。debug看一下

“周八”已經(jīng)有了信不。以上代碼雖然簡單,但還不是最優(yōu)雅的亡呵,老鳥一般會這么寫抽活,該段代碼執(zhí)行結(jié)果和上面那段代碼一樣。


再畫個圖加深一下印象吧:

此圖已用盡我洪荒之力锰什,希望大家以后多想想對象在堆內(nèi)存中的樣子下硕。不枉我一片苦心呀丁逝。

看到System.arraycopy()方法是不是似曾相識呢?我們在ArrayList初探 - 知乎專欄一文中提了一下梭姓,相信看到這里霜幼,大家都知道ArrayList里的底層數(shù)組擴容是怎么實現(xiàn)的了吧。在ArrayList初探 - 知乎專欄一文中誉尖,我們知道當ArrayList如果不指定構(gòu)造個數(shù)的話罪既,第一次往里面添加元素時底層數(shù)組會初始化一個長度為10的數(shù)組,我們再回顧一下昨天的源碼铡恕,再來看一下ArrayList里的源碼琢感,當添加第11個元素時


再看grow()方法


這兒有一段代碼:int newCapacity = oldCapacity + (oldCapacity >> 1),>>是移位運算符探熔,相當于int newCapacity = oldCapacity + (oldCapacity/2)驹针,但性能會好一些。


本文開始那個問題诀艰,到這兒就解決了柬甥,這就是數(shù)組的擴容,一般是oldCapacity + (oldCapacity >> 1)其垄,相當于擴容1.5倍暗甥。

看到這里,相信在以后的面試中捉捅,面試官再問數(shù)組和ArrayLIst的區(qū)別的時候撤防,大家應(yīng)該有了自己的理解,而不是去背面試題了棒口。

ArrayList還提供了其它構(gòu)造方法寄月,我們順便來看一下。


我們再看一下源碼无牵,好簡單:


當我們在寫代碼過程中漾肮,如果我們大概知道元素的個數(shù),比如一個班級大概有40-50人茎毁,我們優(yōu)先考慮List<Person> list2 = new ArrayList<>(50)以指定個數(shù)的方式去構(gòu)造克懊,這樣可以避免底層數(shù)組的多次拷貝,進而提高程序性能七蜘。

轉(zhuǎn)載出自:https://zhuanlan.zhihu.com/p/27878015

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谭溉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子橡卤,更是在濱河造成了極大的恐慌扮念,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碧库,死亡現(xiàn)場離奇詭異柜与,居然都是意外死亡巧勤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門弄匕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颅悉,“玉大人,你說我怎么就攤上這事迁匠∏┪瑁” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我捧请,道長,這世上最難降的妖魔是什么搂鲫? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮磺平,結(jié)果婚禮上魂仍,老公的妹妹穿的比我還像新娘。我一直安慰自己拣挪,他們只是感情好擦酌,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著菠劝,像睡著了一般赊舶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赶诊,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天笼平,我揣著相機與錄音,去河邊找鬼舔痪。 笑死寓调,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的锄码。 我是一名探鬼主播夺英,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滋捶!你這毒婦竟也來了痛悯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤炬太,失蹤者是張志新(化名)和其女友劉穎灸蟆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亲族,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡炒考,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霎迫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斋枢。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖知给,靈堂內(nèi)的尸體忽然破棺而出瓤帚,到底是詐尸還是另有隱情,我是刑警寧澤涩赢,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布戈次,位于F島的核電站,受9級特大地震影響筒扒,放射性物質(zhì)發(fā)生泄漏怯邪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一花墩、第九天 我趴在偏房一處隱蔽的房頂上張望悬秉。 院中可真熱鬧,春花似錦冰蘑、人聲如沸和泌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽武氓。三九已至,卻和暖如春仇箱,著一層夾襖步出監(jiān)牢的瞬間聋丝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工工碾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弱睦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓渊额,卻偏偏與公主長得像况木,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子旬迹,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • ArrayList ArrayList是最常見以及每個Java開發(fā)者最熟悉的集合類了火惊,顧名思義,ArrayList...
    朦朧蜜桃閱讀 2,647評論 1 0
  • Java集合:ArrayList,Vector與Stack 本文非常詳盡地介紹了Java中的三個集合類:Array...
    2Roc閱讀 333評論 0 0
  • 從 ArrayList 的構(gòu)造函數(shù)說起 ArrayList有三種方式來初始化奔垦,構(gòu)造方法源碼如下: /** * ...
    Java面試指南閱讀 459評論 0 0
  • 前言 ArrayList 作為 Java 集合框架中最常用的類屹耐,在一般情況下,用它存儲集合數(shù)據(jù)最適合不過椿猎。知其然知...
    聞人的技術(shù)博客閱讀 719評論 0 8
  • 一惶岭、.ArrayList: 寫過的項目到現(xiàn)在基本上面向業(yè)務(wù)域查詢返回大列表都是使用ArrayList來存儲業(yè)務(wù)數(shù)據(jù)...
    直到世界的盡頭_yifan閱讀 7,497評論 0 4