ArrayList和LinkedList這兩個(gè)都是List接口的實(shí)現(xiàn)類漠吻,兩者都符合List接口特征允許存儲(chǔ)重復(fù)元素暴构,邏輯上是有序的想暗,允許通過(guò)索引隨機(jī)訪問挨摸,但兩者還是有區(qū)別:
對(duì)于存儲(chǔ)空間上ArrayList是實(shí)現(xiàn)了基于數(shù)組的數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)元素保存在連繼分配的內(nèi)存诲宇,占用空間較小际歼,LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu),除了保存數(shù)據(jù)本身之外姑蓝,還需要保存每個(gè)數(shù)據(jù)元素的前繼和后繼元素引用鹅心。占用內(nèi)存空間較大。
對(duì)于隨機(jī)訪問get和set纺荧,ArrayList性能上優(yōu)于LinkedList旭愧,因?yàn)長(zhǎng)inkedList要從表頭開始搜索。
對(duì)于添加和刪除操作add和remove宙暇,LinedList比較占優(yōu)勢(shì)输枯,因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)。
示例程序演示向兩類列表對(duì)象中插入一條記錄占贫,性能上差別桃熄。
示例代碼:
public class Test {
public static void main(String[] args) {
List aList=new ArrayList();
for(int i=0;i<1000000;i++){
//向aList中添加1000個(gè)字符串
aList.add(i+"");
}
List bList=new LinkedList();
for(int i=0;i<1000000;i++){
//向bListList中添加1000個(gè)字符串
bList.add(i+"");
}
long begin=System.currentTimeMillis();
aList.add(100,"List");
long end=System.currentTimeMillis();
System.out.println("ArrayList添加操作耗時(shí):"+(end-begin));
begin=System.currentTimeMillis();
bList.add(100,"List");
end=System.currentTimeMillis();
System.out.println("LinkedList添加操作耗時(shí):"+(end-begin));
}
}
運(yùn)行程序,結(jié)果如下:
ArrayList添加操作耗時(shí):2
LinkedList添加操作耗時(shí):0