比较ArrayList和LinkedList

比较一:添加内容

涉及方法:add

    public void add_test(){
        List<Person> addlist = new ArrayList<Person>();
        Person p = new Person("阿呆",20);
        long begin = System.currentTimeMillis();
        System.out.println("ArrayList 开始时间:"+begin);
        for(int i=0; i<10000000; i++){
            addlist.add(p);
            // System.out.println("第"+i+"个"+"所用时间:"+(System.currentTimeMillis()-begin));
        }
        long over = System.currentTimeMillis();
        System.out.println("ArrayList 结束时间:"+over);
        System.out.println("ArrayList 最终时间:"+(over-begin));
    }

注:这是ArrayList的测试代码,但是测LinkedList只要把addlist的类型改一下就行,改成LinkedList

结果:

ArrayList

LinkedList

显然在插入10000000条数据时,耗时LinkedList>ArrayList

比较二:获取内容

涉及方法:get、contains、indexOf、lastIndexOf

1、get测试

    public void get_test(){

        //准备工作,添加一堆阿呆,添加一个阿傻
        List<Person> getlist = new ArrayList<Person>();
        Person p = new Person("阿呆",20);
        for(int i=0; i<10000000; i++){
            getlist.add(p);
        }
        Person p2 = new Person("阿傻",20);
        getlist.add(77777,p2);
        System.out.println("添加完成");

        // get 测试
        long begin = System.currentTimeMillis();
        System.out.println("get测试开始时间:"+begin);
        getlist.get(7777777);
        long over = System.currentTimeMillis();
        System.out.println("get测试结束时间:"+over);
        System.out.println("get测试最终时间:"+(over-begin));
   }    

结果

ArrayList

LinkedList

2、contains测试

        // contains 测试
        long begin = System.currentTimeMillis();
        for(int i=0; i<10000; i++){
            getlist.contains(p2);
        }
        long over = System.currentTimeMillis();
        System.out.println("contains测试最终时间:"+(over-begin));

注:只要把上面测试add的那段代码换成这段,就可以测试contains,准备工作的代码不变

结果

ArrayList

LinkedList

3、indexOf测试

        // indexOf 测试
        long begin = System.currentTimeMillis();
        for(int i=0; i<10000; i++){
            getlist.indexOf(p2);
        }
        long over = System.currentTimeMillis();
        System.out.println("indexOf测试最终时间:"+(over-begin));

结果

ArrayList

LinkedList

4、lastIndexOf测试

        // lastIndexOf 测试
        long begin = System.currentTimeMillis();
        for(int i=0; i<100; i++){
            getlist.lastIndexOf(p2);
        }
        long over = System.currentTimeMillis();
        System.out.println("lastIndexOf 测试最终时间:"+(over-begin));

结果

ArrayList

LinkedList

小结:

get:ArrayList < LinkedList,差别很大

contains:ArrayList < LinkedList,差别不那么大,以下两个也是

indexOf:ArrayList < LinkedList

lastIndexOf:ArrayList < LinkedList

比较三:删除内容

涉及方法:remove(根据索引)、remove(根据对象)

1、remove(根据索引)

    public void remove_test(){

        //准备工作,添加一堆阿呆
        List<Person> getlist = new ArrayList<Person>();
        Person p = new Person("阿呆",20);
        for(int i=0; i<10000000; i++){
            getlist.add(p);
        }
        System.out.println("添加完成");

        // remove(int index)  测试
        System.out.println(getlist.size());
        long begin = System.currentTimeMillis();
        for(int i=0; i<10000000; i++){
            getlist.remove(getlist.size()-1);
        }
        long over = System.currentTimeMillis();
        System.out.println("remove(int index)  测试最终时间:"+(over-begin));
        System.out.println(getlist.size());  }

结果

ArrayList

LinkedList

2、remove(根据对象)

        // remove(Object o)   测试
        System.out.println(getlist.size());
        long begin = System.currentTimeMillis();
        for(int i=0; i<999; i++){
            getlist.remove(p);
        }
        long over = System.currentTimeMillis();
        System.out.println("remove(Object o)   测试最终时间:"+(over-begin));
        System.out.println(getlist.size());

结果

ArrayList

LinkedList

小结:

remove(根据索引):ArrayList < LinkedList,差别不大

remove(根据对象):ArrayList > LinkedList,差别非常大

进一步

在插入内容时候:根据有无指定插入位置

ArrayList

LinkedList

在获取内容的时候,根据索引位置在整个集合的前面、中间、后面的不同

ArrayList

LinkedList

在移除内容的时候,根据索引位置在整个集合的前面、中间、后面的不同

ArrayList

LinkedList

小结:

在插入内容时候:根据有无指定插入位置,

ArrayList:有索引更慢

LinkedList:差不多

在获取内容的时候,根据索引位置在整个集合的前面、中间、后面的不同

ArrayList:差不多

LinkedList:索引越后面越慢

在移除内容的时候,根据索引位置在整个集合的前面、中间、后面的不同

ArrayList:差不多

LinkedList:索引越后面越慢

时间: 2024-10-29 10:45:41

比较ArrayList和LinkedList的相关文章

Java中ArrayList和LinkedList区别

一般大家都知道ArrayList和LinkedList的大致区别:      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针.      3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据. ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用

java的List接口的实现类 ArrayList,LinkedList,Vector 的区别

Java的List接口有3个实现类,分别是ArrayList.LinkedList.Vector,他们用于存放多个元素,维护元素的次序,而且允许元素重复. 3个具体实现类的区别如下: 1. ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中.当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制.移动.代价比较高.因此,它

ArrayList和LinkedList的区别

从字面上大概可以猜出ArrayList是用数组实现的的一种数据结构:LinkedList采用链表实现.那么要剖析区别的话大概可以概括到数组和链表的区别.结合在数据结构课上所学,我大概可以猜出几点区别,无外乎数组采用连续的内存空间存储数据,链表中用到了引用,那么存储的内容可以不在连续的内存空间里.以上是假如不会ArrayList和LinkedList的前提下做的假设.实际上两者主要区别有三点. 1.ArrayList是使用动态数组实现的数据结构,LinkedList使用双链表实现   2.Arra

List、ArrayList、LinkedList的区别及使用

首先我们要知道List是java中的接口,而不是实现类,所以它是不能实例化的,例如以下代码: 1 public static void main(String[] args) { 2 List list=new List(); 3 4 } java中会报错,而ArrayList和LinkedList是实现了这个接口的实现类,可以进行实例化,其定义如下: 1 public static void main(String[] args) { 2 3 ArrayList list1=new Array

Java中arraylist和linkedlist源代码分析与性能比較

Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arraylist和linkedlist的性能. 2,arraylist源代码分析 Arraylist底层的数据结构是一个对象数组.有一个size的成员变量标记数组中元素的个数,例如以下图: * The array buffer into which the elements of the ArrayLis

JAVA集合类之ArrayList和LinkedList性能比较

关于ArrayList和LinkedList这两个集合类的性能,网上很多文章表示:ArrayList的插入性能要比LinkedList差.今天突然想测试下,这个结论是否准确. 编写了如下代码: import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class Demo { public static void main(String[] args) { int count = 

ArrayList和LinkedList

ArrayList,LinkedList 首先提一下LinkedList,ArrayList的定义概念: ArrayList:ArrayList其实是包装了一个数组 Object[],当实例化一个ArrayList时,一个数组也被实例化,当向ArrayList中添加对象是,数组的大小也相应的改变. 优点: 快速随即访问 你可以随即访问每个元素而不用考虑性能问题,通过调用get(i)方法来访问下标为i的数组元素. 缺点:      向其中添加对象速度慢 当你创建数组是并不能确定其容量,所以当改变这

ArrayList vs. LinkedList vs. Vector

翻译自:ArrayList vs. LinkedList vs. Vector 1.列表概览 就像它的名字一样,List是一个元素的有序序列.当我们讨论列表时把它与Set(两两不等且无序的元素集合)进行比较是一个好主意.下面是容器的类层次图.从这个层次图中可以了解Java容器的一般概念. 2.ArrayList vs. LinkedList vs. Vector 从上图可知,它们都实现了List接口,而且用法很相似.它们主要的不同在于它们的实现导致的对不同的操作有不同的性能. ArrayList

ArrayList,Vector,LinkedList的存储性能和特征

ArrayListh和Vector都是采用数组的方式来存储数据,其中ArrayList是线程不安全的,Vector是线程安全,所以ArrayList的性能要比Vector的性能好一些,而LinkedList采用的双向链表来实现数据的存储,而且是线程不安全的,而且LinkedList提供了一些方法,使得LinkedList可以被当做栈和队列来使用.因为ArrayList和Vector采用的数组的方式来实现存储数据,所以查询数据比较快捷,但是进行数据增删操作比较慢些,但是LinkedList采用的事

java学习笔记--类ArrayList和LinkedList的实现

在集合Collection下的List中有两个实现使用的很频繁,一个是ArrayList,另一个是LinkedList,在学习中肯定都会有这样的疑问:什么时候适合使用ArrayList,什么时候用LinkedList?这时,我们就需要了解ArrayList和LinkedList的底层的实现,下面,为了更好的了解它们具体是怎样实现的,我们来写自己的ArrayList 和LinkedList. ArrayList底层是基于数组实现的,数组在内存中是存储在连续的存储单元中,在数据查找的时候比较快,适用