我们先回顾一下之前的所说过的数组,话不多说,上代码:

老规则,我们继续画一画,加深一下印象,上图:

这个图我们去掉了ArrayList初探 - 知乎专栏 一文图里那些无用的细节(方法区,常量池等),方便大家看起来清晰,我们用eclipse的debug功能看一下,看是否与我们图上画的一致

再看一下执行结果,也在我们期望中。

好,我们改一下代码,再往数组里加添加一个叫“周八”的person对象

执行一下

看到了传说的中数组下标越界异常。在Java中,数组一但在堆内存中创建,长度是固定的。

既然是固定的,那我们要往数组里加一个“周八”用户怎么办?没办法,只能重新new长一点的新的数组,把原来数组的元素复制过去,好吧,开始写代码吧,相信大家都会写

把老数组的元素循环一下,赋值给新的数组,很简单也很清晰。debug看一下

“周八”已经有了。以上代码虽然简单,但还不是最优雅的,老鸟一般会这么写,该段代码执行结果和上面那段代码一样。

再画个图加深一下印象吧:

此图已用尽我洪荒之力,希望大家以后多想想对象在堆内存中的样子。不枉我一片苦心呀。
看到System.arraycopy()方法是不是似曾相识呢?我们在ArrayList初探 - 知乎专栏 一文中提了一下,相信看到这里,大家都知道ArrayList里的底层数组扩容是怎么实现的了吧。在ArrayList初探 - 知乎专栏 一文中,我们知道当ArrayList如果不指定构造个数的话,第一次往里面添加元素时底层数组会初始化一个长度为10的数组,我们再回顾一下昨天的源码,再来看一下ArrayList里的源码,当添加第11个元素时

再看grow()方法

这儿有一段代码:int newCapacity = oldCapacity + (oldCapacity >> 1),>>是移位运算符,相当于int newCapacity = oldCapacity + (oldCapacity/2),但性能会好一些。

本文开始那个问题,到这儿就解决了,这就是数组的扩容,一般是oldCapacity + (oldCapacity >> 1),相当于扩容1.5倍。

看到这里,相信在以后的面试中,面试官再问数组和ArrayLIst的区别的时候,大家应该有了自己的理解,而不是去背面试题了。

ArrayList还提供了其它构造方法,我们顺便来看一下。

我们再看一下源码,好简单:

当我们在写代码过程中,如果我们大概知道元素的个数,比如一个班级大概有40-50人,我们优先考虑List<Person> list2 = new ArrayList<>(50)以指定个数的方式去构造,这样可以避免底层数组的多次拷贝,进而提高程序性能。

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

Arraylist理解(2)扩容相关推荐

  1. 详解java集合之ArrayList——底层实现是一个Object数组。分析ArrayList的自动扩容,原来不一定是1.5倍

    ArrayList的底层实现--非private权限的Object数组 ArrayList的类结构图 1. ArrayList的创建 1.1 参数为空的构造方法--ArrayList内部的Object ...

  2. ArrayList源码扩容机制分析

    ArrayList源码&扩容机制分析 发上等愿,结中等缘,享下等福 文章目录 ArrayList源码&扩容机制分析 1. ArrayList 简介 1.1. Arraylist 和 V ...

  3. arraylist是如何扩容的?_ArrayList的源码分析

    ArrayList的类定义 public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, ...

  4. ArrayList理解(5)与vector区别

    前几篇文章我们重点说了ArrayLIst,是时候放出这张图了. 这张图里的内容对我们学习Java来说,非常的重要,白色的部分是需要去了解的,黄色部分是我们要去重点了解的,不但要知道怎么去用,至少还需要 ...

  5. 数组(ArrayList)底层怎样扩容

    ArrayList维护了数组transient Object[] elementData; 初始化 数组需要扩容时

  6. 一文看懂ArrayList的自动扩容

    基本原理 在我们日常开发中,ArrayList 是最常用的一种集合.我们都知道ArrayList的底层是基于数组来实现的,那么, 对于数组呢,我们都不陌生:数组是同一数据类型的集合,一旦创建后,大小就 ...

  7. 4、ArrayList的详细扩容过程

    一.ArrayList的扩容原理及过程 当我们创建了一个ArrayList对象并调用它的add方法 List list=new ArrayList();list.add("嘿嘿") ...

  8. Arraylist理解

    ArrayList 1.ArrayList的特点 相比之前的LinkedList可以实现动态扩容. 2.成员属性 private static final long serialVersionUID ...

  9. Arraylist理解(3)删除元素

    第三次强调,ArrayLIst是一个普通的类. 好,现在我们来讨论一下数组的删除,我们知道数组一但在堆内存中创建出来,数组长度是不可变的,看以下源码: 添加10个用户 比如我们要把"周八&q ...

最新文章

  1. oracle收购Mysql后,Mysql的安装配置方法
  2. 4.6、Libgdx线程介绍
  3. mysql left join的深入探讨
  4. 【元气云妹】有趣有料的云吞铺子,来一碗吗?
  5. 动态初始化一维数组详解
  6. c语言玫瑰花图形程序,一个玫瑰花的程序
  7. java 串口tcp客户端访问串口tcp服务器_怎么使用无线串口服务器
  8. javamail 解码 base64 html格式邮件_Spring整合javaMail
  9. GRE Tunnel实现企业网中的***
  10. VS编译NPAPI:jref类型出错
  11. 初中计算机教学进度表,初中学校教学活动安排表.doc
  12. 吉林大学超星学习通04
  13. cad线性标注命令_CAD中线性标注的快捷键是什么?
  14. 计算机硬盘各分区名称,电脑分区后修改磁盘名称的方法步骤
  15. 【EXLIBRIS】随笔记 004
  16. 蓝桥杯总结及经验教训
  17. 实验室服务器多人共用账号,搭建多人共用的GPU服务器
  18. JavaScript 获取字符串的最后一个字符
  19. Sublime Text:选择变量的所有实例并编辑变量名称
  20. “标签化”思想在分布式系统中的应用

热门文章

  1. 利用 Win32 启动和检测 UWP App 的方法
  2. 【迁移2018-05-08 14:14:27】全局唯一ID生成
  3. 2017百度之星程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】...
  4. 正确理解Python函数是第一类对象
  5. JavaScript 学习笔记— —Date对象
  6. 转:多条件查询测试用例设计方法——pairwise
  7. Apache Zookeeper入门1
  8. [转载].gdb调试器快速入门
  9. 信息学奥赛一本通 1179:奖学金 | 1938:【07NOIP普及组】奖学金 | OpenJudge NOI 1.10 04 | 洛谷 P1093 [NOIP2007 普及组] 奖学金
  10. OpenJudge NOI 1.4 20:求一元二次方程的根