成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Java基礎之ArrayList的擴容機制

瀏覽:169日期:2022-08-13 10:25:58

我們知道Java中的ArrayList對象底層是基于數組實現的,而數組是有長度限制的,那基于數組實現的ArrayList是否有長度限制呢?我們通過ArrayList的構造方法來剖析

ArrayList提供了3種構造方法以便我們來獲取:

ArrayList(int initialCapacity) 第一種需要賦值長度進行new ArrayList() 第二種無參構造,不需要賦值數組初始長度 ArrayList(Collection<? extends E> c) 第三種入參一個繼承了Collection對象轉化為ArrayList

//需要賦值ArrayList一個int類型長度值 public ArrayList(int initialCapacity) {if (initialCapacity > 0) { this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA;} else { throw new IllegalArgumentException('Illegal Capacity: '+ initialCapacity);} } //無參構造 public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }//入參繼承了Collection對象轉化為ArrayList public ArrayList(Collection<? extends E> c) {elementData = c.toArray();if ((size = elementData.length) != 0) { // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, size, Object[].class);} else { // replace with empty array. this.elementData = EMPTY_ELEMENTDATA;} }

接下來我們從ArrayList的賦值初始長度的構造方法和無參構造方法進行跟蹤,來得到我們的答案;

1.ArrayList(int initialCapacity)

/*** Shared empty array instance used for empty instances.*/private static final Object[] EMPTY_ELEMENTDATA = {}; public ArrayList(int initialCapacity) {//initialCapacity大于0的情況下,就去new一個Object類型、長度為initialCapacity的數組if (initialCapacity > 0) { this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) {//initialCapacity等于0的情況下,則生成已經創(chuàng)造好的Object[]; this.elementData = EMPTY_ELEMENTDATA;} else {//initialCapacity小于0的情況下,直接拋異常 throw new IllegalArgumentException('Illegal Capacity: '+ initialCapacity);} }

通過上述源碼分析,在賦值初始長度的構造方法中,如果initialCapacity符合大于0的情況下的話,在new ArrayList的時候是會創(chuàng)造一個長度為initialCapacity的對象數組,而小于0的情況下則返回已經創(chuàng)造好的Object[] EMPTY_ELEMENTDATA;

2.ArrayList()

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};public ArrayList() { //當你沒有賦值初始長度時,同樣是去賦值已經創(chuàng)造好的空數組,沒有長度值this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }

當ArrayList生成后,我們接著來看他的add()添加方法,找到ArrayList實現的add方法:

Java基礎之ArrayList的擴容機制

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};public boolean add(E e) { //1、add的第一步先去調用ensureCapacityInternal方法傳入size+1ensureCapacityInternal(size + 1); // Increments modCount!!elementData[size++] = e;return true; }//3、傳入一開始我們new的數組和add后的數組長度 private static int calculateCapacity(Object[] elementData, int minCapacity) { //如果elementData等于空數組,則對比DEFAULT_CAPACITY和minCapacity大小,返回大的值,DEFAULT_CAPACITY默認為10if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity);}//否則返回minCapacityreturn minCapacity; }//2、在ensureCapacityInternal方法內部又去調用calculateCapacity(elementData, minCapacity)方法,傳入add數據后的list的size長度 private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); }//4、拿到minCapacity的值后,對modCount++,比對添加后的list的長度和現在的list的長度來判斷是否需要進行擴容; private void ensureExplicitCapacity(int minCapacity) {modCount++;// 如果添加list的長度大于list現在的長度,則說明list的長度已經不夠了,需要走grow(minCapacity)方法進行擴容if (minCapacity - elementData.length > 0) grow(minCapacity); }

經過上面的分析,我們發(fā)現在add時,ArrayList會先去判斷你是不是一個空數組,如果是的話則會給你賦值數組的,長度值,默認為10,到這一步我們就知道了,不管是哪種構造方法都會在add時,都會進行判斷給空數組進行賦值長度,也就是說對于ArrayList來講,他是需要數組的長度的,同時他還會對比數組原來長度和add后的長度來判斷是否需要進行擴容。

接下來我們看grow(minCapacity)擴容方法:

private void grow(int minCapacity) {// 拿到數組原來的長度int oldCapacity = elementData.length;//進行1.5倍計算int newCapacity = oldCapacity + (oldCapacity >> 1);//如果1.5倍的值小于add后的長度值,則把add后的長度值設置成新數組的長度if (newCapacity - minCapacity < 0) newCapacity = minCapacity;//如果1.5倍的值大于array的最大長度則調用hugeCapacity(minCapacity)方法if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity);// 調用Arrays.copyOf方法傳入舊數組對象和新數組的長度,進行擴容elementData = Arrays.copyOf(elementData, newCapacity); }private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflow throw new OutOfMemoryError(); //如果add后的長度大于array的最大長度那就返回Integer的最大長度,否則返回array的最大長度,丟棄1.5倍的值,選擇array的最大長度來進行擴容return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }

到此,我們對于源碼的分析就結束了。

結論:

1.new的時候可以給ArrayList設置數組的長度值,也可以不設置,不設置的情況下,在第一次add時會默認賦值長度為10

2.每一次add時都會去對比add后的長度值和數組原有長度值,判斷是否需要走grow(int minCapacity)擴容方法

3.默認ArrayList是以1.5的長度進行擴容,會先去創(chuàng)造一個新的長度的數組,再將原來數組賦值過去,完成擴容操作

4.還會去對比1.5的長度和array的最大長度進行選擇用array的最大長度還是選擇Integer的最大長度

5.工作時,如果我們能知道ArrayList將要存儲多少數據時,最好是new的時候賦值一個初始值,因為去數組擴容肯定是要浪費時間和cpu資源的

到此這篇關于Java基礎之ArrayList的擴容機制的文章就介紹到這了,更多相關Java ArrayList的擴容機制內容請搜索好吧啦網以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
色999日韩国产欧美一区二区| 欧美性受极品xxxx喷水| 99国产精品私拍| 国产亚洲欧美激情| 成人动漫精品一区二区| 91精品国产一区二区三区| 奇米色777欧美一区二区| 国产精品一二| 亚洲人成小说网站色在线| 成人一区二区三区中文字幕| 欧美美女一区二区在线观看| 精品一区二区影视| 欧美日韩成人在线一区| 国产麻豆视频一区| 在线成人免费观看| 韩国精品主播一区二区在线观看| 欧美伊人久久久久久久久影院| 日韩国产精品久久| 91黄视频在线| 男女男精品视频| 欧美在线观看视频一区二区三区| 中文字幕乱码亚洲精品一区 | 国产一区二区视频在线| 亚洲欧美日本视频在线观看| 亚洲午夜免费视频| 91在线精品一区二区三区| 日韩一区二区免费在线电影| 蜜臀av亚洲一区中文字幕| 一区二区高清| 欧美激情一区三区| 影音先锋国产精品| 国产亚洲欧美激情| 国产精品亚洲人在线观看| 色88888久久久久久影院野外| 一区二区三区在线观看欧美 | 国产九九精品| 成人免费在线视频| 成人小视频免费在线观看| 欧美日韩视频在线第一区 | 欧美一级播放| 亚洲免费在线电影| 亚洲私拍自拍| 国产精品久久久一本精品| 91在线观看污| 欧美大片一区二区三区| 国产精品 欧美精品| 在线不卡中文字幕播放| 极品美女销魂一区二区三区| 欧美专区在线观看一区| 亚洲国产成人av网| 一本色道久久| 一片黄亚洲嫩模| 亚洲狠狠婷婷| 亚洲丝袜精品丝袜在线| 狠狠入ady亚洲精品| 一区免费观看视频| 影音先锋在线一区| 国产精品美女www爽爽爽| 午夜视频久久久| 精品日韩欧美一区二区| 成人性生交大片免费| 91精品国产全国免费观看| 黄色日韩三级电影| 欧美喷水一区二区| 蜜臀久久久久久久| 久久精精品视频| 日日夜夜精品免费视频| 亚洲综合国产| 亚洲最新视频在线观看| 国产精品美女诱惑| 亚洲成人av一区| 久久永久免费| 免费不卡在线视频| 欧美三级视频在线观看| 国产黄色精品视频| 91精品国产乱码| 成人av电影在线网| 国产香蕉久久精品综合网| 色综合一个色综合亚洲| 国产日产精品1区| 国产在线观看一区| 一区二区三区国产豹纹内裤在线| 先锋影音久久久| 青草av.久久免费一区| 欧美精品亚洲二区| jvid福利写真一区二区三区| 国产日产精品1区| 一本色道久久综合亚洲精品婷婷 | 成人午夜看片网址| 久久免费精品国产久精品久久久久| 成人激情午夜影院| 久久先锋资源网| 欧美午夜不卡| 亚洲精品国产精华液| 久久一区视频| 国产一区二区网址| 日韩欧美视频在线| 影音先锋久久| 日韩精品电影一区亚洲| 在线播放视频一区| 欧美一区成人| 亚洲综合另类小说| 中国成人在线视频| 日本不卡一二三| 日韩午夜av电影| 欧美大香线蕉线伊人久久国产精品| 中文一区二区在线观看| 亚洲一区日本| 久久99久久精品| 2023国产精品| 亚洲青色在线| 久88久久88久久久| 久久综合久久综合久久| 亚洲精品国产日韩| 久草在线在线精品观看| 国产亚洲人成网站| 亚洲专区一区| 国产成都精品91一区二区三| 国产精品麻豆网站| 91国产成人在线| 99久久er热在这里只有精品15| 亚洲欧美视频一区| 在线精品视频小说1| 欧美日韩亚洲在线| 日韩精品国产欧美| 精品国一区二区三区| 亚洲精品在线视频观看| 精品一区二区三区不卡 | 亚洲毛片视频| 日产欧产美韩系列久久99| 久久综合狠狠综合久久综合88| 国产精品一区二区三区四区五区 | 制服丝袜一区二区三区| 欧美视频四区| 日韩在线观看一区二区| 久久亚洲捆绑美女| 噜噜噜噜噜久久久久久91| 成人免费看的视频| 一区二区三区中文字幕精品精品 | 日韩精品一区二区三区三区免费 | 99re这里只有精品6| 五月婷婷综合激情| 久久久精品一品道一区| 亚洲欧美日韩国产综合精品二区| 国产**成人网毛片九色 | 中文字幕不卡一区| 精品视频1区2区| 亚洲国产日韩欧美| 国产不卡免费视频| 亚洲一区二区三区爽爽爽爽爽 | 美日韩精品免费| 97se亚洲国产综合在线| 日韩av成人高清| 国产嫩草影院久久久久| 欧美日韩精品专区| 在线不卡欧美| 国产一区 二区 三区一级| 亚洲欧美日韩一区二区| 日韩一区二区免费电影| 蜜桃av久久久亚洲精品| 色综合天天综合狠狠| 日本特黄久久久高潮| 国产精品美女久久久久久久久 | 亚洲一区二区三区四区在线观看 | 亚洲精华国产欧美| av电影天堂一区二区在线观看| 日韩黄色免费网站| 最新热久久免费视频| 欧美精品一区视频| 欧美视频在线观看一区二区| 亚洲精品美女91| 9久草视频在线视频精品| 石原莉奈在线亚洲三区| 亚洲欧美综合网| 26uuu欧美| 欧美日韩国产高清一区二区三区| 亚洲欧美春色| 欧美a级片网站| 国产精品自在欧美一区| 亚洲第一久久影院| 国产精品网友自拍| 日韩免费在线观看| 在线一区二区观看| 亚洲视频综合| 国产高清无密码一区二区三区| 国内成人免费视频| 天天爽夜夜爽夜夜爽精品视频| 欧美经典一区二区| 欧美一级日韩不卡播放免费| 一本色道综合亚洲| 亚洲高清资源综合久久精品| 欧美激情第8页| 成人性生交大片免费看中文网站| 九一久久久久久| 日韩电影在线免费看| 亚洲精品videosex极品| 国产精品无人区| 久久婷婷国产综合国色天香| 日韩一区二区中文字幕| 色94色欧美sute亚洲线路二|