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