日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java.util.list 赋值_java.util(ArrayList)

發(fā)布時間:2025/5/22 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java.util.list 赋值_java.util(ArrayList) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

public class ArrayList extends AbstractList

implements List, RandomAccess, Cloneable, java.io.Serializable

{private static final int DEFAULT_CAPACITY = 10; //ArrayList中Object[]中的默認初始容量

private static final Object[] EMPTY_ELEMENTDATA = {}; //空Object[]數(shù)組對象

private transient Object[] elementData; //定義了一個私有的未被序列化的數(shù)組elementData,用來存儲ArrayList的對象列表

private int size; //ArrayList中實際數(shù)據(jù)的數(shù)量

public ArrayList(int initialCapacity) { //帶容量的構造函數(shù)

super();if (initialCapacity < 0)throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);this.elementData = newObject[initialCapacity];

}public ArrayList() { //無參構造函數(shù),默認容量為10,這里的1暫時還沒有設置,在add(E)的時候會指定

super();this.elementData =EMPTY_ELEMENTDATA;

}public booleanadd(E e) {//確保數(shù)組容量足夠添加元素進入數(shù)組

ensureCapacityInternal(size + 1); //Increments modCount!!

elementData[size++] =e;return true;

}private void ensureCapacityInternal(intminCapacity) {if (elementData ==EMPTY_ELEMENTDATA) {

minCapacity=Math.max(DEFAULT_CAPACITY, minCapacity);

}

ensureExplicitCapacity(minCapacity);

}private void ensureExplicitCapacity(intminCapacity) {

modCount++;//overflow-conscious code

if (minCapacity - elementData.length > 0)

grow(minCapacity);

}private void grow(intminCapacity) {//overflow-conscious code

int oldCapacity =elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1); //10->16->25->38->58->88->...

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);//意思就是把原數(shù)組內(nèi)容復制到行數(shù)組上,容量變大了,將引用賦給elementData

}private static int hugeCapacity(intminCapacity) {if (minCapacity < 0) //overflow

throw newOutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :

MAX_ARRAY_SIZE;

}

以上是jdk1.7的描述,結論如下:

ArrayList是基于數(shù)組實現(xiàn)的,是一個動態(tài)數(shù)組,其容量能自動增長;

ArrayList不是線程安全的,只能用在單線程環(huán)境下,多線程環(huán)境下可以考慮用Collections.synchronizedList(List l)函數(shù)返回一個線程安全的ArrayList類,也可以使用concurrent并發(fā)包下的CopyOnWriteArrayList類。

ArrayList實現(xiàn)了Serializable接口,因此它支持序列化,能夠通過序列化傳輸,實現(xiàn)了RandomAccess接口,支持快速隨機訪問,實際上就是通過下標序號進行快速訪問,實現(xiàn)了Cloneable接口,能被克隆。

注意擴充容量的方法ensureCapacity。ArrayList在每次增加元素(可能是1個,也可能是一組)時,都要調(diào)用該方法來確保足夠的容量。當容量不足以容納當前的元素個數(shù)時,就設置新的容量為舊的容量的1.5倍加1,如果設置后的新容量還不夠,則直接新容量設置為傳入的參數(shù)(也就是所需的容量),而后用Arrays.copyof()方法將元素拷貝到新的數(shù)組(詳見下面的第3點)。從中可以看出,當容量不夠時,每次增加元素,都要將原來的元素拷貝到一個新的數(shù)組中,非常之耗時,也因此建議在事先能確定元素數(shù)量的情況下,才使用ArrayList,否則建議使用LinkedList。

ArrayList的數(shù)組擴容調(diào)用了Arrays.copyof(),該方法實際上是在其內(nèi)部又創(chuàng)建了一個長度為newlength的數(shù)組,調(diào)用System.arraycopy()方法,將原來數(shù)組中的元素復制到了新的數(shù)組中。System.arraycopy()方法。該方法被標記了native,調(diào)用了系統(tǒng)的C/C++代碼,在JDK中是看不到的,但在openJDK中可以看到其源碼。該函數(shù)實際上最終調(diào)用了C語言的memmove()函數(shù),因此它可以保證同一個數(shù)組內(nèi)元素的正確復制和移動,比一般的復制方法的實現(xiàn)效率要高很多,很適合用來批量處理數(shù)組。Java強烈推薦在復制大量數(shù)組元素時用該方法,以取得更高的效率。

多線程安全問題分析

private transient Object[] elementData; //定義了一個私有的未被序列化的數(shù)組elementData,用來存儲ArrayList的對象列表

ArrayList內(nèi)部是使用數(shù)組保存元素的,在ArrayList中此數(shù)組即是共享資源,當多線程對此數(shù)據(jù)進行操作的時候如果不進行同步控制,即有可能會出現(xiàn)線程安全問題。

一: add方法可能出現(xiàn)的問題分析

首先我們看一下add的源碼如下:

public booleanadd(E e) {

ensureCapacityInternal(size+ 1); //是否需要擴容

elementData[size++] = e;//賦值

return true;

}

1:下標越界問題

多個線程進入ensureCapacityInternal()并執(zhí)行完畢,此時都不需要擴容,依次賦值時會size+1,所以從第二個開始的線程賦值時其下標很可能超過了容量值,賦值時就報錯了

2:存入的值變?yōu)閚ull

elementData[size++] = e是先賦值再size+1,多線程運行到賦值還沒+1時,size位置上被覆蓋了多次,然后多次+1,size+1,+2等位置沒賦值過,下次就直接從size+n開始賦值,看起來就add了null值一樣,此時不會報錯,因為add時沒有null所以取出時沒做考慮就可能報NullPointerException了.

3.數(shù)據(jù)個數(shù)小于預期值

在多線程操作下 size++不是原子操作,會出現(xiàn)最終數(shù)據(jù)元素個數(shù)小于期望值。

代碼驗證

importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;public classTest4 {private static List list = new ArrayList();private static ExecutorService executorService = Executors.newFixedThreadPool(1000);private static class IncreaseTask extendsThread{

@Overridepublic voidrun() {

System.out.println("ThreadId:" + Thread.currentThread().getId() + " start!");for(int i =0; i < 100; i++){

list.add(i);

}

System.out.println("ThreadId:" + Thread.currentThread().getId() + " finished!");

}

}public static voidmain(String[] args) {for(int i=0; i < 1000; i++){

executorService.submit(newIncreaseTask());

}

executorService.shutdown();while (!executorService.isTerminated()){try{

Thread.sleep(1000*10);

}catch(InterruptedException e){

e.printStackTrace();

}

}

System.out.println("All task finished!");

System.out.println("list size is :" +list.size());

}

}

從以上執(zhí)行結果來看,最后輸出的結果會小于我們的期望值。即當多線程調(diào)用add方法的時候會出現(xiàn)元素覆蓋的問題。

總結

以上是生活随笔為你收集整理的java.util.list 赋值_java.util(ArrayList)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人黄色短片 | 激情小说五月天 | 国产一级免费观看 | 波多野结衣绝顶大高潮 | 91呦呦 | 亚洲天堂网一区 | 欧美三区 | 国模大尺度视频 | 国产成人无码精品久久久性色 | www.日韩在线 | 草草草在线视频 | 热久久免费视频 | 国产一区二区三区视频在线 | 香蕉视频久久久 | 黑人3p波多野结衣在线观看 | 欧美精品一区二区三区久久久竹菊 | 日本体内she精高潮 男女视频在线免费观看 | 日韩在线视频在线观看 | 妓院一钑片免看黄大片 | 成人欧美一区二区三区在线观看 | 最近高清中文在线字幕在线观看 | 波多野结衣视频免费在线观看 | 日韩国产精品一区二区三区 | 国产精品视频在线播放 | 中文av资源 | 亚洲做受高潮无遮挡 | 亚洲乱码国产乱码精品天美传媒 | 亚洲免费a| 狂野欧美性猛交xxxx777 | 国产在线观看免费高清 | 日本少妇大战黑人 | 欧美成人精品欧美一级乱 | 亚洲欧洲中文 | 爱爱综合网 | 亚欧美日韩 | 白石茉莉奈番号 | 男人天堂亚洲 | 黑料福利 | 色婷婷av一区二区 | 免费爱爱网址 | 性色av一区二区三区红粉影视 | 韩日黄色 | 精品日韩一区二区三区四区 | 国产精品传媒一区二区 | 伊人av网| 欧美日韩国产不卡 | av这里只有精品 | 欧美日韩麻豆 | 狐狸视频污 | 91国语对白 | 中国在线观看片免费 | 狠狠五月婷婷 | 午夜在线精品偷拍 | 四虎影院在线免费播放 | 成人黄色片免费 | 久久国产免费看 | 欧美在线日韩 | 欧美狠狠 | jjzz日本女人| 成人无码精品1区2区3区免费看 | 成人在线视频免费播放 | 男人天堂免费视频 | 亚洲 欧美 日韩在线 | 国产成人精品综合久久久久99 | 色臀av | 免费在线观看成年人视频 | 国产精品羞羞答答在线观看 | 国产东北真实交换多p免视频 | 国产xxx在线 | wwwav视频| 国产一区二区激情视频 | 精品日韩一区二区三区 | av一二三区 | 韩漫动漫免费大全在线观看 | 视频福利在线观看 | 牛牛在线免费视频 | 一本av在线 | 免费又黄又爽又猛大片午夜 | 亚欧洲精品视频在线观看 | jizz一区二区 | 成人黄色大全 | 亚洲中文字幕在线观看 | 一久久| 欧美在线资源 | 亚洲国产精品va在线看黑人 | 国产1区2区3区4区 | 蜜桃av在线 | 亚洲成人a v| 欧美一区二区三区在线播放 | 91精品国产一区二区 | 亚洲一区 中文字幕 | ts人妖在线| 国产精品成人99一区无码 | 成人网免费 | 国产激情成人 | 人与禽一级全黄 | 无码人妻少妇色欲av一区二区 | 亚洲成人激情小说 | 日本久久高清视频 |