ArrayList、LinkedList、Vector和Stack的区别

版权声明:转载请注明出处 https://blog.csdn.net/qq_40162735/article/details/82626678

List的框架图

区别如下:

  • ArrayList  是一个数组队列,实现了基于动态数组的数据结构,对于随机访问效率高,随机增加和随机删除效率低,ArrayList是非线程安全的
  • LinkedList  则是基于双向链表的数据结构,也可以当做堆栈、队列、双端队列,对于随机访问效率低,随机增加和随机删除效率高,LinkedList是非线程安全的
  • Vector 是矢量队列,和ArrayList一样,它是一个动态数组,由数组实现,Vector是线程安全的
  • Stack 是栈,它是继承于Vector,特点:先进后出 FILO

使用场景:

  • 对于需要快速随机访问元素及单线程环境使用非同步的ArrayList
  • 对于需要快速插入和删除元素时使用LinkedList
  • 对于多线程环境使用同步的Vector

以下是性能测试代码,输出ArrayList、LinkedList、Vector和Stack在随机访问、增加及删除所花费的时间

package com.demo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
import java.util.Vector;

/**
 * @author DevinLiu
 */
public class ListCompareTest {
	
	private static final int COUNT = 100000;

	private static ArrayList arrayList = new ArrayList();
	
	private static LinkedList linkedList = new LinkedList();
	
	private static Vector vector = new Vector();
	
	private static Stack stack = new Stack();
	
	
	public static void main(String[] args) {
		
		System.out.println();
		//插入数据
		insertByPosition(stack);
		insertByPosition(vector);
		insertByPosition(arrayList);
		insertByPosition(linkedList);
		
		System.out.println();
		//查询数据
		findByPosition(stack);
		findByPosition(vector);
		findByPosition(arrayList);
		findByPosition(linkedList);
		
		System.out.println();
		//删除数据
		deleteByPosition(stack);
		deleteByPosition(vector);
		deleteByPosition(arrayList);
		deleteByPosition(linkedList);
	}
	
	//获取list名称
	private static String getListName(List list){
		
		if(list instanceof LinkedList){
			return "LinkedList";
		}else if(list instanceof ArrayList){
			return "ArrayList";
		}else if(list instanceof Stack){
			return "Stack";
		}else if(list instanceof Vector){
			return "Vector";
		}else{
			return "List";
		}
	}
	
	//向List指定位置插入COUNT数据,并且统计时间
	private static void insertByPosition(List list){
		
		long startTime=System.currentTimeMillis();
		
		//向List的位置0插入COUNT数
		for (int i = 0; i < COUNT; i++) {
			list.add(0,i);
		}
		
		long stopTime=System.currentTimeMillis();
		
		long time=stopTime-startTime;
		
		System.out.println(getListName(list)+"插入"+COUNT+"需要的时间为:"+time+"ms");
		
	}
	
	//向List指定位置删除COUNT数据,并且统计时间
	private static void deleteByPosition(List list){
		
		long startTime=System.currentTimeMillis();
		
		for (int i = 0; i < COUNT; i++) {
			list.remove(0);
		}
		
		long stopTime=System.currentTimeMillis();
		
		long time=stopTime-startTime;
		
		System.out.println(getListName(list)+"删除"+COUNT+"需要的时间为:"+time+"ms");
		
	}
	//不断从list中取出元素,并统计时间
	private static void findByPosition(List list){
		
		long startTime=System.currentTimeMillis();
		
		for (int i = 0; i < COUNT; i++) {
			list.get(i);
		}
		
		long stopTime=System.currentTimeMillis();
		
		long time=stopTime-startTime;
		
		System.out.println(getListName(list)+"查询"+COUNT+"需要的时间为:"+time+"ms");
	}
	

}

运行结果如下:


Stack插入100000需要的时间为:4454ms
Vector插入100000需要的时间为:4826ms
ArrayList插入100000需要的时间为:3967ms
LinkedList插入100000需要的时间为:16ms

Stack查询100000需要的时间为:24ms
Vector查询100000需要的时间为:27ms
ArrayList查询100000需要的时间为:10ms
LinkedList查询100000需要的时间为:29332ms

Stack删除100000需要的时间为:5152ms
Vector删除100000需要的时间为:4474ms
ArrayList删除100000需要的时间为:5442ms
LinkedList删除100000需要的时间为:25ms

    当插入10万元素时:LinkedList 所花时间最短:16ms

    当遍历10万元素时:LinkedList 所花时间最长:29332ms,而ArrayList、Vector及Stack花费时间差不多

    当删除10万元素时:LinkedList 所花时间最短:25ms

得出结论:

  •     对于快速插入、删除元素,则使用LinkedList
  •     对于快速随机访问元素,则使用ArrayList

参考文献

        http://www.cnblogs.com/skywang12345/p/3308900.html

 

展开阅读全文

没有更多推荐了,返回首页