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、各自效率问题:

来源:http://blog.csdn.net/weixin_42468526/article/details/81178698

arraylist 后往前遍历_面试官:谈谈常用的Arraylist和Linkedlist的区别相关推荐

  1. arraylist 后往前遍历_面试官:请说出线程安全的 ArrayList 有哪些,除了Vector

    以下环境是 JDK 1.8 ArrayList 的初始容量 面试官:你看过 ArrayList 的源码? Python 小星:看过 面试官:那你说下ArrayList 的初始容量是多少? Python ...

  2. 联合索引会创建几个索引_面试官:谈谈你对mysql联合索引的认识?

    引言 这篇文章作为<面试官:谈谈你对mysql索引的认识>的续篇,我当时在写这篇的时候,考虑到篇幅问题所以略去了联合索引的内容,今天给大家补上. 本文预计分为两个部分:(1)联合索引部分的 ...

  3. arraylist 后往前遍历_ArrayList和LinkedList的深入浅出

    0. 说明 今天无意间看到网上在讨论ArrayList和LinkedList的区别,本文准备从源码中分析下这两个List的底层实现和应用选择. 1. ArrayList 从名称上可以看出来是数组的形式 ...

  4. arraylist 后往前遍历_Java集合框架之ArrayList

    ArrayList介绍 ArrayList是一个数组列表.与Java数组相比,ArrayList相当于一个动态数组.它继承于AbstractList,实现了List, RandomAccess, Cl ...

  5. swf缓存文件在哪里_面试官:mybatis一级缓存二级缓存的区别都不知道,知道门在哪吧...

    面试官:虫虫你简历上写了了解mybatis缓存,那你能说说一级缓存和二级缓存的区别吗? 虫虫:我只知道这是用来缓存sql查询的数据 面试官:没了? 虫虫:没了 面试官:公司门知道在哪里吧 自己走还是我 ...

  6. access建立两个字段唯一索引_面试官:谈谈你对mysql索引的认识?

    引言 这篇我们就来谈谈关于索引方面的mysql面试题.还是老规矩,讲的是在Innodb存储引擎下的情形,毕竟我还真没用过Mysiam之类的存储引擎. ps:其实很早就想写了,一直偷懒! 其实这下面每个 ...

  7. 记直接插入排序,为什么必须从后往前遍历

    从前往后遍历找到插入位置 @Slf4j public class InsertSort {@Testpublic void test() {int[] arr = new int[]{5, 3, 7, ...

  8. 307 跳转会携带请求方法吗_面试官:GET和POST两种基本请求方法有什么区别

    点击上方蓝色"后端面试那些事儿",选择"设为星标" 学最好的别人,做最好的我们 来源:r6d.cn/j26B GET和POST是HTTP请求的两种基本方法,要说 ...

  9. java 委托_面试官:java双亲委派机制及作用

    什么是双亲委派机制 当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类. 类加载器的类别 Bootst ...

最新文章

  1. 双重惊喜——Windows Phone Developer Tools初体验
  2. mariadb 10.1查看per connection内存消耗
  3. 拦截导弹(最长递增子序列)
  4. 阿里云今日发布数据库产品HybridDB
  5. apt-get remove 与 apt-get purge 区别(删除包、卸载包)
  6. Leetcode-260. 只出现一次的数字 III
  7. java 集合(Set接口)
  8. [渝粤教育] 三江学院 软件测试 参考 资料
  9. 【Python】os库介绍
  10. 服务器控件的 ID, ClientID 和 UniqueID 属性
  11. HDU2023 求平均成绩【入门】
  12. Tensorflow 2.x代码中如何控制随机性以保证结果可重复性
  13. java实现自动定位,java swing 如何自动定位尾部
  14. 思维导图:亿图的部分使用方法
  15. 基建管控系统_基建管控系统在电网建设中的应用
  16. Windows平台通过CMD查询域名的Whois信息
  17. 怎么设置计算机显示列表格式,(怎样显示excel的文件后缀名)excle后缀格式怎么显示...
  18. python提取cad坐标_教你一个实用的CAD坐标提取技巧
  19. Spring IOC理论推导及其本质
  20. vue 流星的样式和流光canvas

热门文章

  1. c语言自定义char*函数返回值是乱码_[每日C语言」printf()函数的修饰符和返回值...
  2. 【工具软件】webstorm配置
  3. 【servlete】兴唐第三十二节课知识点汇总
  4. [学习笔记]最小割之最小点权覆盖最大点权独立集
  5. 不想被问年终奖?2018年春节自救攻略来了!
  6. SpringMVC学习二
  7. Tensorflow 全网最全学习资料汇总之框架平台的综合对比【3】
  8. ava.lang.UnsatisfiedLinkError:
  9. Android app 别用中文名
  10. [转] vim的复制粘贴小结