java arraylist数组初始化,ArrayList初始化 – Java那些事儿

java arraylist数组初始化,ArrayList初始化 – Java那些事儿ArrayList 部分一共五篇文章了 并且引入了时间复杂度来分析 强烈建议大家一定要按顺序阅读 本文是第 1 篇 前些天的文章 反复的画图 不停的重复 就是想让大家理解 对象在内存中是什么样的 也是为今天的及以后的讲解打下基础 如果要说大家在写 Java 代码的时候哪个类用得最多 我想除了 String 基本上就是 ArrayList 了吧 那今天我们说说 ArrayList 首先 ArrayList 是一个普通的类

ArrayList部分一共五篇文章了,并且引入了时间复杂度来分析,强烈建议大家一定要按顺序阅读,本文是第1篇。

前些天的文章,反复的画图,不停的重复,就是想让大家理解,对象在内存中是什么样的。也是为今天的及以后的讲解打下基础。如果要说大家在写Java代码的时候哪个类用得最多,我想除了String,基本上就是ArrayList了吧,那今天我们说说ArrayList。

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

91ddf2df6e27d8e6207ec113d442b5b4.png

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

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

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

90f0cff0837489c929ae801c03c12bf3.png

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

cdf6787cbf70ec8faf31e9d61d2cb0f2.png

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

dc36b0e2355b4e75387a755e41471bf7.png注:static修饰的变量,常驻于方法区,我们不需要new,JVM会提前给我们初始化好,这个特性在实际开发过程中,经常拿来做缓存。在让人疑惑的Java代码 – Java那些事儿 一文中,我们文中Integer的缓存就是最好的例子。static变量又叫类变量,不管该类有多少个对象,static的变量只有一份,独一无二。

fianl修饰的变量,JVM也会提前给我们初始化好。

transient这个关键字告诉我们该对象在序列化的时候请忽略这个元素,后续我们会讲序列化,这儿先跳过。

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

8c90e4d3e87876946de9cd83dfb35050.png

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

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

ce710a4973fc321094ad6e26b57d1721.png

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

322f8350b9d303f26460620753593b3d.png

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

cb360359ff4a339c8db8135f54289afa.png

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

3de8e18ae00c2e9c3531de0fb6be6b2f.png

继续往下看

9969f842192ab3e85b789e5606adb56b.png

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

caff4469257be674728d81b235098dd7.png

再看grow方法

84ae7d2b332f3c84908a6c837375ee5f.png

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

7a8f9e49606ec2903e715c1aff0b6e7e.png

再看copyOf()方法

7a1ec5dea91bd145d27da19e2eeb8671.png

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

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

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

bf86bd7cbeea6cbab9a24ecad7b0c61e.png

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

51337d70d5ffb107881dd9ab51eb1bcd.png

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

85d281826def8b9fceb57854b9ccd22e.png

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

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

b4138e3d5a8770446c9705d1f661cece.png

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

d5afb2f83b499ef96c5a0255bd6c7026.png

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

3d91678cbd433b060bc37d6a9af061a6.png

有人说,呀,就一个元素,在堆内存中占了10个位置,好浪费呀,没办法,你要享受ArrayList的便利与丰富的API,就得牺牲一下空间作为代价。注:本专栏文章首发于公众号:saysayJava。所有示例代码均已上传至公众号,需要请关注下载。

如果喜欢本系列文章,请为我点赞或顺手分享,您的支持是我继续下去的动力,您也可以在评论区留言想了解的内容,有机会本专栏会做讲解,最后别忘了关注一下我。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207399.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:54
下一篇 2026年3月19日 下午1:55


相关推荐

  • 黑客[入门]

    黑客[入门]第1章黑客基础知识随着互联网技术的飞速发展,网络世界的安全性不断受到挑战。如果你要上网,就免不了遇到黑客的侵扰。本章就为大家介留一些最基本的黑客入门知识,揭密黑客常用的一些命令,当然这些微不足道的伎俩难以入侵戒备森严的网络,不过至少让初学者对黑客的“工作情形”有初步的认识。本章导读1.1黑客简单介绍最早的计算机于1946年在宾夕法尼亚大学出现,而最早的黑客出现于麻省理工学院(贝尔实验室也有)。最初的黑客一般都是一些高级的技术人员,他们热衷于挑战、崇尚自由并主张信息的共享。1…

    2022年5月8日
    67
  • Word修改默认字体

    Word修改默认字体在Win10的最近一次更新后,发现我的office365默认字体都给我改成等线,什么鬼,以前都是宋体,现在这个还真的不习惯,就动手修改默认字体,设置如下: 1、在word空白处点击鼠标右键,选择字体。 2、在弹出框设置样式(字体、大小等),设置完成之后点击设置默认值3、选择如下,点击确定即可。后面再创建word就默认是设置的字体以及大小。…

    2022年6月13日
    45
  • 咋搭建域控服务器,Active Directory虚拟机搭建域控服务器环境

    咋搭建域控服务器,Active Directory虚拟机搭建域控服务器环境前言还是和上一章一样 痛苦过后还是记录下给后来人提供便利为妙 虚拟机选择 建议 Hyper V 或者 VMware 系统选择 建议 WIindowsServ 及以上我这里是使用 VMwareWorkst Windowsserve 系统 虚拟机网络的配置 1 查看 VMware 虚拟网络编辑器 主要查看 NAT 模式 我这里 NAT 模式 VMnet8 网络 IP

    2026年3月17日
    1
  • JMM概述_jmi名词解释

    JMM概述_jmi名词解释简介什么是JMM内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象描述,不同架构下的物理机拥有不一样的内存模型,Java虚拟机是一个实现了跨平台的虚拟系统,因此它也有自己的内存模型,即Java内存模型(JavaMemoryModel,JMM)。因此它不是对物理内存的规范,而是在虚拟机基础上进行的规范从而实现平台一致性,以达到Java程序能够“一次编写,到处运行

    2025年9月15日
    8
  • matlab保存所有图,Matlab中图片保存的5种方法

    matlab保存所有图,Matlab中图片保存的5种方法matlab的绘图和可视化能力是不用多说的,可以说在业内是家喻户晓的。Matlab提供了丰富的绘图函数,比如ez**系类的简易绘图函数,surf、mesh系类的数值绘图函数等几十个。另外其他专业工具箱也提供了专业绘图函数,这些值得大家深入学习好久。今天我只是讨论下如何保存这些由Matlab绘制出来的图像呢?当然借助第三方截图软件,就算了!1、使用imwrite函数如图像是img,则可以使用im…

    2025年9月7日
    7
  • VLAD讲解2

    VLAD讲解2局部聚合向量 noteVLADstan 1 nbsp nbsp 计算很原始 加法 减法操作 2 nbsp nbsp 和 CNN 相比 训练一个 VLAD 编码器更直接 也不需要大量的训练集 3 nbsp nbsp VLAD 被认为是 FV 的一个特例 所以具有 FV 的一些性质 例如最重要的 Fisherkernel 4 nbsp nbsp 从经验上来看 VLADisstate of a

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号