當前位置:首頁 » 存儲配置 » 動態存儲數組

動態存儲數組

發布時間: 2024-09-22 10:26:12

『壹』 java如何實現動態數組

動態數組用ArrayList 它的底層就是動態數組

ArrayList

ArrayList 集合的存取方式和數組操作很類似,可以按照index順序來存取集合中的元素,但是還是建議採用更通用的迭代器來進行ArrayList的遍歷。
ArrayList與數組最大的區別就是它是可變數組,在初始化ArrayList集合的時候,可以指定一個初始化容量(Capacity 集合中可容納元素的數量),不指定的時候,系統會指定一個默認的容量值。當我們向ArrayList集合添加元素的時候,實際上是存放元素數量(size)在不斷的增加,當容量不變,當數量增長到初始容量大小的時候,因為沒有空間導致元素添加阻塞,這時候該集合的容量會按照一定增長策略自動增長,容量增長後,可以繼續向集合中添加元素。可變數組是ArrayList的優點,但從另外一個角度考慮,容量的增長是需要付出額外的代價的,所以在性能上有所損失。性能問題的一種解決思路是我們可以在向集合添加大量元素之前,根據欲添加元素的數量,預先擴充容量,採用的是ensureCapacity方法。
ArrayList是一種線性表,在內存中是連續存儲的,適合於元素的隨機存取。添加和刪除操作是需要依據添加的位置來定,如果在ArrayList最後元素後面添加和刪除元素,在性能方面還算好,但是如果是在ArrayList中間添加和刪除元素的話,代價就會很大。因為,ArrayList需要維護整個集合元素的順序存儲,所以需要處理欲添加和刪除元素位置之後的所有元素。
ArrayList的實現不是線程安全的。也就是說,如果有多個線程同時操作ArrayList集合對象,而且其中至少有一個線程的操作涉及到集合對象中元素的修改(添加和刪除),則該線程內對集合對象操作的方法需要實現同步。這也是ArrayList與Vector的主要區別。在新的集合框架的實現上,基於性能的考慮,大部分的集合設計都是線程不安全的。如果有同步需求,在用戶自己的實現中可以實現同步,實現的方法有2種:
1、在操作集合對象的方法上使用synchronized關鍵字。
2、如果方法不可修改,則可在定義集合的時候,定義同步化的集合對象(採用Collections工具類的方法),類似:
List list = Collection.synchronizedList(new ArrayList(.....));
(此處深入說明下,在採用Iterator遍歷集合的時候,如果有其他線程修改了集合(添加或刪除操作),那麼Iterator的處理會中止並拋出異常,這是集合處理中的Fail-safe特性)
ArrayList提供的方法中,除了Collection和List的公用方法外,又加入了一些新的方法。

ArrayList(int initialCapacity) 構造器方法增加了集合初始化的最小容量
Void ensureCapacity(int minCapacity) 預擴充ArrayList的容量
Void trimToSize() 把集合的Capacity縮小到Size的大小

下面做一個ArrayList小例子:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/**
* @功能:ArrayList的應用小例子
* @author JackRui
* @時間:2009.03.31
*/
public class ArrayListDemo {

public static void main(String[] args) {
//利用ArrayList本身的特性
System.out.println("利用ArrayList本身的特性");
ArrayList list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.remove("bbb");
list.add("ddd");
for (int i=0,lsize=list.size();i<lsize;i++){
System.out.println(list.get(i));
}
//利用Iterator遍歷
System.out.println("利用Iterator遍歷");
Collection clist = new ArrayList();
clist.addAll(list);//添加元素不能採用Iterator介面
Iterator iter = clist.iterator();
while(iter.hasNext()){
String s = (String)iter.next();
if(s.equals("ddd")){
iter.remove();//可以通過Iterator介面對元素進行刪除
}else{
System.out.println(s);
}
}
//利用ListIterator遍歷
System.out.println("利用ListIterator遍歷");
List list2 = new ArrayList();
ListIterator lit = list2.listIterator();
if(!lit.hasNext()){
lit.add("haha");//可以通過ListIterator介面進行集合元素的添加
lit.previous();
System.out.println(lit.next());
}

}

}
運行結果如下:
利用ArrayList本身的特性
aaa
ccc
ddd
利用Iterator遍歷
aaa
ccc
利用ListIterator遍歷
haha

解析:3種方法中,第一種方法不通用,不建議使用。第2種方法最通用,但僅支持單向遍歷,而且對象的添加需要分開實現。第3種方法可以雙向遍歷,而且可以直接使用ListIterator介面來添加對象。

參考資料:http://fusanjiao.javaeye.com/blog/639963
希望能幫到您,O(∩_∩)O謝謝!

熱點內容
C語言項目案例分析 發布:2024-11-24 17:14:48 瀏覽:977
河內塔演算法 發布:2024-11-24 17:03:05 瀏覽:725
為什麼文件夾只讀 發布:2024-11-24 16:56:02 瀏覽:170
無線監控怎麼存儲 發布:2024-11-24 16:46:43 瀏覽:598
英朗買什麼配置 發布:2024-11-24 16:40:44 瀏覽:346
殺戮解壓法 發布:2024-11-24 16:40:36 瀏覽:945
避孕套存儲箱 發布:2024-11-24 16:25:09 瀏覽:735
如何自己搭建雲伺服器干貨 發布:2024-11-24 16:22:08 瀏覽:371
安卓怎麼返回出廠系統 發布:2024-11-24 16:20:32 瀏覽:447
求生之路sp源碼 發布:2024-11-24 16:06:05 瀏覽:373