ArrayList和LinkedList的区别

一般来说,大家都知道ArrayList和LinkedList的一般区别:

1.ArrayList是基于动态数组的数据结构,LinkedList是基于链表的数据结构。

2.对于get和set的随机访问,ArrayList优于LinkedList,因为LinkedList移动指针。

3.对于添加和删除操作,LinedList更占优势,因为ArrayList要移动数据。

这个要看实际情况。如果只插入或删除一段数据,ArrayList比LinkedList快。但是如果数据是随机插入,批量删除的话,LinkedList的速度要比ArrayList好很多,因为ArrayList每插入一段数据,插入点之后的所有数据都要移动。对此我做了一个实验。将20000个数据分别插入到有200000条“记录”的ArrayList和LinkedList的第一位,LinkedList的耗时约为ArrayList的1。

for(int m = 0;m & lt20000;m++){

linkedlist.add(m,null);//在200000条数据之前插入20000条数据时,LinkedList只需要1125 ms多,这就是LinkedList的优势。

}

长时间4 =新Dte()。getTime();

system . out . print(" batch linked list add:");

system . out . println(time 4-time 3);

for(int n = 0;n & lt20000;n++){

arraylist.add(n,null);//在20万条数据之前插入2万条数据时,arraylist耗时超过18375 ms,耗时是ArrayList的近20倍(取决于测试时机器的性能)。

}

长时间5 =新日期()。getTime();

System.out.print("批处理ArrayList add:");

system . out . println(time 5-time 4);

4.搜索操作,如indexOf、lastIndexOf、contains等。几乎是一样的。

5.随机查找指定节点的操作get,ArrayList比LinkedList快。

这只是理论上的分析。事实上,如果在末尾插入和删除数据,ArrayList就一定比LinkedList快。我做了一个插入和删除20万条数据的实验。

长时间1 =新日期()。getTime();

String s 1 =(String)linked list . get(100000);//总记录200000条,加载linkedlist需要100000条数据,从15到32 ms不等。

长时间2 =新日期()。getTime();

system . out . println(time 2-time 1);

String S2 =(String)ArrayList . get(100000);//总记录为200000条,linkedlist加载第100000条数据需要0ms。

长时间3 =新日期()。getTime();

system . out . println(time 3-time 2);

/*分别在linkedlist和arraylist中插入200000条数据。

*因为数据是在末尾插入的,所以arraylist比linkedlist快。

*/

public static void insert list(linked list linklist,ArrayList arraylist) {

长时间1 =新日期()。getTime();

system . out . println(time 1);

for(int I = 0;我& lt200000;i++) {

linklist.add(i," linklist "+I);

}

长时间2 =新日期()。getTime();

system . out . println(time 2-time 1);

for(int j = 0;j & lt200000;j++) {

arraylist.add(j," ArrayList "+j);

}

长时间3 =新日期()。getTime();

system . out . println(time 3-time 2);

}

/* DeleteLinkedList和arraylist中的20万条数据。

*因为数据是最后删除的,所以arraylist比linkedlist快。

*/

public static void delete list(linked list linklist,ArrayList arraylist) {

长时间1 =新日期()。getTime();

system . out . println(time 1);

for(int I = 199999;我& gt= 0;我- ) {

linklist . remove(I);

}

长时间2 =新日期()。getTime();

system . out . println(time 2-time 1);

for(int j = 199999;j & gt= 0;j - ) {

ArrayList . remove(j);

}

长时间3 =新日期()。getTime();

system . out . println(time 3-time 2);

}

公共静态void main(String args[]) {

linked list linked list = new linked list();

ArrayList ArrayList = new ArrayList();

insertList(linkedlist,ArrayList);

//下面的代码省略。

插入:

链接列表578毫秒

数组列表437毫秒

删除:

linked list 31毫秒

数组列表16ms