1. 程式人生 > >關於ArrayList的初始容量以及擴容的效率問題

關於ArrayList的初始容量以及擴容的效率問題

論壇的一個問題:

有這樣一段很簡單的程式碼:
ArrayList <DataVO> a = new ArrayList <DataVO>();

a.addAll(b);
a.addAll(c);

其中DataVO是一個實體類,b和c都是一個ArrayList <DataVO>型別。
如果當b,c資料量很大的時候,請問這樣一段程式碼是不是會很影響效率?

我們看一下ArrayList的原始碼

可見預設的構造器,其呼叫了引數為10的建構函式

這個帶引數的建構函式,初始化了一個長度為初始容量的陣列。

再看看add方法

這裡面的第一行,就是確信當前容量是否能容下新增加的物件

此方法裡,一旦發現容量不足,會自動擴充容量,新的大小是

也就是原有容量的1.5倍+1。然後通過底層的複製方法將原有資料複製過來

總結:

    如果資料量很大,那麼造成陣列重新分配的次數會增加,但對於一般的資料量下,

1千需要分配 11次

1萬一級需要分配17次

10萬 需要分配23次

100萬需要分配28次

所以,大家根據實際情況,大致分配一個初始化的容量還是有必要的。但是如果你初始容量太大,而資料增長很慢,那麼就在浪費記憶體了。

如何取捨,還是看具體的應用場景了。

相關推薦

關於ArrayList初始容量以及擴容效率問題

論壇的一個問題: 有這樣一段很簡單的程式碼: ArrayList <DataVO> a = new ArrayList <DataVO>(); a.addAll(b); a.addAll(c); 其中DataVO是一個實體類,b和c都是

ArrayList的預設初始容量擴容

建一個原陣列的拷貝,並修改原陣列,指向這個新建陣列。原陣列自動拋棄(<a href="https://www.baidu.com/s?wd=java%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6&tn=44039180_cpr&fenlei=mv6quA

List、Map、set的加載因子,默認初始容量擴容增量

nbsp 同步 ble 分配 eat 提高 調用 width 可見 首先,這三個概念說下。初始大小,就是創建時可容納的默認元素個數;加載因子,表示某個閥值,用0~1之間的小數來表示,當已有元素占比達到這個閥值後,底層將進行擴容操作;擴容方式,即指定每次擴容後的大小的規則,比

常用集合的預設初始容量擴容的原因:

常用集合的預設初始容量和擴容的原因: 當底層實現涉及到擴容時,容器或重新分配一段更大的連續記憶體(如果是離散分配則不需要重新分配,離散分配都是插入新元素時動態分配記憶體),要將容器原來的資料全部複製到新的記憶體上,這無疑使效率大大降低。 載入因子的係數小於等於1,意指  即

java之ArrayList初始容量原始碼解析【jdk 1.8】

ArrayList解析 繼承的類和實現的介面 public class ArrayList<E>extends AbstractList<E>implements List<

淺談StringBuffer類初始容量擴容

StringBuffer類可以建立可修改的字串序列。該類有StringBuffer(),StringBuffer(int size),StringBuffer(String s)三個改造方法。 1.S

ArrayList初始容量對效能的影響

package testList; import java.util.ArrayList; public class TestLArrayList { public static void main(String[] args) { System.out.prin

ArrayList、Vector、HashMap、HashTable、HashSet的默認初始容量、加載因子、擴容增量、具體區別

以及 內存 高效率 數組元素 調整 增量 [] key存在 集合 要討論這些常用的默認初始容量和擴容的原因是:當底層實現涉及到擴容時,容器或重新分配一段更大的連續內存(如果是離散分配則不需要重新分配,離散分配都是插入新元素時動態分配內存),要將容器原來的數據全部復制到新的內

ArrayList、Vector、HashMap、HashTable、HashSet的預設初始容量、載入因子、擴容增量

主要是面試被問到了,來記錄一下。 這裡要討論這些常用的預設初始容量和擴容的原因是: 當底層實現涉及到擴容時,容器或重新分配一段更大的連續記憶體(如果是離散分配則不需要重新分配,離散分配都是插入新元素時動態分配記憶體),要將容器原來的資料全部複製到新的記憶體上,這無疑使效率

Java集合類初始容量、加載因子、擴容增量

動態分配內存 數組 線程不安全 可見 LV 加載因子 集合類 一個 arraylist   當底層實現涉及到擴容時,容器或重新分配一段更大的連續內存(如果是離散分配則不需要重新分配,離散分配都是插入新元素時動態分配內存),要將容器原來的數據全部復制到新的內存上,這無疑使效率

ArrayList初始預設容量(長度)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Java基礎複習筆記-----使用ArrayList時設定初始容量的重要性

ArrayList是Java中比較常用的一個類,它底層是基於陣列實現,非執行緒安全,可快速隨機訪問List中的元素。ArrayList具有動態擴容的機制,每次在新增元素時,都會判斷容量是否夠用,如果不夠用,則需要擴容。在JDK1.8中,ArrayList的初始容量為0,第一次新增元素時,會將

集合效能 -- 請為集合ArrayList指定初始容量

package com.sheting.basic.collection.capcity; import java.util.ArrayList; import java.util.List; pu

java容器的預設初始容量、載入因子、擴容增量問題

這裡要討論這些常用的預設初始容量和擴容的原因是: 當底層實現涉及到擴容時,容器或重新分配一段更大的連續記憶體(如果是離散分配則不需要重新分配,離散分配都是插入新元素時動態分配記憶體),要將容器原來的資料全部複製到新的記憶體上,這無疑使效率大大降低。 載入因子的係數

使用ArrayList時設定初始容量的重要性

ArrayList是Java中比較常用的一個類,它是基於陣列實現,非執行緒安全,可快速隨機訪問List中的元素。ArrayList具有動態擴容的機制,每次在新增元素時,都會判斷容量是否夠用,如果不夠用,則需要擴容。JDK1.8中,ArrayList的初始容量為0,第一次新增元

ArrayList初始容量的問題

(所有的圖片的程式碼來源於JDK1.8中的原始碼) 可能很多同學聽到網上其他人說ArrayList的底層陣列elementData的初始化容量是10。 其實並不是!,下圖是我們經常初始化ArrayList使用的構造器: 而DEFAULTCAPA

集合的預設初始容量、載入因子、擴容增量

常用集合的預設初始容量和擴容的原因:        當底層實現涉及到擴容時,容器或重新分配一段更大的連續記憶體(如果是離散分配則不需要重新分配,離散分配都是插入新元素時動態分配記憶體),要將容器原來

ArrayList 和 LinkedList的執行效率比較

bst 輸出 快捷 iteration sting 遍歷 面向對象 循環 集合 一、概念: 一般我們都知道ArrayList* 由一個數組後推得到的 List。作為一個常規用途的對象容器使用,用於替換原先的 Vector。允許我們快速訪問元素,但在從列表中部插入和刪

MySQL初始以及客戶端工具的使用

sock 詳細信息 linux form 關系型 orm ctr create 主機名                       MySQL初始化以及客戶端工具的使用                                             作者:尹正傑 版

Webkit初始以及載入URL過程中各種對象的建立時序以及DOM樹的建立詳情分析

沒有 chrom 本地 .net 時間 詳情 request avi ng-click ? ? ? ? 眾所周知,Webkit須要創建DOM樹。為此它須要創建Web