博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
List跟踪源码个人记录
阅读量:7171 次
发布时间:2019-06-29

本文共 1191 字,大约阅读时间需要 3 分钟。

hot3.png

LinkedList是基于链表实现的集合,每个元素都在记录上一个元素和下一个元素的内存地址,在增删改查元素都通过上下元素来实现。下面是源码的跟踪过程。

1 实例化linkedList时只是实例化一个linkedList对象,并没有为元素预留空间

221727_pv89_3739402.png

2 add()方法,首先是定义了first和last变量来记录整个链表的第一个元素和最后一个元素

222258_Y828_3739402.png

222742_8fmK_3739402.png

Node类如下:

222936_lw9l_3739402.png

223345_fdGS_3739402.png

3 get方法,链表的查找元素实现原理是先检查是否数组下班越界,然后采用类似二分法的方法查找元素,就是根据要查找元素的下标,然后根据下标是否大于链表长度的一半来决定从链表的头部开始查找还是从链表尾部查找

225118_oZ7U_3739402.png

4 remove方法,remove方法就是通过维护好node的prev和next元素

225533_cF8l_3739402.png

ArrayList其实就是一个Object数组,arrayList对象实例化时就只是初始化了一个空的Object数组

231738_cpYd_3739402.png

1 add方法,add方法除了增加元素之外,在增加元素之前先扩容,每次扩容都是扩充现有数组长度的一半,即扩容后的数组长度=扩容前的长度+扩容前长度的一半

232311_SQBf_3739402.png

232619_nCWM_3739402.png

2  remove方法其实就是数组的复制

234439_YDNB_3739402.png

总结

     linkedList和ArrayList的相同在实例化对象时都是实例化LinkedList和ArrayList对象,没有其他操作

    不同点

   1 扩容机制不同,LinkedList的扩容其实就是每增加一个元素就new Node对象,即增加一个元素就增加一个节点,一个Node对象就相当于扩容一次

2 增删改不同

    LinkedList每次增加元素都是new Node对象,然后维护好prev、next、first和next就开了,删除元素类似,将要删除的元素设置null,然后维护好上下两个元素的prev和next

   ArrayList则是每次增加元素都会调用Arrays.copyOf方法自动扩充一半的容量,然后再增加元素,

删除元素是调用System.arraycopy方法从删除元素的下标+1开始复制数组,然后将最后一个元素设置null

LinkedList的删除元素效率高,因为ArrayList每次删除都要进行一次数组复制,而linkedList直接set为null并维护好prev和next即可;ArrayList修改元素效率高,因为ArrayList的查找效率更高,找到元素之后直接set值即可。新增元素都是通过尾部的方式追加,目前我没有办法比较那个效率更高。

3 查找元素机制不同

LinkedList是链表模式,没有办法通过下标直接定位到元素,只能从头部或尾部通过prev或next变量一个节点一个节点取出目标元素

ArrayList是数组,可以通过下标直接取出目标元素,ArrayList的查找效率高

 

 

 

   

 

转载于:https://my.oschina.net/u/3739402/blog/1647543

你可能感兴趣的文章
AS导入Easyinstall源码可能遇到的问题
查看>>
Iptables的7层过滤
查看>>
oracle,dbms_metadata.get_ddl()获取对象ddl
查看>>
SCCM2012SP1---配置客户端发现方法和边界组
查看>>
php开发的支付宝、微信个人免签支付接口
查看>>
TypeScript基础入门之装饰器(一)
查看>>
Vacl反写的原理
查看>>
HTTP协议入门知识
查看>>
关于利用Postfix邮件网关接收外网投递邮件失败问题的解决方法
查看>>
《史上最简单的 SpringCloud 教程》系列
查看>>
洛谷——P2239 螺旋矩阵
查看>>
vmware虚拟机无法加载U盘
查看>>
Selenium自动化测试环境搭建
查看>>
我的友情链接
查看>>
vlc+mfc,搭建简单的播放器
查看>>
Linux驱动编程--基于I2C子系统的I2C驱动
查看>>
编写iptables模块实现不连续IP地址的DNAT-POOL
查看>>
UVA 11374 Airport Express 最短路
查看>>
工作总结2010-2012-软件工程篇
查看>>
解决sqlplus历史命令和退格键问题
查看>>