ArrayList和LinkedList的区别与联系
2017-04-23 19:29
459 查看
ArrayList和Vector使用了数组去实现。
LinkedList使用了链表数据结构
这是两种不同的技术,所以使用它们的时候是有区别的。
1)首先我们来看看增加到List结尾的场景。如果ArrayList的容量在初始化的时候,设置的足够大。那么此时ArrayList的性能是非常好的。但是如果ArrayList的容量是10的话,那么超出了现有的数组的长度是要进行自动扩容的。扩容的公式是 (oldLength * 3 ) / 2 + 1
这就要涉及到大量的数组的复制操作
我们在来看一看LinkedList由于它是链表结构的,所以不需要维护容量的大小,从这点说,他比ArrayList有一定的优势。然而,每次的元素增加都需要新建一个Entry对象,并进行更多的赋值操作。在频繁的系统调用中,对性能会产生一定的影响
下面我们来写个程序测试一下。
2)增加元素到列表任意位置
当增加元素到链表任意位置的时候,LinkedList的优势就体现出来了。因为ArrayList是数组实现的。所以肯定要移动数组元素,而且插入的位置越靠前,性能影响越大。由于LinkedList是链表实现的。所以只需要改变指针指向就可以了。
我们来写个程序来测试下
3)删除任意位置元素
这个跟任意位置插入有点像。
在删除掉后ArrayList是要进行移动的。
并且删除的位置越靠前,开销越大。
4)容量参数
ArrayList是要维护一个容量大小的。如果我们知道我们大概要存放多少的元素。我们应该在ArrayList的构造方法中声明出来。从而减少数组的扩容次数。性能自然就上来了。
5)遍历操作
当我们在遍历的时候,
先上一张图吧
我们也来写个程序测一下
就不上运行截图了,因为等了很久也没有出结果。读者可以复制代码运行下看看
LinkedList使用了链表数据结构
这是两种不同的技术,所以使用它们的时候是有区别的。
1)首先我们来看看增加到List结尾的场景。如果ArrayList的容量在初始化的时候,设置的足够大。那么此时ArrayList的性能是非常好的。但是如果ArrayList的容量是10的话,那么超出了现有的数组的长度是要进行自动扩容的。扩容的公式是 (oldLength * 3 ) / 2 + 1
这就要涉及到大量的数组的复制操作
我们在来看一看LinkedList由于它是链表结构的,所以不需要维护容量的大小,从这点说,他比ArrayList有一定的优势。然而,每次的元素增加都需要新建一个Entry对象,并进行更多的赋值操作。在频繁的系统调用中,对性能会产生一定的影响
下面我们来写个程序测试一下。
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class ListTest { public static void main(String[] args) { ArrayList<String> arrayList = new ArrayList<>(); long arrayListStartTime = System.currentTimeMillis(); for(int i = 0 ; i < 10000 ; i++) { arrayList.add("a" + i); } System.out.println("ArrayList在尾部增加元素消耗了" + (System.currentTimeMillis() - arrayListStartTime)); LinkedList<String> linkedList = new LinkedList<>(); long linkedListStartTime = System.currentTimeMillis(); for(int i = 0 ; i < 10000 ; i++) { linkedList.add("a" + i); } System.out.println("LinkedList在尾部增加元素消耗了" + (System.currentTimeMillis() - linkedListStartTime)); } }
2)增加元素到列表任意位置
当增加元素到链表任意位置的时候,LinkedList的优势就体现出来了。因为ArrayList是数组实现的。所以肯定要移动数组元素,而且插入的位置越靠前,性能影响越大。由于LinkedList是链表实现的。所以只需要改变指针指向就可以了。
我们来写个程序来测试下
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class ListTest { public static void main(String[] args) { ArrayList<String> arrayList = new ArrayList<>(); long arrayListStartTime = System.currentTimeMillis(); for(int i = 0 ; i < 1000000 ; i++) { arrayList.add("a" + i); } System.out.println("ArrayList在尾部增加元素消耗了" + (System.currentTimeMillis() - arrayListStartTime)); LinkedList<String> linkedList = new LinkedList<>(); long linkedListStartTime = System.currentTimeMillis(); for(int i = 0 ; i < 1000000 ; i++) { linkedList.add("a" + i); } System.out.println("LinkedList在尾部增加元素消耗了" + (System.currentTimeMillis() - linkedListStartTime)); System.out.println("====================================="); long addElementInArrayListAnyWhereBegin = System.currentTimeMillis(); for(int i = 0 ; i < 10000 ; i++) { arrayList.add(i, "aaa"); } System.out.println("ArrayList在任意位置插入元素消耗了" + (System.currentTimeMillis() - addElementInArrayListAnyWhereBegin)); long addElementInLinkedListAnyWhereBegin = System.currentTimeMillis(); for(int i = 0 ; i < 10000 ; i++) { linkedList.add(i, "aaa"); } System.out.println("LinkedList在任意位置插入元素消耗了" + (System.currentTimeMillis() - addElementInLinkedListAnyWhereBegin)); } }
3)删除任意位置元素
这个跟任意位置插入有点像。
在删除掉后ArrayList是要进行移动的。
并且删除的位置越靠前,开销越大。
4)容量参数
ArrayList是要维护一个容量大小的。如果我们知道我们大概要存放多少的元素。我们应该在ArrayList的构造方法中声明出来。从而减少数组的扩容次数。性能自然就上来了。
5)遍历操作
当我们在遍历的时候,
先上一张图吧
我们也来写个程序测一下
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class ListTest { public static void main(String[] args) { ArrayList<String> arrayList = new ArrayList<>(); long arrayListStartTime = System.currentTimeMillis(); for(int i = 0 ; i < 1000000 ; i++) { arrayList.add("a" + i); } System.out.println("ArrayList在尾部增加元素消耗了" + (System.currentTimeMillis() - arrayListStartTime)); LinkedList<String> linkedList = new LinkedList<>(); long linkedListStartTime = System.currentTimeMillis(); for(int i = 0 ; i < 1000000 ; i++) { linkedList.add("a" + i); } System.out.println("LinkedList在尾部增加元素消耗了" + (System.currentTimeMillis() - linkedListStartTime)); System.out.println("====================================="); long addElementInArrayListAnyWhereBegin = System.currentTimeMillis(); for(int i = 0 ; i < 10000 ; i++) { arrayList.add(i, "aaa"); } System.out.println("ArrayList在任意位置插入元素消耗了" + (System.currentTimeMillis() - addElementInArrayListAnyWhereBegin)); long addElementInLinkedListAnyWhereBegin = System.currentTimeMillis(); for(int i = 0 ; i < 10000 ; i++) { linkedList.add(i, "aaa"); } System.out.println("LinkedList在任意位置插入元素消耗了" + (System.currentTimeMillis() - addElementInLinkedListAnyWhereBegin)); System.out.println("================================="); StringBuffer stringBuffer = new StringBuffer(); long getAllArrayListBegin = System.currentTimeMillis(); for(int i = 0 ; i < arrayList.size(); i++) { stringBuffer.append(arrayList.get(i)); } System.out.println("遍历ArrayList消耗了" + (System.currentTimeMillis() - getAllArrayListBegin)); long getAllLinkedListBegin = System.currentTimeMillis(); for(int i = 0 ; i < linkedList.size(); i++) { stringBuffer.append(linkedList.get(i)); } System.out.println("遍历LinkedList消耗了" + (System.currentTimeMillis() - getAllLinkedListBegin)); } }
就不上运行截图了,因为等了很久也没有出结果。读者可以复制代码运行下看看
相关文章推荐
- Java中Hashset、HashMap、ArrayList、LinkedList、Vector之间的联系与区别
- ArrayList、LinkedList和Vector三者区别与联系
- ArrayList / LinkedList / Vector之间的区别和联系 cnblog
- Java中Hashset、HashMap、ArrayList、LinkedList、Vector之间的联系与区别
- ArrayList.LinkedList.Vector三者之间的区别与联系
- Java中Hashset、HashMap、ArrayList、LinkedList、Vector之间的联系与区别
- java.util中ArrayList、LinkedList以及Vector它们三者的区别与联系!
- Java中Hashset、HashMap、ArrayList、LinkedList、Vector之间的联系与区别
- java.util中ArrayList、LinkedList以及Vector它们三者的区别与联系
- ArrayList、LinkedList、HashSet、TreeSet间的区别和联系。
- java.util中ArrayList、LinkedList以及Vector它们三者的区别与联系
- ArrayList LinkedList Vector的联系与区别
- ArrayList Vector LinkedList 区别与用法
- ArrayList和LinkedList的大致区别
- ArrayList Vector LinkedList 各种容器的区别与用法
- ArrayList和LinkedList的区别是什么?举例说明LinkedList可实现的功能
- ArrayList Vector LinkedList 区别与用法
- ArrayList Vector LinkedList 区别与用法 [转]
- Java知识点Vector和ArrayList,Hashtable和HashMap,ArrayList和LinkedList的区别
- ArrayList Vector LinkedList 区别与用法