在以前的文章里,我们已经看过了add方法的源码,还有一个add方法,我们看一下, public void add(int index, E element) ,从指定位置添加元素

按照下标把元素添加到指定位置,想必大家都知道,我们直接上源码。

老规矩,我们还是画一画,当执行到System.arraycopy()这个方法时

我看到有些书上写的是依次移动元素到下一格,这种说法不够严谨,所以我再强调一遍,是依次复制插入位置及后面的数组元素,到后面一格,不是移动,因此,复制完后,arr[2],arr[3]指向对一个对象。

在代码执行完这一句

我们debug验证一下。

最后,在堆内存中创建李莫愁这个对象,把arr[2]的引用指向它。

再debug一下

最后我们来说说ArrayLIst这个对象里添加的时间复杂度:

如果我们不指定位置直接添加元素时(add(E element)),元素会默认会添加在最后,不会触发底层数组的复制,不考虑底层数组自动扩容的话,时间复杂度为O(1) ,在指定位置添加元素(add(int index, E element)),需要复制底层数组,根据最坏打算时间复杂度是O(n)。

最后我们说一说读取元素,下面代码是获取List中下标为2的元素

看一下源码:

很简单,读取元素和数组长度无关,直接从底层数组里去拿元素。

评论区有人说,为什么是“李莫愁”,看样子是不太喜欢“李莫愁”,我们可以调用 set(int index, E element)方法来替换。

我们看一看这个方法的源码

很简单,就是往指定位置放入元素,并返回原来的元素,最后我们来画一画

图中“李莫愁”已经没有引用指向它了,JVM会在合适的时候回收它,底层数组第2个位置已经换成了“小龙女”,我们debug验证一下。

没错,已经换成小龙女了。

这是最后一期ArrayLIst源码分析,引入了时间复杂度,最后,我们来做个总结

根据前几篇文章我们可以看出来,在ArrayList中,底层数组存/取元素效率非常的高(get/set),时间复杂度是O(1),而查找,插入和删除元素效率似乎不太高,时间复杂度为O(n)。

当我们ArrayLIst里有大量数据时,这时候去频繁插入/删除元素会触发底层数组频繁拷贝,效率不高,还会造成内存空间的浪费,这个问题在另一个类:LinkedList里有解决方案,请期待后续文章讲解。

查找元素效率不高,在HashMap里有解决方案,请关注后续文章。

转载无限欢迎,但请注明「清浅吃糖」和「https://zhuanlan.zhihu.com/p/28016098」。转载请在文中保留此段,感谢您对作者版权的尊重。如需商业转载或刊登,请联系作者获得授权。自助转载请点击:https://www.rightknights.com/materi

ArrayList(4)时间复杂度相关推荐

  1. [剑指offer][JAVA][第62题][约瑟夫环][LinkedList vs ArrayList]

    [问题描述] 面试题62. 圆圈中最后剩下的数字 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字.例如,0.1.2.3.4这5个 ...

  2. 多线程、并发及线程的基础问题

    1)Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引用指向的数组,将会受到 vo ...

  3. java面试题2019 答案

    Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别(String 类型和 StringBuffer 类型的主要性能区别其实在于 Stri ...

  4. Java 最常见的 100+ 面试题和答案:面试必备

    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,希望对大家有帮助哈~ 博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的. 需要pdf版的可以 ...

  5. 扪心自问!一百多道难搞的面试题,你能答对了多少?

    作者:YHGui 来源:https://github.com/YHGui/easy-job/ Java 面试中的重要话题 除了你看到的惊人的问题数量,我也尽量保证质量.我不止一次分享各个重要主题中的问 ...

  6. “面试不败计划”:集合、日期、异常、序列化、其他知识点

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 java实 ...

  7. “面试不败计划”:集合、日期、异常、序列化、jvm、其他

    关于集合 1.Java中的集合及其继承关系 关于集合的体系是每个人都应该烂熟于心的,尤其是对我们经常使用的List,Map的原理更该如此.这里我们看这张图即可: 2.poll()方法和remove() ...

  8. java byte 判断相等_转发收藏 | 史上最全Java面试题+面试网站推荐!(含答案)

    今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次.对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦. 相关概念 面向对象的三个 ...

  9. java面试宝典有用么_常见的Java面试题汇总

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 二.关于集合 1.Java中的集合及其继承关系 关于集合的体系是每个人都应该烂熟于心的,尤其是对我们经常使用的List,Map的原理更该如此. 2.pol ...

  10. JAva面试题(微信分享)

    前几天,有朋友去面试之前问我关于后端架构相关的问题,但奈于我去年更多的工作是在移动SDK开发上,对此有所遗忘,实属无奈,后面准备总结下. 今天要谈的主题是关于求职.求职是在每个技术人员的生涯中都要经历 ...

最新文章

  1. Linux下sqlite3乱码,sqlite中文乱码问题原因分析及解决
  2. 支持手机版网站的We7CMS
  3. 【FPGA】ROM/EPROM的设计(使用加载文件的方式初始化)
  4. Java方法 signature
  5. iOS XMPP Framework 中文概述
  6. Android--百度地图之基础地图(三)
  7. 【理论】【转】Android项目重构之路:架构篇
  8. php 判断是否为中文,php判断是否为中文正则表达式大全
  9. aws php sns,使用 AWS SNS 发送通知到 HTTP 终端
  10. 达内2018前端设计相关教程视频
  11. YOLOV5源码解读(数据集加载和增强)
  12. MFC添加afx_msg点击事件
  13. 行动诠释价值,城联优品韩董事长出席广东英德抗洪捐赠公益活动会
  14. QVariant类及QVariant与自定义数据类型转换的方法
  15. 逻辑测试插座市场深度研究分析报告
  16. ios设备管理软件imazing 2.16.2官网下载,2022年强悍来袭!
  17. 中华大地第二次大变革 看印度反思自我之六 印度模式更有吸引力
  18. Ubuntu安装texlive
  19. 数据库having的用法详细介绍
  20. turtle简单绘图

热门文章

  1. Vue-cli(四) 项目中引入Axios
  2. WindowsMobile应该如何发展?(未完待续)
  3. 如何用SQL语句查询Excel数据
  4. YMP框架学习笔记(二)------基于YMP框架搭建WEB应用程序
  5. 这个例子主要展示了通过点击button实现viewflipper页面切换
  6. poj 2777 Count Color(线段树区区+染色问题)
  7. 系统分析员、系统架构师、项目经理的区别(转载)
  8. 2010夏令营——还孩子快乐成长的空间
  9. Ms Sql Server 2005的数据库快照功能使用实践
  10. 使用php框架文件上传,Laravel框架文件上传功能实现方法示例