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

作者:lijiao 时间:2023-03-30 18:16:29 

一、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,ArrayList,LinkedList
0
投稿

猜你喜欢

  • Java 数据结构之删除链表中重复的结点

    2023-11-28 15:36:22
  • SpringBoot整合Echarts实现用户人数和性别展示功能(详细步骤)

    2023-02-22 00:31:59
  • 详解Spring中的Environment外部化配置管理

    2023-11-23 05:24:24
  • 基于Android Service 生命周期的详细介绍

    2021-09-11 08:11:42
  • Spring的@Value如何从Nacos配置中心获取值并自动刷新

    2022-03-11 02:17:03
  • c++难以发现的bug(有趣)

    2022-01-27 17:01:41
  • VS2013创建Windows服务与调试服务的图文方法

    2022-01-15 02:23:14
  • MyBatis关闭一级缓存的两种方式(分注解和xml两种方式)

    2023-09-02 10:18:59
  • java遍历读取xml文件内容

    2023-11-12 09:59:09
  • Java单例模式利用HashMap实现缓存数据

    2021-12-15 20:21:42
  • 对dbunit进行mybatis DAO层Excel单元测试(必看篇)

    2023-08-19 02:37:19
  • Java生成word文档的示例详解

    2022-02-11 19:37:47
  • C# TabControl手动触发DrawItem的实现

    2023-12-27 17:01:27
  • Java基于Runtime调用外部程序出现阻塞的解决方法

    2023-11-09 04:24:23
  • Android OpenGL仿自如APP裸眼3D效果详解

    2023-12-23 21:37:05
  • java StringBuilder类的详解及简单实例

    2022-04-15 01:24:44
  • Java优先队列(PriorityQueue)重写compare操作

    2022-10-02 03:59:12
  • c# for循环中创建线程执行问题

    2021-09-15 20:43:23
  • Android 刘海屏适配总结(推荐)

    2022-03-23 23:26:55
  • c++中的malloc底层实现代码

    2023-11-02 19:49:18
  • asp之家 软件编程 m.aspxhome.com