ArrayList初始化

首先ArrayList是一个普通的类,我们来看一段代码:

首先:执行List<Person> list1 = new ArrayList<>();当看到new这个关键字的时候,我们脑袋里应该第一印象就是这货在堆内存开辟了一块空间,好我们再来画一画。

注:常量池位于方法区,方法区位于堆内存,前面没涉及到,所以没画方法区,现在补上

好,既然是new出来的,那我们直接从构造函数入手,看一下构造函数做了什么。

很简单,就一行代码,继续看一下,this.elementData和DEFAULTCAPACITY_EMPTY_ELEMENTDATA分别是什么

红框里的内容是不是似曾相识?是的,和String一样,底层是数组,唯一的区别是String底层是char[]数组(忘了的可以复习一下,传送门:String是一个很普通的类 - 知乎专栏),而这儿是Object[]数组,也就是说该数组可以放任何对象(所有对象都继承自父类Object),执行完构造函数后,如下图。

注:static修饰的变量,常驻于方法区,我们不需要new,JVM会提前给我们初始化好,这个特性在实际开发过程中,经常拿来做缓存。在让人疑惑的Java代码 - 知乎专栏 一文中,我们文中Integer的缓存就是最好的例子。static变量又叫类变量,不管该类有多少个对象,static的变量只有一份,独一无二。
fianl修饰的变量,JVM也会提前给我们初始化好。
transient这个关键字告诉我们该对象在序列化的时候请忽略这个元素,后续我们会讲序列化,这儿先跳过。

继续执行:List<Person> list2 = new ArrayList<>();

ArrayList这个类的作者真是好贴心,new的时候连缓存都考虑到了,为了避免我们反复的创建无用数组,所有新new出来的ArrayList底层数组都指向缓存在方法区里的Object[]数组。

继续执行Person person1 = new Person("张三")

继续,执行list1.add(person1),不多说,看源码ArrayList是怎么处理add的。

我们先看ensureCapacityInternal方法,方法里有个参数是size,看们先看一下这个size从哪来的。

原来是一个成员变量,相信大家看到size一猜就知道大概是干嘛的了吧。好,我们在图里的ArrayList对象里补上它,size是int基本数据类型,成员变量初始化的为0。

继续往下看

ensureCapacityInternal方法是在add里面调用的。

再看grow方法

跟进到Arrays这个工具类,很简单

再看copyOf()方法

最后我们来看一下System.arraycopy()方法,好奇怪,这个方法只有定义,却没有实现,方法用了一个native来修饰。native的方法,是由其它语言来实现的,一般是(C或C++),所以这儿没有实现代码。这是一个数组拷贝方法,大家还在写for循环拷贝数组吗?以后多用这个方法吧,简单又方便还能获得得更好的性能。

注:native方法,我们会后续会讲解,我们先关注本章内容。

由于数组内容目前为空,相当于没有拷贝。折腾了这么久,原来只是为了创建一个默认长度为10的Object[]数组,有些朋友说,直接new不就行了,这么费劲,其实这里面大有文章,别急,稍后会说,继续画图。

再回过头来看,add()这个方法,继续往下执行:

很简单,size现在是0,就是把传进来的这个e(这里是person1),放到list1的elementData[]下标为0的数组里面,同时size加1,老规矩,上图。

注意看红框里,虽然我们list1里的elementData数组的长度是10,但是size是1,size是逻辑长度,并不是数组长度。

现在debug一下,验证我们图里的内容:

好的,执行一下本文开始那段代码,看结果:

顺便看一看size()方法的源码:

有人说,呀,就一个元素,在堆内存中占了10个位置,好浪费呀,没办法,你要享受ArrayList的便利与丰富的API,就得牺牲一下空间作为代价。

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

ArrayList理解(1)初始化相关推荐

  1. 【Android 10 源码】深入理解 Omx 初始化

    MediaCodec 系列文章: [Android 10 源码]深入理解 MediaCodec 硬解码初始化 [Android 10 源码]深入理解 Omx 初始化 [Android 10 源码]深入 ...

  2. Arraylist理解(2)扩容

    我们先回顾一下之前的所说过的数组,话不多说,上代码: 老规则,我们继续画一画,加深一下印象,上图: 这个图我们去掉了ArrayList初探 - 知乎专栏 一文图里那些无用的细节(方法区,常量池等),方 ...

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

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

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

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

  5. 【深入理解】初始化列表

    目录 一.什么是初始化列表? 二.初始化列表长啥样? 三.初始化列表的特性 1.由于是在定义阶段进行的初始化,所以,只能在定义阶段进行的初始化类型便只能在初始化列表中进行初始化. 2.初始化顺序不是跟 ...

  6. Arraylist理解

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

  7. java基础-初学者理解对象初始化的最佳方案

    一 前言 本节内容将会提到方法重载,对象的初始化,对象的构造器,和this关键字的使用,以及会简要的概括一下java中对象回收机制.觉得文章不错的读者可以关注一下作者的博客和公众号(同博客名称) 二 ...

  8. java arraylist 实现原理_Java进阶--深入理解ArrayList实现原理

    编辑推荐: 文章主要介绍ArrayList的继承关系,ArrayList的方法使用和源码解析,它提供了动态的增加和减少元素,实现了Collection和List接口,可以灵活的设置数组的大小,希望对您 ...

  9. java面试——集合(ArrayList、lterator、LinkedList)源码理解

    文章目录 ArrayList扩容机制 lterator迭代器 ArrayList与LinkedList的区别 ArrayList扩容机制 初始化:(无参时)数组大小是0,添加第一个元素时是10.有参数 ...

最新文章

  1. Android setOnItemClickListener cannot be used with a spinner
  2. GLIBC 升级安装与 SCL 知识盲区
  3. Quantile Regression,python
  4. linux socket SO_KEEPALIVE选项
  5. SQLServer 2005删除无主键表中的重复项
  6. CentOS 6.x搭建Open***实现双IDC互联
  7. DDD专家张逸:构建领域驱动设计知识体系
  8. 容器编排技术 -- Kubernetes Annotations
  9. ndarray.ravel([order]) 和 ndarray.flatten([order])
  10. 移动一个网站集所使用的内容数据库
  11. css3媒体查询实例,css3 响应式媒体查询的示例代码
  12. 洛谷 P1005 矩阵取数游戏
  13. matlab同时画n多条曲线,设置颜色及图例
  14. audit linux mysql_MySQL审计工具Audit Plugin安装使用
  15. raptor算法流程图例题_【实验4】熟悉可视化算法描述软件(RAPTOR)使用及结构化程序设计...
  16. 微信小程序 表情小作坊 — 轻松定制表情包 1
  17. 微信小程序中的添加收获地址的流程
  18. 怎样用通俗的语言解释REST,以及RESTful?
  19. 【Makefile】strip
  20. ERP系统的开发------(整理)

热门文章

  1. Javascript之ES7详解
  2. 搭建Hadoop的HA高可用架构(超详细步骤+已验证)
  3. PowerDesigner中列表显示TABLE的NAME而不是CODE
  4. 修改程序的形而上学思考(随笔)
  5. uboot支持S3C6410的SD启动
  6. 写一个类Army,代表一支军队,这个类有一个属性Weapon数组w(用来存储该军队所拥有的所有武器), 该类还提供一个构造方法,在构造方法里通过传一个int类型的参数来限定该类所能拥有
  7. OJ1037: 四则运算
  8. dnf强化卷代码_这行代码告诉你!为什么你地下城与勇士(DNF)的装备强化老是失败?...
  9. curd日志记录php,ThinkPHP学习之CURD操作(一)
  10. 信息学奥赛一本通 1072:鸡尾酒疗法 | OpenJudge NOI 1.5 18