Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
来源:互联网 发布:hbuilder 商城app源码 编辑:程序博客网 时间:2024/06/05 16:15
一般大家都知道ArrayList和LinkedList的大致区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。例如我们可以用ArrayList来存储一系列的String或者Integer。那么ArrayList和LinkedList在性能上有什么差别呢?什么时候应该用ArrayList什么时候又该用LinkedList呢?
一.时间复杂度
首先一点关键的是,ArrayList的内部实现是基于基础的对象数组的,因此,它使用get方法访问列表中的任意一个元素时(random access),它的速度要比LinkedList快。LinkedList中的get方法是按照顺序从列表的一端开始检查,直到另外一端。对LinkedList而言,访问列表中的某个指定元素没有更快的方法了。
假设我们有一个很大的列表,它里面的元素已经排好序了,这个列表可能是ArrayList类型的也可能是LinkedList类型的,现在我们对这个列表来进行二分查找(binary search),比较列表是ArrayList和LinkedList时的查询速度,看下面的程序:
package com.mangocity.test;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class TestList …{
public static final int N=50000;
public static List values; static...{ Integer vals[]=new Integer[N]; Random r=new Random(); for(int i=0,currval=0;i<N;i++)...{ vals=new Integer(currval); currval+=r.nextInt(100)+1; } values=Arrays.asList(vals); } static long timeList(List lst)...{ long start=System.currentTimeMillis(); for(int i=0;i<N;i++)...{ int index=Collections.binarySearch(lst, values.get(i)); if(index!=i) System.out.println("***错误***"); } return System.currentTimeMillis()-start; } public static void main(String args[])...{ System.out.println("ArrayList消耗时间:"+timeList(new ArrayList(values))); System.out.println("LinkedList消耗时间:"+timeList(new LinkedList(values))); }
}
我得到的输出是:ArrayList消耗时间:15
LinkedList消耗时间:2596
这个结果不是固定的,但是基本上ArrayList的时间要明显小于LinkedList的时间。因此在这种情况下不宜用LinkedList。二分查找法使用的随机访问(random access)策略,而LinkedList是不支持快速的随机访问的。对一个LinkedList做随机访问所消耗的时间与这个list的大小是成比例的。而相应的,在ArrayList中进行随机访问所消耗的时间是固定的。
这是否表明ArrayList总是比LinkedList性能要好呢?这并不一定,在某些情况下LinkedList的表现要优于ArrayList,有些算法在LinkedList中实现时效率更高。比方说,利用Collections.reverse方法对列表进行反转时,其性能就要好些。
看这样一个例子,加入我们有一个列表,要对其进行大量的插入和删除操作,在这种情况下LinkedList就是一个较好的选择。请看如下一个极端的例子,我们重复的在一个列表的开端插入一个元素:
package com.mangocity.test;
import java.util.*;
public class ListDemo {
static final int N=50000;
static long timeList(List list){
long start=System.currentTimeMillis();
Object o = new Object();
for(int i=0;i
- Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
- Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
- ArrayList 与LinkedList 复杂度
- ArrayList和LinkedList的时间复杂度
- 时间复杂度与空间复杂度
- 时间复杂度与空间复杂度
- 时间复杂度与空间复杂度
- 时间复杂度与空间复杂度
- 时间复杂度与空间复杂度
- 时间复杂度与空间复杂度
- 时间复杂度与空间复杂度
- 时间复杂度与空间复杂度
- 时间复杂度与空间复杂度
- 时间复杂度与空间复杂度
- 时间复杂度与空间复杂度
- 空间复杂度与时间复杂度
- 时间复杂度与空间复杂度
- 时间复杂度与空间复杂度
- 膝关节前交叉韧带重建术后取钉记
- jquery追加元素的方法
- MyBatis之控制台输出sql-yellowcong
- 正确学习方法
- More Effective C++ 30. Proxy classes
- Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
- JAVA简述
- (洛谷 1908)逆序对
- android 什么时候用总线模式合适?
- 下载gradle地址
- Oracle 12c创建用户时为什么要在用户名前加”C##"?
- 责任链模式和状态模式对比
- 购物车的activity
- Spring Cloud Eureka 服务注册与发现