每日一道面试题之LinkedList VS ArrayList~

简介: 每日一道面试题之LinkedList VS ArrayList~

ArrayList VS LinkedList:

ArrayListLinkedList是Java中常用的两种集合类,虽然它们都实现了List接口,但在内部实现和性能方面有以下区别:

内部实现:

ArrayList基于数组实现的动态数组,它可以自动扩容缩容

LinkedList基于双向链表实现的,每个节点都包含了当前元素的值以及指向前一个节点和后一个节点的引用。

访问和修改元素的效率:

ArrayList支持随机访问,可以通过索引直接访问和修改元素,因此在随机访问和修改元素时效率较高,时间复杂度为O(1)。但在插入和删除元素时,需要移动其他元素,时间复杂度为O(n)`。它通过索引来访问和操作元素。


对于ArrayList来说,当为尾部插入时,直接通过下标检索到最后一个位置将元素插入即可,但当为头部插入时,过程如下所示:

LinkedList不支持随机访问,需要从头节点开始遍历链表才能访问和修改元素,时间复杂度为O(n)。但在插入和删除元素时,只需要修改节点的引用,时间复杂度为O(1)


内存占用:

ArrayList在内存中连续存储元素,可以利用CPU缓存局部性原理,因此占用的内存空间相对较小。

引入CPU缓存,可以缩短时间,当第一次读写某些数据时,将其写在CPU缓存中,等再次使用该数据时,就不需要重新从内存中访问了

局部性原理:

当我们将某些数据放入CPU缓存中时,不应该只放单独的某一个数据,而应该将与它相邻的一些数据都读入,因为该数据访问后,很大机率接下来要访问的就是与它相邻的元素

局部性原理只能适用于数组,而不能适用于链表,原因如下:

那么为什么LinkedList占用内存空间大呢?

原因:每一个元素都有两个指针,一个用于指向下一个元素,一个用于指向上一个元素,少量的数据也许并不会体现出内存占用上的缺点,但当数据非常多时,指针累计占用的内存空间就会非常大


至于选择ArrayList还是LinkedList取决于对于随机访问和修改元素的需求以及对于插入和删除元素的频繁程度。如果需要频繁进行随机访问和修改元素操作,可以选择ArrayList;如果需要频繁进行插入和删除元素操作,可以选择LinkedList。但在实际开发中,我们都是使用ArrayList,一方面是由于实际开发中很少出现要将元素插入头部或者尾部的这种情况,另一方面是由于ArrayList的各个方面的性能都要优于LinkedList


解析二者源码:

点击ArrayList的源码:

点击LinkedList的源码:

ArrayList相比于LinkedList实现了RandomAccess接口,那么接口到底有什么作用呢?

我们点开该接口的源码,如下所示:

相关文章
|
存储 Java 索引
【面试题精讲】ArrayList 和 Array(数组)的区别?
【面试题精讲】ArrayList 和 Array(数组)的区别?
|
6月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
6月前
|
存储 Java 索引
【Java集合类面试二十四】、ArrayList和LinkedList有什么区别?
ArrayList基于动态数组实现,支持快速随机访问;LinkedList基于双向链表实现,插入和删除操作更高效,但占用更多内存。
|
7月前
|
存储 安全 Java
面试官没想到一个ArrayList,我都能跟他扯半小时
面试官:List集合都知道哪些对象?作为四大集合之一的List,在业务开发中我们比较常见的是以下 3 种:ArrayList、Vector、LinkedList,业务开发我们接触最多就是容器类库了,容器类库可以说是面向对象语言最重要的类库。大家看看在工作里你比较熟悉的是哪个?这篇文章南哥打算专注于List集合,后面四大集合之Map、Queue、Set后续再来填坑,比心心♥。
142 2
面试官没想到一个ArrayList,我都能跟他扯半小时
|
6月前
|
Java 编译器 开发工具
JDK vs JRE:面试大揭秘,一文让你彻底解锁Java开发和运行的秘密!
【8月更文挑战第24天】JDK(Java Development Kit)与JRE(Java Runtime Environment)是Java环境中两个核心概念。JDK作为开发工具包,不仅包含JRE,还提供编译器等开发工具,支持Java程序的开发与编译;而JRE仅包含运行Java程序所需的组件如JVM和核心类库。一个简单的"Hello, World!"示例展示了两者用途:需借助JDK编译程序,再利用JRE或JDK中的运行环境执行。因此,开发者应基于实际需求选择安装JDK或JRE。
83 0
|
6月前
|
前端开发 应用服务中间件 API
"揭秘!面试官必问:你是如何巧妙绕过跨域难题的?前端代理VS服务器端CORS,哪个才是你的秘密武器?"
【8月更文挑战第21天】在软件开发中,尤其前后端分离架构下,跨域资源共享(CORS)是常见的挑战。主要解决方案有两种:一是服务器端配置CORS策略,通过设置响应头控制跨域访问权限,无需改动前端代码,增强安全性;二是前端代理转发,如使用Nginx或Webpack DevServer在开发环境中转发请求绕过同源策略,简化开发流程但不适用于生产环境。生产环境下应采用服务器端CORS策略以确保安全稳定。
81 0
|
6月前
|
存储 SQL 搜索推荐
一天十道Java面试题----第一天(面向对象-------》ArrayList和LinkedList)
这篇文章是关于Java面试的笔记,涵盖了面向对象、JDK/JRE/JVM的区别、`==`和`equals`、`final`关键字、`String`、`StringBuffer`和`StringBuilder`的区别、重载与重写、接口与抽象类、`List`与`Set`、`hashcode`与`equals`以及`ArrayList`和`LinkedList`的对比等十个主题。
|
7月前
|
存储 安全 Java
Android面试题之ArrayList源码详解
ArrayList是Java中基于数组实现的列表,提供O(1)的索引访问,但插入和删除操作平均时间复杂度为O(n)。默认容量为10,当需要时会通过System.arraycopy扩容。允许存储null,非线程安全。面试常问:List是接口,ArrayList是其实现之一,推荐使用List接口编程以实现更好的灵活性。更多详情见[ArrayList源码](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/ArrayList.java#ArrayList.Node)。
39 2
|
7月前
|
设计模式 并行计算 安全
Java面试题: 如何使用装饰器模式来增强ConcurrentHashMap的功能?在什么情况下应该使用CopyOnWriteArrayList而不是ArrayList?
Java面试题: 如何使用装饰器模式来增强ConcurrentHashMap的功能?在什么情况下应该使用CopyOnWriteArrayList而不是ArrayList?
41 0
|
8月前
|
开发框架 Java C++
SpringIOC第二课,@Bean用法,DI详解,常见面试题Autowired VS Resource
SpringIOC第二课,@Bean用法,DI详解,常见面试题Autowired VS Resource

热门文章

最新文章