日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产永久精品大片wwwapp | 国产人免费人成免费视频 | 日韩专区在线播放 | 少妇姐姐 | 夜久久久| 花房姑娘免费观看全集 | 久久精品老司机 | 亚洲干 | 黄色av网站在线看 | 日韩一区二区毛片 | 欧美日韩一级黄色片 | xxx一区二区| 欢乐谷在线观看免费播放高清 | 午夜小影院 | 日韩黄色影院 | 国产超碰人人模人人爽人人添 | 奇米影视999 | 国产又色又爽又黄 | 中文字幕婷婷 | 国产欧美一区二区三区视频 | 四虎激情 | 日韩精品免费视频 | 涩涩网站在线看 | 日本成人久久 | 欧美精品一区二区成人 | 精品人妻一区二区三区久久 | 少妇高潮伦 | 免费a视频在线观看 | 一道本一区二区 | 黄视频免费在线看 | 色黄视频网站 | 国产xxxxxxxxx| 2014亚洲天堂 | av大片网 | 亚洲国产成人精品一区二区三区 | 亚洲成人一区在线 | 黄色字幕网 | 男生和女生操操 | 无码精品人妻一区二区 | 有码在线视频 | 玖玖免费| 黄色av毛片| 亚洲一区二区视频在线 | av卡一卡二| av黄色片在线观看 | 成人在线观看视频网站 | 国产不卡毛片 | 日韩不卡视频在线 | 国产小视频网址 | 在线观看av中文字幕 | 欧美在线性爱视频 | 黄色一级片在线 | 午夜精品一区二区三区在线 | 国产精品一区二区av白丝下载 | 欧美国产精品久久 | 日韩性高潮 | 国产手机在线播放 | 婷婷久久一区 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲精品乱码久久久久久蜜桃欧美 | 中文字幕免费在线看线人动作大片 | 免费久久一级欧美特大黄 | h成人在线| 天天夜碰日日摸日日澡性色av | 国产精品久久久久久久久久久久久久久 | 成人a免费 | 九色首页 | 国产区视频在线 | 亚洲视频在线观看网址 | 国产伦精品一区二区三 | 黄色特级片 | 国产成人精品777777 | xxx69美国| 日日拍拍 | 特黄在线 | 精品交短篇合集 | 息与子五十路翔田千里 | 久久精品一区二区三区四区 | 日本性生活一级片 | 精品中文字幕在线 | 五月婷婷视频 | 亚洲精品二区三区 | 91福利影院 | 亚洲欧美日本在线观看 | 中文字幕色 | 91麻豆精品国产理伦片在线观看 | 国产精品久久国产愉拍 | 国产丝袜网站 | 欧美日韩在线观看视频 | 97人妻天天摸天天爽天天 | 国产精品欧美性爱 | 波多野结衣在线观看一区 | 天天操夜夜草 | 91免费网站视频 | 成人午夜av在线 | 久久av导航 | 色一涩| 中文字幕一二三区 | 五月婷婷激情综合 |