ArrayList与LinkedList的运行效率的对比

ArrayList与LinkedList的运行效率的对比

1.ArrayList

1.1.ArrayList的特点:

​ a.ArrayList的底层结构是 动态数组,既然是数组,那么就拥有数组的特点。数组的最重要的特点就是它是连续存储的,有下标的。

​ b.元素可以重复

​ c.有序的。其中,有序是指存放进去的顺序是有序的。跟排序是两不相干的,排序是指对集合中的元素进行排序。

​ d.线程不安全

2.LinkedList

​ 2.1.LinkedList的特点:

​ a.LinkedList的底层结构是双向链表。

​ b.元素可以重复

​ c.有序的。

​ d.线程不安全

3.ArrayList和LinkedList的运行效率。

​ 先看代码: 顺序添加元素到集合中的效率区别:



import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

//顺序存储的时候,ArrayList的效率比LinkedList的效率高.在数据量比较大的时候比较清楚

//iterator 的迭代效率更高

public class TestAdd1 {
	public static void main(String[] args) {
		List alist = new ArrayList();
		List llist = new LinkedList();
		testAdd(alist);
		testAdd(llist);
		System.out.println("---------------------------------------");
		testFor(alist);
		testIterator(alist);
	}

	static int size = 1000000;//数据量
	// 测试存储效率
	public static void testAdd(List list) {
		// 记录开始时间戳
		long start = System.currentTimeMillis();
		
		// 按顺序添加元素
		for (int i = 0; i < size; i++) {
			list.add(i);
		}
		// 结束时间
		long end = System.currentTimeMillis();
		System.out.println("list集合类型中,类型为:" + list.getClass() + "顺序添加" + size + "条数据" + "  的运行时间:" + (end - start) + " ms");
	}

	// 测试遍历效率
	public static void testFor(List list) {
		// 记录开始时间戳
		long start = System.currentTimeMillis();
		for(int i=0;i<size;i++) {
			list.get(i);
		}
		
		// 结束时间
		long end = System.currentTimeMillis();
		System.out.println("for循环遍历 "+size+" 条数据的运行时间: "+(end-start));
	}
	
	public static void testIterator(List list) {
		// 记录开始时间戳
		long start = System.currentTimeMillis();
		for(int i=0;i<size;i++) {
			list.get(i);
		}
		
		// 结束时间
		long end = System.currentTimeMillis();
		System.out.println("Iterator迭代遍历 "+size+" 条数据的运行时间: "+(end-start));
	}
}

ArrayList与LinkedList的运行效率的对比_第1张图片

​ 看下面代码:指定位置添加元素到集合的效率区别



import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

//指定位置添加元素时,LinkedList的效率比ArrayList的效率高

public class TestAdd2 {
	public static void main(String[] args) {
		test(new ArrayList());
		test(new LinkedList());
	}
	
	static int size=100000;
	public static void test(List list) {
		//记录开始时间戳
		long start=System.currentTimeMillis();
		
		//在指定位置上添加元素
		for(int i=0;i<size;i++) {
			list.add(0,i);
		}
		//结束时间
		long end=System.currentTimeMillis();
		System.out.println("list集合类型中,类型为:"+list.getClass()+"指定位置添加"+size+"条数据"+"  的运行时间:"+(end-start)+" ms");
		
	}
}

ArrayList与LinkedList的运行效率的对比_第2张图片

​ 删除集合中的一个元素时ArrayList和LinkedList的效率

​ 当删除的元素位于集合的前面部分



import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

//删除的元素如果在集合的前半段:效率:LinkedList的效率比ArrayList的效率高
//删除的元素如果在集合的后半段:效率:LinkedList的效率比ArrayList的效率高

public class TestRemove1 {
	public static void main(String[] args) {
		test(new ArrayList());
		test(new LinkedList());
	}
	
	public static void test(List list) {
		
		int size=1000000;
		//按顺序添加元素
		for(int i=0;i<size;i++) {
			list.add(i);
		}
		//记录开始时间戳
		long start=System.currentTimeMillis();
		list.remove(2);//位于前面部分
		//结束时间
		long end=System.currentTimeMillis();
		System.out.println("list集合类型中,类型为:"+list.getClass()+"指定位置 删除 元素"+"  的运行时间 :"+(end-start)+" ms");
		
	}
}

ArrayList与LinkedList的运行效率的对比_第3张图片

​ cpu不好,没有用比较大的数据测试,但是从我多次的结果来看,ArrayList的效率还是比LinkedList差。

​ 当删除的元素位于集合的后面部分



import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

//删除的元素如果在集合的前半段:效率:LinkedList的效率比ArrayList的效率高
//删除的元素如果在集合的后半段:效率:LinkedList的效率比ArrayList的效率高

public class TestRemove1 {
	public static void main(String[] args) {
		test(new ArrayList());
		test(new LinkedList());
	}
	
	public static void test(List list) {
		
		int size=2000000;
		//按顺序添加元素
		for(int i=0;i<size;i++) {
			list.add(i);
		}
		//记录开始时间戳
		long start=System.currentTimeMillis();
		list.remove(190000);//位于后面部分
		//结束时间
		long end=System.currentTimeMillis();
		System.out.println("list集合类型中,类型为:"+list.getClass()+"指定位置 删除 元素"+"  的运行时间 :"+(end-start)+" ms");
		
	}
}

ArrayList与LinkedList的运行效率的对比_第4张图片
总体来说,在后半部分删除元素,ArrayList的效率高

总结一下:

1.如果是顺序插入元素,ArrayList的效率比LinkedList高

2.如果是指定位置插入元素,ArrayList的效率比LinkedList低

3.如果是删除集合越前的元素,ArrayList的效率比LinkedList低

4.如果是删除集合越后的元素,ArrayList的效率比LinkedList高

为什么?

1.ArrayList底层是动态数组,有下标。在做插入、删除的时候,快在寻址,但是慢在寻到址之后的数组元素的copy。每添加、或删除一个元素,它后面的元素都要进行移动。

2.LinkedList底层是双向链表,每一个节点都存放了前一个节点和后一个节点的标记。所以在做插入、删除的时候,慢在寻址,快在寻到址之后的操作。只需要改变一下该位置节点的中存放前后节点的标记。

3.插入或删除的元素在越前,ArrayList它需要copy的元素就越多,效率就越慢。而对LinkedList来说速度基本上是一样的。

再次总结一下:

ArrayList比较适合进行频繁的查、改元素的操作

LinkedList比较适合进行频繁的增、删的操作

所以这就是为什么要有这两种的集合。

还有iterator的遍历效率比for循环的高

你可能感兴趣的:(java,链表,数据结构)