面试题 ArrayList与LinkedList的区别

面试题 ArrayList与LinkedList的区别ArrayList 和 LinkedList 的区别 Java 基础面试题 面试官问你这个题的关键 是为了考察你的数据结构功底 理解及深入程度 此处 ArrayList 和 LinkedList 是 Java 语言实现的数据结构 如果你对数组和链表有了解 那这个问题就是简易的 进入正题 总结几点 1 ArrayList 的实现是基于数组来实现的 LinkedList 的基于双向链表来实现 这两个数

ArrayList与LinkedList的区别(Java基础面试题

面试官问你这个题的关键,是为了考察你的数据结构功底,理解及深入程度。

此处ArrayList和LinkedList是Java语言实现的数据结构,如果你对数组和链表有了解,那这个问题就是简易的。

 

进入正题,总结几点:

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

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

3. 对于随机访问,ArrayList要优于LinkedList。

4. 对于插入和删除操作,LinkedList优于ArrayList。

 

4. 对于插入和删除操作,LinkedList优于ArrayList(理论上),实际并非如此(实际上ArrayList不论是插入还是删除效率,在元素数量趋多时,都是要优于LinkedList的),因这其中涉及数组与链表在元素操作方式、时间与空间上的复杂度计算问题,所以具体问题须具体分析和佐证。

 

 

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

下面一段代码来说明ArrayList和LinkedList在做数据查询、插入、删除时的性能比较

package test; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; public class P2 { public static int max = ;//测试元素数 public static void main(String[] args) { // TODO Auto-generated method stub List  arrList = new ArrayList  (); List  linList = new LinkedList  (); System.out.println("测试元素数:" + max); // init list for (int i = 0; i < max; i++) { arrList.add(i); linList.add(i); } System.out.println("ArrayList访问消耗的时间:" + getTime(arrList) + "ms"); System.out.println("LinkedList访问消耗的时间:" + getTime(linList) + "ms"); System.out.println("\nArrayList删除消耗的时间:" + delTime(arrList) + "ms"); System.out.println("LinkedList删除消耗的时间:" + delTime(linList) + "ms"); System.out.println("\nArrayList插入消耗的时间:" + insertTime(arrList) + "ms"); System.out.println("LinkedList插入消耗的时间:" + insertTime(linList) + "ms"); } public static long getTime(List list) { long time = System.currentTimeMillis(); for (int i = 0; i < max ; i++) { int index = Collections.binarySearch(list, list.get(i)); if (index != i) { System.out.println("ERROR!"); } } return System.currentTimeMillis() - time; } public static long delTime(List list) { long time = System.currentTimeMillis(); for (int i = 0; i 
          

下面是这段代码3次运行的结果:

面试题 ArrayList与LinkedList的区别

面试题 ArrayList与LinkedList的区别

面试题 ArrayList与LinkedList的区别

面试题 ArrayList与LinkedList的区别

 

 

 

 

 

补充(update 2020年 05月 03日 星期日 18:11:53 CST):

为了佐证ArrayList与LinkedList在做删除上的效率,在上面代码,仅修改delTime方法下,另测了这3种情况。

public static long delTime(List list) { long time = System.currentTimeMillis(); // 在索引下,从前往后 逐个删除每个元素 /*for (int i = 0; i 
  
    = 0; i--) { list.remove(i); }*/ // 在索引下,删除指定段落的元素,奇数位索引段 for (int i = 0; i 
    
  

这3种情况运行结果如下:

在索引下,从前往后 逐个删除每个元素 测试元素数: ArrayList访问消耗的时间:41ms LinkedList访问消耗的时间:36210ms ArrayList删除消耗的时间:412ms LinkedList删除消耗的时间:3420ms ArrayList插入消耗的时间:8ms LinkedList插入消耗的时间:9ms Process finished with exit code 0 在索引下,从后往前 逐个删除每个元素 测试元素数: ArrayList访问消耗的时间:25ms LinkedList访问消耗的时间:36412ms ArrayList删除消耗的时间:9ms LinkedList删除消耗的时间:9ms ArrayList插入消耗的时间:11ms LinkedList插入消耗的时间:9ms Process finished with exit code 0 在索引下,删除指定段落的元素,奇数位索引段 测试元素数: ArrayList访问消耗的时间:21ms LinkedList访问消耗的时间:39146ms ArrayList除消耗的时间:274ms LinkedList删除消耗的时间:1844ms ArrayList插入消耗的时间:8ms LinkedList插入消耗的时间:7ms Process finished with exit code 0 总结:在集合10万目标测试数,这3种情况下,在删除效率上。 在索引下,从前往后 逐个删除每个元素时,ArrayList较LinkedList快(3420/412=8.)8.3倍; 在索引下,从后往前 逐个删除每个元素时,ArrayList与LinkedList效率均等(9/9=1); 在索引下,删除指定段落的元素,奇数位索引段时,,ArrayList较LinkedList快(1844/274=6.)6.7倍; 

 

==================================以上博文内容作废,(update 2020年 05月 23日 星期六 23:21:13 CST)======

package com.example.application_demo2; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; public class P7 { public static int max = ;//测试元素数 public static void main(String[] args) { // TODO Auto-generated method stub ArrayList  arrList = new ArrayList  (); LinkedList  linList = new LinkedList  (); System.out.println("测试元素数:" + max); System.out.println("ArrayList插入消耗的时间:" + insertTime(arrList) + "ms"); System.out.println("LinkedList插入消耗的时间:" + insertTime(linList) + "ms"); System.out.println("\nArrayList访问消耗的时间:" + getTime(arrList) + "ms"); System.out.println("LinkedList访问消耗的时间:" + getTime(linList) + "ms"); System.out.println("\nArrayList删除消耗的时间:" + delTime_v2(arrList) + "ms"); System.out.println("LinkedList删除消耗的时间:" + delTime_v2(linList) + "ms"); } public static long insertTime(List list) { long time = System.currentTimeMillis(); for (int i = 0; i < max; i++) { list.add(i); // 逐个插入 max 个元素 } return System.currentTimeMillis() - time; } public static long getTime(List list) { long time = System.currentTimeMillis(); for (int i = 0; i < max; i++) { int index = Collections.binarySearch(list, list.get(i)); if (index != i) { System.out.println("ERROR!"); } } return System.currentTimeMillis() - time; } public static long delTime_v2(List list) { long time = System.currentTimeMillis(); while (checkListSize(list)) { if (list instanceof LinkedList) { ((LinkedList) list).removeFirst(); } else if (list instanceof ArrayList) { list.remove(0); } } return System.currentTimeMillis() - time; } public static boolean checkListSize(List list) { if (list.size() <= 0) return false; else return true; } }    

下面是这段代码3次运行的结果:

面试题 ArrayList与LinkedList的区别

面试题 ArrayList与LinkedList的区别

面试题 ArrayList与LinkedList的区别

面试题 ArrayList与LinkedList的区别

为了佐证ArrayList与LinkedList在做删除上的效率,在上面代码,仅修改delTime_v2方法下,另测了这两种情况。

public static long delTime_v2(List list) { long time = System.currentTimeMillis(); while (checkListSize(list)) { // 1.在集合中,从前往后顺序 逐个删除元素 if (list instanceof LinkedList) { ((LinkedList) list).removeFirst();//从头部删除元素 } else if (list instanceof ArrayList) { list.remove(0);//从头部删除元素 } //2.在集合中,从后往前顺序 逐个删除元素 /*if (list instanceof LinkedList) { ((LinkedList) list).removeLast();//从尾部删除元素 } else if (list instanceof ArrayList) { list.remove(list.size() - 1);//从尾部删除元素 }*/ } return System.currentTimeMillis() - time; }

这两种情况运行结果如下:

面试题 ArrayList与LinkedList的区别

总结:理论是正确的。

1. 对于随机访问,ArrayList要优于LinkedList。

2. 对于插入和删除操作,LinkedList优于ArrayList。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222576.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:28
下一篇 2026年3月17日 下午3:28


相关推荐

  • 多线程锁的升级原理是什么?

    多线程锁的升级原理是什么?多线程锁的升级原理是什么?锁的级别从低到高:无锁->偏向锁->轻量级锁->重量级锁锁分级别原因:没有优化以前,sychronized是重量级锁(悲观锁),使用wait和notify、notifyAll来切换线程状态非常消耗系统资源;线程的挂起和唤醒间隔很短暂,这样很浪费资源,影响性能。所以JVM对sychronized关键字进…

    2022年6月21日
    39
  • Java8 Stream使用flatMap合并List

    Java8 Stream使用flatMap合并List之前也写过很多篇关于Java8使用的文章了,但是回顾一下,好像还没介绍过Java8Stream的flatMap操作,昨天刚好在工作中遇到一个场景,发现flatMap简直太方便了,这里总结一下flatMap的常规使用。附带讲一下,使用Java8实现集合的并、交、差操作,其实之前也讲过一种使用Guava的实现方式,具体请参考Guava集合工具 flatMap 首先看一下一种场景,存在一个M…

    2022年6月4日
    100
  • 用JavaSocket编程开发聊天室,附超详细注释

    用JavaSocket编程开发聊天室,附超详细注释用JavaSocket编程开发聊天室大二下册的JavaWeb课程设计,使用的是eclipse。一、实现功能登录:用Java图形用户界面编写聊天室服务器端和客户端,支持多个客户端连接到一个服务器。每个客户端能够输入账号。群聊:可以实现群聊(聊天记录显示在所有客户端界面)。好友列表:完成好友列表在各个客户端上显示。私聊:可以实现私人聊天,用户可以选择某个其他用户,单独发送信息,接受私聊消息方可以直接弹出消息框。踢人:服务器能够群发系统消息,能够强行让某些用户下线。更新:客

    2022年6月16日
    31
  • Spring IOC容器的初始化过程

    Spring IOC容器的初始化过程Spring IOC容器的初始化过程

    2022年6月24日
    30
  • 转录组测序火山图_转录组差异基因筛选标准

    转录组测序火山图_转录组差异基因筛选标准利用R包DEseq2进行差异表达分析和可视化count数矩阵在Linux下,通过HISAT2对下载的GSE数据进行比对,FeatureCounts软件进行基因水平定量,得到count数矩阵。之后便可以载入R语言中进行差异分析。差异分析第一次分析RNA-seq数据,走到这一步相对容易了许多。转录组数据分析主要参考了生信技能树Jimmy老师的相关课程及推文。RNA-seq的readcount普遍认为符合泊松分布,但是之前分析过的芯片数据符合正态分布,所以筛选DEGs的方法有一定差别。.

    2022年8月30日
    8
  • org.apache.jasperException(could not initialize class org)

    org.apache.jasper.JasperException: java.lang.NullPointerExceptionorg.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:542)org.apache.jasper.servlet.JspServletWrapper…

    2022年4月16日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号