国产美女主播视频一区_国产精品蜜臀在线观看_亚洲成人动漫一区_亚洲视屏在线播放

首頁 > 旅游

基于ArrayList初始化長度的作用及影響

來源:腳本之家 時間:2023-06-24 15:39:25

目錄
一、有無初始容量的區別二、initialCapacity != list.size()總結

平時寫代碼都直接寫

List list = new ArrayList<>();

由于公司做政.府項目,對并發和響應沒有太苛刻的要求,平時就沒有考慮到這一塊。


【資料圖】

今天看同事代碼在new ArrayList<>()的時候帶入初始容量,于是好奇百度一下,講結果記錄下來。

一、有無初始容量的區別

/**
? ? ?* The maximum size of array to allocate.
? ? ?* Some VMs reserve some header words in an array.
? ? ?* Attempts to allocate larger arrays may result in
? ? ?* OutOfMemoryError: Requested array size exceeds VM limit
? ? ?*/
? ? private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
? ??
?? ?/**
? ? ?* Default initial capacity.
? ? ?*/
? ? private static final int DEFAULT_CAPACITY = 10;

?? ?/**
? ? ?* The array buffer into which the elements of the ArrayList are stored.
? ? ?* The capacity of the ArrayList is the length of this array buffer. Any
? ? ?* empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
? ? ?* will be expanded to DEFAULT_CAPACITY when the first element is added.
? ? ?*/
? ? transient Object[] elementData; // non-private to simplify nested class access

?? ?/**
? ? ?* Shared empty array instance used for empty instances.
? ? ?*/
? ? private static final Object[] EMPTY_ELEMENTDATA = {};?? ?

?? ?/**
? ? ?* Constructs an empty list with the specified initial capacity.
? ? ?*
? ? ?* @param ?initialCapacity ?the initial capacity of the list
? ? ?* @throws IllegalArgumentException if the specified initial capacity
? ? ?* ? ? ? ? is negative
? ? ?*/
? ? 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);
? ? ? ? }
? ? }

?? ?/**
? ? ?* Increases the capacity to ensure that it can hold at least the
? ? ?* number of elements specified by the minimum capacity argument.
? ? ?*
? ? ?* @param minCapacity the desired minimum capacity
? ? ?*/
? ? 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);
? ? }

以上是JDK1.8的ArrayList源碼,可以看出,

沒有初始容量的話,在做數據操作的時候ArrayList會自己創建容量,JDK1.8默認為10每次擴容后容量為oldCapacity + (oldCapacity >> 1)容量最大值Integer.MAX_VALUE - 8

由此可以想到,如果存在上千上萬數據量的操作,不初始容量和初始化了合適的容量,處理時間肯定不同,因為初始化和擴容是需要時間的。

測試代碼如下:

public static void main(String[] args) {
? ? final int count = 200 * 10000;
? ? List list = new ArrayList<>();
? ? long begin = System.currentTimeMillis();
? ? for(int i = 0; i < count ; i++) {
? ? ? ? list.add(i);
? ? }
? ? System.out.println("沒有設置ArrayList初始容量: " + (System.currentTimeMillis() - begin) + " ms");

? ? List list2 = new ArrayList<>(10);
? ? long begin2 = System.currentTimeMillis();
? ? for(int i = 0; i < count ; i++) {
? ? ? ? list2.add(i);
? ? }
? ? System.out.println("設置了ArrayList初始容量: " + (System.currentTimeMillis() - begin2) + " ms");
}

輸出:

沒有設置ArrayList初始容量: 96 ms
設置了ArrayList初始容量: 26 ms

分析:

在list.add()方法執行時,先調用ArrayList的:

/**
?* Appends the specified element to the end of this list.
?*
?* @param e element to be appended to this list
?* @return true (as specified by {@link Collection#add})
?*/
public boolean add(E e) {
? ? ensureCapacityInternal(size + 1); ?// Increments modCount!!
? ? elementData[size++] = e;
? ? return true;
}

進入方法:

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

再往下:

private static int calculateCapacity(Object[] elementData, int minCapacity) {
? ? if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {// 第一次add的時候,都會走這一步
? ? ? ? return Math.max(DEFAULT_CAPACITY, minCapacity);//初始化容量小于默認值10都會取10,反之取自定義的容量
? ? }
? ? return minCapacity;
}

擴容方法:

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

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

grow():

/**
?* Increases the capacity to ensure that it can hold at least the
?* number of elements specified by the minimum capacity argument.
?*
?* @param minCapacity the desired minimum capacity
?*/
?private void grow(int minCapacity) {//minCapacity是當前容量,比如,默認容量下,add一次后就是10+1
? ? // 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);
}

總結:

建議初始化容量,減少系統初始化容量的耗時;初始化容量不是越大越好,跟系統配置相關,因為要開辟內存。如果能確定add的總數,以總數作為初始容量效率最高,但這種場景太少了。最佳的設置要兼顧內存空間和擴容次數,我也沒有找到最優解,歡迎大佬補充。盡管不知道初始化多少最快,但是初始化比未初始化快,并且有限的數據量下,設置不同initialCapacity的差距不大。最終,我建議大家初始化容量,并且就寫10(<=10都一樣,看自己喜好)。

上例不同大小初始容量的耗時:

initialCapacitytime
未初始化96
<=1026
10026
100023
10000648
10000024
100000018
10000000609

二、initialCapacity != list.size()

public static void main(String[] args) {
? ? List list = new ArrayList<>(10);
? ? list.set(0, 666);
}

console:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.set(ArrayList.java:448)
at top.chengsw.demo.test.ListTest.main(ListTest.java:25)

此時,list.size() = 0。

也就是說,該構造方法并不是將ArrayList()初始化為指定長度,而是指定了其內部的Object數組的長度,也就是其容量。

當我們調用size()時,返回的是其實際長度,而非容量大小。

對超出ArrayList長度的部分進行訪問或賦值操作時也會造成訪問越界,盡管它的容量大小足夠。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關稿件

基于ArrayList初始化長度的作用及影響

雙重認證是什么意思_雙重認證

瓦格納創始人被控“號召叛亂”,莫斯科啟動反恐,普京將發表講話

當前熱訊:恐拒絕留守,76人慌了!不給大合同,你們會為自己行為付出代價

每日訊息!這兩個人都來玩《晶核》了?我愿稱之為3D版DNF!

苯乙烯商品報價動態(2023-06-24)|環球訊息

世界熱頭條丨2023暑期檔總票房破25億

2023年6月24日硫化鈉價格最新行情預測_觀點

俄羅斯總統普京發表電視講話|焦點快看

天津和平區總工會舉行2023年度快遞行業集體合同簽約儀式|焦點觀察

2023河北經貿大學招生計劃-各專業招生人數是多少

打磨拋光設備全套_打磨拋光設備|環球微動態

做不了主播的薇婭、雪梨,干了同一件事:蓋樓 今日看點

日本2萬億豪賭太陽能新技術,能趕超中國嗎? 世界通訊

世界觀點:環球視點!手持四五十萬預算 GLC長軸距8款車型怎么選

焦點快報!外資企業看好中國 持續增資擴產

永寧街道三舉措扎實開展節前安全大檢查

扶老挈幼觀舟去 飛槳逐浪劈波來——《藝術里的奧林匹克》帶您共賞《觀競渡》中的民族體育盛會|世界播報

消暑熱 清心煩 試試這兩款養生茶 世界時快訊

探訪惠州端午節歷史記憶 熱訊

當前熱議!中德“隱形冠軍”企業齊聚,這場合作交流會聚焦智能制造發展

讓傳統節日綻放時代新韻(今日談)

“留學生被綁架”索要500萬贖金 武漢民警76小時營救_環球最新

當前通訊!阿那亞戲劇節丨導演孟京輝:“勾起人們交流的意愿最重要”

這個新增市場,或達百億美元! 環球快看點

【環球速看料】中國媒體行業:AI應用催化不斷 把握游戲主線 關注C端應用邏輯兌現

倒賣外匯是什么意思(外匯是什么意思)

騰訊湯道生:大模型只是起點,產業落地是AI更大的應用場景

世界要聞:打造“果旅融合”新路徑 小小百香果成為“致富果”“幸福果”

高考考場是在自己學校嗎(高考看考場的那些學問)


主站蜘蛛池模板: 日本最新高清不卡中文字幕V| 国产欧美久久久久| 国产精品亚洲激情| 91免费国产视频| 久久精品国产精品| 日韩欧美精品在线观看视频| 国产精品一 二 三| 免费国产成人av| 亚洲精品女av网站| 国产精品精品视频| 国产一区香蕉久久| 欧美精品在线一区| 高清一区二区三区视频| 久久99久久久久久久噜噜| 日韩中文字幕在线视频观看| 国产自产在线视频一区| 久久资源免费视频| 日产日韩在线亚洲欧美| 午夜精品免费视频| 国产www精品| 国产精品久久久久久av下载红粉| 久久精品国产免费观看| 欧美日韩精品在线一区二区| 日韩av一区二区三区在线观看| 91精品国产自产91精品| 丰满少妇久久久| 国产成人亚洲综合91| 国产精品美女呻吟| 国产美女网站在线观看| 精品国产成人av在线免| 久久精精品视频| 精品国产免费人成电影在线观...| 久久精品最新地址| 日韩视频免费观看| 午夜精品一区二区在线观看的| 亚洲自拍av在线| 国产精品高潮在线| 亚洲精品成人久久久998| www日韩欧美| 成人精品网站在线观看| 久久亚洲国产精品成人av秋霞|