Java中ArrayList和LinkedList之间的区别_动力节点Java学院整理

 更新时间:2017年05月04日 15:20:49   投稿:lijiao  
这篇文章主要为大家详细介绍了Java中ArrayList和LinkedList之间的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、ArrayList

ArrayList是一个可以处理变长数组的类型,这里不局限于“数”组,ArrayList是一个泛型类,可以存放任意类型的对象。顾名思义,ArrayList是一个数组列表,因此其内部是使用一个数组来存放对象的,因为Object是一切类型的父类,因而ArrayList内部是有一个Object类型的数组类存放对象。ArrayList类常用的方法有add()、clear()、get()、indexOf()、remove()、sort()、toArray()、toString()等等,同时ArrayList内部有一个私有类实现Iterator接口,因此可以使用iterator()方法得到ArrayList的迭代器,同时,还有一个私有类实现了ListIterator接口,因此ArrayList也可以调用listIterator()方法得到ListIterator迭代器。
由于ArrayList是依靠数组来存放对象的,只不过封装起来了而已,因此其一些查找方法的效率都是O(n),跟普通的数组效率差不多,只不过这个ArrayList是一个可变”数组“,并且可以存放一切指定的对象。
另外,由于ArrayList的所有方法都是默认在单一线程下进行的,因此ArrayList不具有线程安全性。若想在多线程下使用,应该使用Colletions类中的静态方法synchronizedList()对ArrayList进行调用即可。

二、LinkedList

LinkedList可以看做为一个双向链表,所有的操作都可以认为是一个双向链表的操作,因为它实现了Deque接口和List接口。同样,LinkedList也是线程不安全的,如果在并发环境下使用它,同样用Colletions类中的静态方法synchronizedList()对LinkedList进行调用即可。

在LinkedList的内部实现中,并不是用普通的数组来存放数据的,而是使用结点<Node>来存放数据的,有一个指向链表头的结点first和一个指向链表尾的结点last。不同于ArrayList只能在数组末尾添加数据,LinkList可以很方便在链表头或者链表尾插入数据,或者在指定结点前后插入数据,还提供了取走链表头或链表尾的结点,或取走中间某个结点,还可以查询某个结点是否存在。add()方法默认在链表尾部插入数据。总之,LinkedList提供了大量方便的操作方法,并且它的插入或增加等方法的效率明显高于ArrayList类型,但是查询的效率要低一点,因为它是一个双向链表。

因此,LinkedList与ArrayList最大的区别是LinkedList更加灵活,并且部分方法的效率比ArrayList对应方法的效率要高很多,对于数据频繁出入的情况下,并且要求操作要足够灵活,建议使用LinkedList;对于数组变动不大,主要是用来查询的情况下,可以使用ArrayList。

import java.util.* ; 
public class ListDemo01{ 
  public static void main(String args[]){ 
    List<Integer> li = new LinkedList<Integer>() ; 
    long startTime = System.currentTimeMillis() ; 
    for(int i=0;i<1000000;i++){ 
      li.add(0,i) ;        //print : 803 
      //li.add(i) ;        //print : 790 
    } 
    long endTime = System.currentTimeMillis() ; 
    System.out.println(endTime-startTime) ; 
  } 
} 

下面的代码得不出结果速度太慢

import java.util.* ; 
public class ListDemo01{ 
  public static void main(String args[]){ 
    List<Integer> li = new LinkedList<Integer>() ; 
    for(int i=0;i<1000000;i++){ 
      li.add(0,i) ;        //print : 803 
      //li.add(i) ;        //print : 790 
    } 
    long startTime = System.currentTimeMillis() ; 
    for(int i=0;i<1000000;i++){ 
      li.get(i) ; 
    } 
    long endTime = System.currentTimeMillis() ; 
    System.out.println(endTime-startTime) ; 
  } 
} 

下面化成ArrayList速度就超快

import java.util.* ; 
public class ListDemo01{ 
  public static void main(String args[]){ 
    List<Integer> li = new ArrayList<Integer>() ; 
    for(int i=0;i<1000000;i++){ 
      li.add(i) ;        
    } 
    long startTime = System.currentTimeMillis() ; 
    for(int i=0;i<1000000;i++){ 
      li.get(i) ;   //print : 15     
    } 
    long endTime = System.currentTimeMillis() ; 
    System.out.println(endTime-startTime) ; 
  } 
} 

remove方法对LinkedList类的使用

a.利用iterator类

import java.util.* ; 
public class ListDemo01{ 
  public static void main(String args[]){ 
    List<Integer> li = new LinkedList<Integer>() ; 
    for(int i=0;i<1000000;i++){ 
      li.add(i) ;        
    } 
    long startTime = System.currentTimeMillis() ; 
    Iterator<Integer> it = li.iterator() ; 
    while(it.hasNext()){ 
      if(it.next()%2==0){ 
        it.remove() ; 
      } 
    } 
    long endTime = System.currentTimeMillis() ; 
    System.out.println(endTime-startTime) ; 
  } 
} 

b.不利用iterator的话则则需要调用get方法。则效率很低

import java.util.* ; 
public class ListDemo01{ 
  public static void main(String args[]){ 
    List<Integer> li = new LinkedList<Integer>() ; 
    for(int i=0;i<1000000;i++){ 
      li.add(i) ;        
    } 
    long startTime = System.currentTimeMillis() ; 
    for(int i=0;i<10000;i++){ 
      if(li.get(i)%2==0){ 
        li.remove(i) ; 
      } 
    } 
    long endTime = System.currentTimeMillis() ; 
    System.out.println(endTime-startTime) ; 
  } 
} 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • JAVA操作MongoDB数据库实例教程

    JAVA操作MongoDB数据库实例教程

    MongoDB是一个文档型数据库,是NOSQL家族中最重要的成员之一,下面这篇文章主要给大家介绍了关于JAVA操作MongoDB数据库的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Java使用正则表达式检索、替换String中特定字符和正则表达式的一切

    Java使用正则表达式检索、替换String中特定字符和正则表达式的一切

    这篇文章主要给大家介绍了关于Java使用正则表达式检索、替换String中特定字符和正则表达式的一切,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java数据结构及算法实例:插入排序 Insertion Sort

    Java数据结构及算法实例:插入排序 Insertion Sort

    这篇文章主要介绍了Java数据结构及算法实例:插入排序 Insertion Sort,本文直接给出实例代码,代码中包含详细注释,需要的朋友可以参考下
    2015-06-06
  • Java中的自旋锁与适应性自旋锁详解

    Java中的自旋锁与适应性自旋锁详解

    这篇文章主要介绍了Java中的自旋锁与适应性自旋锁详解,在多处理器环境中某些资源的有限性,有时需要互斥访问,这时候就需要引入锁的概念,只有获取了锁的线程才能对资源进行访问,多线程的核心是CPU的时间分片,所以同一时刻只能有一个线程获取到锁,需要的朋友可以参考下
    2023-10-10
  • 简单总结Java的反射机制的运用

    简单总结Java的反射机制的运用

    这篇文章主要介绍了Java的反射机制的运用,对一些常用的类作了一些说明,需要的朋友可以参考下
    2015-11-11
  • maven deploy时报错的解决方法

    maven deploy时报错的解决方法

    这篇文章主要介绍了maven deploy时报错的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java如何实现递归删除树形数据的任一个节点

    java如何实现递归删除树形数据的任一个节点

    文章讲述了在Java中实现递归删除树形数据的任一个节点时需要注意的三个点,包括删除的节点包含子节点、删除子节点和其他子节点删除的节点不包含子节点、以及该父节点变成叶子节点,此外,文章还提到这两件事包含在同一件事务中
    2024-12-12
  • java仿Servlet生成验证码实例详解

    java仿Servlet生成验证码实例详解

    这篇文章主要介绍了java仿Servlet生成验证码实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • 微信小程序与AspNetCore SignalR聊天实例代码

    微信小程序与AspNetCore SignalR聊天实例代码

    这篇文章主要介绍了微信小程序与AspNetCore SignalR聊天实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • 通过openOffice将office文件转成pdf

    通过openOffice将office文件转成pdf

    这篇文章主要介绍了通过openOffice将office文件转成pdf,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11

最新评论