ArrayList和LinkedList的区别

痴心易碎 提交于 2019-12-26 11:37:26

ArrayList和LinkedList的区别(Java基础面试题)
面试官问你这个题的关键,是为了考察你的数据结构功底,理解及深入程度。
此处ArrayList和LinkedList是Java语言实现的数据结构,如果你对数组和链表有了解,那这个问题就是简易的。

进入正题,总结几点:

  1. ArrayList的实现是基于数组来实现的,LinkedList的基于双向链表来实现。这两个数据结构的逻辑关系是不一样,当然物理存储的方式也会是不一样。

  2. 对于随机访问,ArrayList优于LinkedList。
    原因:ArrayList基于数组 有独特的索引机制 可以快速查找相对应的数据

  3. 对于插入和删除操作,LinkedList优于ArrayList
    原因: Linked可以从任意位置插入删除,如果在ArrayList的中间插入或删除一个元素,那么这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。

  4. LinkedList比ArrayList更占内存
    原因LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

我们假设现在有10000个元素放置在集合中,在这种情况下对集合做元素操作。

package test;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.lang.Integer;
 
public class P2 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
 
		ArrayList<Integer> arrList = new ArrayList();
		LinkedList<Integer> linList = new LinkedList();
 
		for (int i = 0; i < 10000; i++) {
			arrList.add(i);
			linList.add(i);
		}
		
		System.out.println("ArrayList访问消耗的时间:" + getTime(arrList));
		System.out.println("LinkedList访问消耗的时间:" + getTime(linList));
		
		System.out.println("\nArrayList插入消耗的时间:" + insertTime(arrList));
		System.out.println("LinkedList插入消耗的时间:" + insertTime(linList));
 
		System.out.println("\nArrayList删除消耗的时间:" + delTime(arrList));
		System.out.println("LinkedList删除消耗的时间:" + delTime(linList));
 
	}
 
	public static long getTime(List list) {
		long time = System.currentTimeMillis();
		for (int i = 0; i < 10000; i++) {
			int index = Collections.binarySearch(list, list.get(i));
			if (index != i) {
				System.out.println("ERROR!");
			}
		}
		return System.currentTimeMillis() - time;
	}
 
	public static long insertTime(List list) {
		long time = System.currentTimeMillis();
		for (int i = 0; i < 100000; i++) {
			list.add(10, i); // 在索引为10的位置插入10万元素
		}
		return System.currentTimeMillis() - time;
	}
 
	public static long delTime(List list) {
		long time = System.currentTimeMillis();
		for (int i = 0; i < list.size(); i++) {
			list.remove(i); // 在索引下,逐个删除所有元素
		}
		return System.currentTimeMillis() - time;
	}
}

ArrayList访问消耗的时间:6
LinkedList访问消耗的时间:1296

ArrayList插入消耗的时间:2724
LinkedList插入消耗的时间:23

ArrayList删除消耗的时间:1721
LinkedList删除消耗的时间:17582

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!