Arraylist理解(2)扩容
我们先回顾一下之前的所说过的数组,话不多说,上代码:
老规则,我们继续画一画,加深一下印象,上图:
这个图我们去掉了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)扩容相关推荐
- 详解java集合之ArrayList——底层实现是一个Object数组。分析ArrayList的自动扩容,原来不一定是1.5倍
ArrayList的底层实现--非private权限的Object数组 ArrayList的类结构图 1. ArrayList的创建 1.1 参数为空的构造方法--ArrayList内部的Object ...
- ArrayList源码扩容机制分析
ArrayList源码&扩容机制分析 发上等愿,结中等缘,享下等福 文章目录 ArrayList源码&扩容机制分析 1. ArrayList 简介 1.1. Arraylist 和 V ...
- arraylist是如何扩容的?_ArrayList的源码分析
ArrayList的类定义 public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, ...
- ArrayList理解(5)与vector区别
前几篇文章我们重点说了ArrayLIst,是时候放出这张图了. 这张图里的内容对我们学习Java来说,非常的重要,白色的部分是需要去了解的,黄色部分是我们要去重点了解的,不但要知道怎么去用,至少还需要 ...
- 数组(ArrayList)底层怎样扩容
ArrayList维护了数组transient Object[] elementData; 初始化 数组需要扩容时
- 一文看懂ArrayList的自动扩容
基本原理 在我们日常开发中,ArrayList 是最常用的一种集合.我们都知道ArrayList的底层是基于数组来实现的,那么, 对于数组呢,我们都不陌生:数组是同一数据类型的集合,一旦创建后,大小就 ...
- 4、ArrayList的详细扩容过程
一.ArrayList的扩容原理及过程 当我们创建了一个ArrayList对象并调用它的add方法 List list=new ArrayList();list.add("嘿嘿") ...
- Arraylist理解
ArrayList 1.ArrayList的特点 相比之前的LinkedList可以实现动态扩容. 2.成员属性 private static final long serialVersionUID ...
- Arraylist理解(3)删除元素
第三次强调,ArrayLIst是一个普通的类. 好,现在我们来讨论一下数组的删除,我们知道数组一但在堆内存中创建出来,数组长度是不可变的,看以下源码: 添加10个用户 比如我们要把"周八&q ...
最新文章
- oracle收购Mysql后,Mysql的安装配置方法
- 4.6、Libgdx线程介绍
- mysql left join的深入探讨
- 【元气云妹】有趣有料的云吞铺子,来一碗吗?
- 动态初始化一维数组详解
- c语言玫瑰花图形程序,一个玫瑰花的程序
- java 串口tcp客户端访问串口tcp服务器_怎么使用无线串口服务器
- javamail 解码 base64 html格式邮件_Spring整合javaMail
- GRE Tunnel实现企业网中的***
- VS编译NPAPI:jref类型出错
- 初中计算机教学进度表,初中学校教学活动安排表.doc
- 吉林大学超星学习通04
- cad线性标注命令_CAD中线性标注的快捷键是什么?
- 计算机硬盘各分区名称,电脑分区后修改磁盘名称的方法步骤
- 【EXLIBRIS】随笔记 004
- 蓝桥杯总结及经验教训
- 实验室服务器多人共用账号,搭建多人共用的GPU服务器
- JavaScript 获取字符串的最后一个字符
- Sublime Text:选择变量的所有实例并编辑变量名称
- “标签化”思想在分布式系统中的应用
热门文章
- 利用 Win32 启动和检测 UWP App 的方法
- 【迁移2018-05-08 14:14:27】全局唯一ID生成
- 2017百度之星程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】...
- 正确理解Python函数是第一类对象
- JavaScript 学习笔记— —Date对象
- 转:多条件查询测试用例设计方法——pairwise
- Apache Zookeeper入门1
- [转载].gdb调试器快速入门
- 信息学奥赛一本通 1179:奖学金 | 1938:【07NOIP普及组】奖学金 | OpenJudge NOI 1.10 04 | 洛谷 P1093 [NOIP2007 普及组] 奖学金
- OpenJudge NOI 1.4 20:求一元二次方程的根