ArrayList有参构造源码解读

debug用例:

@Test
public void testArrayListConstructor(){ArrayList<Integer> arrayList = new ArrayList<>(3);
}

过程一

1、首先还是看这个类ClassLoader:

// Invoked by the VM after loading class with this loader.
private void checkPackageAccess(Class<?> cls, ProtectionDomain pd) {final SecurityManager sm = System.getSecurityManager();if (sm != null) {if (ReflectUtil.isNonPublicProxyClass(cls)) {for (Class<?> intf: cls.getInterfaces()) {checkPackageAccess(intf, pd);}return;}final String name = cls.getName();final int i = name.lastIndexOf('.');if (i != -1) {AccessController.doPrivileged(new PrivilegedAction<Void>() {public Void run() {sm.checkPackageAccess(name.substring(0, i));return null;}}, new AccessControlContext(new ProtectionDomain[] {pd}));}}
}

还是来到这个

先来看看:Invoked by the VM after loading class with this loader.这个是什么意思吧:

直接翻译下:在这个加载器加载类后被jvm调用

这个和无参构造也是一样的,sm也是null(研究过无参构造的源码【ArrayList无参构初始化】可以预测(/剧透)一下,应该是一样的,因为这里和无参构造的过程一样)

2、和无参构造也是来到System的:

public static SecurityManager getSecurityManager() {return security;
}

然后回到ClassLoader类的checkPackageAccess的判断语句,sm的值是null,那么就直接返回。

过程二

这个应该是正片了

1、先来到ArrayList的有参构造器:

public ArrayList(int initialCapacity) {if (initialCapacity > 0) {this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) {this.elementData = EMPTY_ELEMENTDATA;//empty_elementData} else {throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}
}

EMPTY_ELEMENTDATA是什么?可以推理一下,因为size=0,那么就是空数组

/*** Shared empty array instance used for empty instances.*/
private static final Object[] EMPTY_ELEMENTDATA = {};

既然initialCapacity就是传进来的容器大小,那么就直接对elementData初始化了。

这里已经是走到了这个ArrayList(int initialCapacity)有参构造的门口了,但是还没走进去。接下来的2-4步和【ArrayList无参构初始化】过程是一样的。

2、来到AbstractList的构造器:

protected AbstractList() {}

3、来到public abstract class AbstractCollection<E> implements Collection<E> {的构造器:

protected AbstractCollection() {}

4、来到Object:

public class Object {

这里走的是默认Object的无参构造器。

返回:

回到AbstractCollection -回到-- > AbstractList,将modCount给初始化为0了后,回到构造器完成构造器方法的执行

5、回到ArrayList(int initialCapacity)这个有参构造。

执行完this.elementData = new Object[initialCapacity]这一行就结束。

心得:有参构造和无参构造很多地方都是一样的

ArrayList有参构造源码解读相关推荐

  1. jdk1.8.0_45源码解读——ArrayList的实现

    转载自  jdk1.8.0_45源码解读--ArrayList的实现 一.ArrayList概述 ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的 ...

  2. ArrayList的源码解读

    ArrayList的源码解读 上篇文章 https://blog.csdn.net/qq_56299755/article/details/127272617 提到为什么ArrayList的扩容是1. ...

  3. ArrayList源码解读

    ArrayList源码解读 底层数据结构 ArrayList是在底层维护了一个elementData数组,添加了自动扩容等功能,最终形成了一个动态数组. 基本属性 // 初始化大小 private s ...

  4. ArrayList 实现原理及源码解析(jdk8 底层⽤的是数组)

    本文会主要从集合扩容.添加元素.删除元素三个方面来进行源码解读 在开始解读之前,我们先来看一下ArrayList添加一个元素的流程 基本在图中已经比较全面的说明了add一个元素的全流程 源码解读 我们 ...

  5. 简单源码解读之猜想验证

    一.背景 最近有一个朋友问,为啥 ArrayList 空参构造方法和有参构造方法的参数为 0 所用的空元素数组不用同一个. 空参构造方法: /*** Constructs an empty list ...

  6. java基本集合源码解读-JDK8/11

    文章目录 前言 详尽的debugger底层查看源码配置 一.集合体系图 二.List类集合 2.1.1 ArrayList 2.1.2ArrayList底层源码分析 结论: 2.1.3 使用Array ...

  7. Java Review - PriorityQueue源码解读

    文章目录 Pre PriorityQueue 概述 PriorityQueue 继承关系 PriorityQueue通过用数组表示的小顶堆实现 时间复杂度 构造函数 方法 add()和offer() ...

  8. Java Review - Queue和Stack 源码解读

    文章目录 Pre 概述 Queue Deque ArrayDeque 一览 构造函数 属性 方法 addFirst() addLast() pollFirst() pollLast() peekFir ...

  9. KClient——kafka消息中间件源码解读

    目录 kclient消息中间件 kclient-processor top.ninwoo.kclient.app.KClientApplication top.ninwoo.kclient.app.K ...

最新文章

  1. 【转载】Java之什么是JIT (Just In Time)?
  2. CV之FD之HOG:图像检测之基于HOG算法、简介、代码实现(计算图像相似度)之详细攻略
  3. boost::hana::tuple_t用法的测试程序
  4. C# dynamic 类型用法举例
  5. 如何查看Android项目的gradle版本和路径
  6. Tigase XMPP Server
  7. slideToggle使用
  8. 6678运行 linux,基于TMS320C6678的Linux镜像烧写演示
  9. 《人工智能狂潮》读后感——什么是人工智能?(一)
  10. LT8618SX寄存器配置
  11. 51单片机简易MP3程序驱动蜂鸣器播放
  12. lightbox使用
  13. calibre转换电子书格式教程
  14. 商业网站建设和运营的四度:Approachability、Usability、 Accessibility 和 Profitability...
  15. HTML文档繁转简,excel简繁转换 切换到“审阅”,点击“繁转简”:
  16. LoRa SX1278通信代码开发学习
  17. [git] fatal: Exiting because of an unresolved conflict.
  18. java web胖客户端,【转载】:瘦客户端、胖客户端、富客户端
  19. 如何在官网选择JAVA版本进行下载
  20. 基于abp vnext手动编写一个功能的完整步骤

热门文章

  1. wordpress漏洞工具_40个有用的工具来管理和发展您的WordPress博客(已更新)
  2. 神途boss_神途boss攻略
  3. 一句话理解到底怎么看神经网络的层数
  4. php上传照片作品,你需要知道你的作品怎么拍才好看!一张火起来的照片是好的宣传...
  5. WPF基础五:UI④ 条目控件ContextMenu
  6. 手把手教你在VirtualBox中与主机共享文件夹
  7. Google Earth Engine(GEE)——计算火灾面积并利用不同图表进行展示
  8. python数据参数化
  9. 健康问答语料的爬虫(C#)
  10. 服务器无法共享文件处理方法