热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ArrayList源码分析—构造方法

1空参构造默认空容量的数值privatestaticfinalObject[]DEFAULTCAPACITY_EMPTY_ELEMENTDATA{};真正存储数据的容器Obj

请添加图片描述


1 空参构造

// 默认空容量的数值
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// 真正存储数据的容器 Object数组
transient Object[] elementData; // 空值构造
public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

2 有参构造

private static final Object[] EMPTY_ELEMENTDATA = {};// 有参数的构造函数
// 假如initialCapacity=20
public ArrayList(int initialCapacity) {if (initialCapacity > 0) {// 创建了一个大小为20的空Object数组this.elementData = new Object[initialCapacity];// 如果参数传了0 那么还是空数组} else if (initialCapacity == 0) {this.elementData = EMPTY_ELEMENTDATA;} else {throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}
}

3 有参构造(传集合)

// 参数为一个集合的构造函数
public ArrayList(Collection<? extends E> c) {// 进行数组拷贝Object[] a &#61; c.toArray();// 把新数组的大小赋给当前集合if ((size &#61; a.length) !&#61; 0) {// 判断类型是否一致// 如果运行时类型不是ArrayList 说明调用时传入的是其他类型的集合if (c.getClass() &#61;&#61; ArrayList.class) {elementData &#61; a;} else {// 把数组变成Object类型elementData &#61; Arrays.copyOf(a, size, Object[].class);}} else {// 没有赋值大小成功 用空数组替代// replace with empty array.elementData &#61; EMPTY_ELEMENTDATA;}
}// ArrayList类
public Object[] toArray() {return Arrays.copyOf(elementData, size);
}// Arrays类
public static <T> T[] copyOf(T[] original, int newLength) {return (T[]) copyOf(original, newLength, original.getClass());
}// Arrays类
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {&#64;SuppressWarnings("unchecked")// 创建了一个新数组// 数组的大小和原来的数组大小相同T[] copy &#61; ((Object)newType &#61;&#61; (Object)Object[].class)? (T[]) new Object[newLength]: (T[]) Array.newInstance(newType.getComponentType(), newLength);// 数组的拷贝System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));// 返回新数组return copy;
}

这个构造方法和clone类似 也存在“浅拷贝”的问题

集合的clone方法 调用了Arrays的copyOf 这个方法最底层做复制的实现是 System.arraycopy()

复制一维数组没问题&#xff0c;普通变量没问题 如果是二维数组或对象 就会影响原来的值

带集合的构造方法 是用了toArray方法 这个方法调用Arrays的copyOf 所以最后还是 System.arraycopy()

数组复制时 使用Arrays.copyOf和clone&#xff08;&#xff09;方法 都是一样的效果


推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ... [详细]
  • 本文介绍了如何在Spring框架中使用AspectJ实现AOP编程,重点讲解了通过注解配置切面的方法,包括方法执行前和方法执行后的增强处理。阅读本文前,请确保已安装并配置好AspectJ。 ... [详细]
  • 传统上,Java 的 String 类一直使用 char 数组来存储字符数据。然而,在 Java 9 及更高版本中,String 类的内部实现改为使用 byte 数组。本文将探讨这一变化的原因及其带来的好处。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 深入解析Java中的空指针异常及其预防策略
    空指针异常(NullPointerException,简称NPE)是Java编程中最常见的异常之一。尽管其成因显而易见,但开发人员往往容易忽视或未能及时采取措施。本文将详细介绍如何有效避免空指针异常,帮助开发者提升代码质量。 ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 在 Java 中,`join()` 方法用于使当前线程暂停,直到指定的线程执行完毕后再继续执行。此外,`join(long millis)` 方法允许当前线程在指定的毫秒数后继续执行。 ... [详细]
author-avatar
菜蔸蔸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有