基础编程学习快乐每一天
首页
留言
Siddim.com
当前位置:
首页
>
编程知识库
>
后端开发知识
>
面试官:谈谈常用的Arraylist和Linkedlist的区别
面试官:谈谈常用的Arraylist和Linkedlist的区别
阅读
1
2020-08-18
Arraylist
:底层是基于动态数组,根据下表随机访问数组元素的效率高,向数组尾部添加元素的效率高;但是,删除数组中的数据以及向数组中间添加数据效率低,因为需要移动数组。
例如最坏的情况是删除第一个数组元素,则需要将第
2
至第
n
个数组元素各向前移动一位。而之所以称为动态数组,是因为
Arraylist
在数组元素超过其容量大,
Arraylist
可以进行扩容(针对
JDK1
.
8
数组扩容后的容量是扩容前的
1
.
5
倍),
Arraylist
源码中最大的数组容量是
Integer
.
MAX
_
VALUE
-
8
。
对于空出的
8
位,目前解释是 :①存储
Headerwords
;②避免一些机器内存溢出,减少出错几率,所以少分配③最大还是能支持到
Integer
.
MAX
_
VALUE
(当
Integer
.
MAX
_
VALUE
-
8
依旧无法满足需求时)。
以下是
Arraylist
部分源码:
Arraylist
扩容:
Arraylist
添加数据:(向数组尾部添加)
向数组的指定位置添加数组:
可以看到,只要
ArrayList
的当前容足够大,
add
()操作向数组的尾部的效率非常高的,当向数组指定位置添加数据时,会进行大量的数组移动复制操作。而数组复制时,最终将调用
System
.
arraycopy
()方法,因此
add
()操作的效率还是相当高的。往期:
尽管这样当向指定位置添加数据时也还是比
Linkedlist
慢,后者添加数据只需要改变指针指向即可。
Arraylist
删除数组也需要移动数组,效率较慢。
Linkedlist
基于链表的动态数组,数据添加删除效率高,只需要改变指针指向即可,但是访问数据的平均效率低,需要对链表进行遍历。
Arraylist
get
数据的源码:(根据下标访问,效率高)
Linkedlist
访问数据的源码:(
node
()函数遍历链表)
总结:
1
、对于随机访问
get
和
set
,
ArrayList
优于
LinkedList
,因为
LinkedList
要移动指针。对于新增和删除操作
add
和
remove
,
LinedList
比较占优势,因为
ArrayList
要移动数据。
2
、各自效率问题:
来源:
blog
.
csdn
.
net
/
weixin
_
42468526
/
article
/
details
/
81178698
? ~
以上数据来源于网络,如有侵权,请联系删除。
上一篇:
面试官:你能说出MySQL主从复制的几种复制方式吗?
下一篇:
面试官:你能说说 Elasticsearch 查询数据的工作原理是什么吗?
评论
(0)
提交
类别
基础编程学习
HTML
PHP
Python
编程知识库
后端开发知识
热门文章
Java并发中的同步容器与并发容器,你了解多少?
Innodb中的事务隔离级别和锁的关系,难倒一半面试者!
SpringBoot + minio实现分片上传、秒传、续传
面试官:你知道消息队列如何保证数据不丢失吗?
JAVA知识 Java8新特性
面试官:谈谈为什么要限流,有哪些限流方案?
说说动态代理与静态代理区别
面试官:思考Tomcat 类加载器为什么要违背双亲委派模型?
boot-admin 基于SpringBoot的后台权限管理系统,可作为脚手架,用于快速搭建项目
SpringBoot+Vue+App+硬件实现智能家居系统项目