首页 > 编程语言 >关于Java中ArrayList类的toArray方法详解

关于Java中ArrayList类的toArray方法详解

时间:2023-06-25 17:12:15浏览次数:35  
标签:toArray Java newLength ArrayList original copyOf public

先上源码:

public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }

可以看到ArrayList类的toArray()方法调用了Arrays.copyOf(elementData,size)(其中的elementData是ArrayList类中用来存储对象的数组,size是数组大小),接下来进入其内部:

  public static <T> T[] copyOf(T[] original, int newLength) {
        return (T[]) copyOf(original, newLength, original.getClass());
    }

发现它又调用了重载的copyOf(original, newLength, original.getClass())方法,继续深入:

 public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (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;
    }

原来它会先创建一个T数组引用copy,之后调用System.arraycopy进行复制(对于普通类型的original数组,System.arraycopy是深复制,否则,是浅复制)。至此,可以下定结论,toArray()方法每次放回的数组引用不同,对于普通类型的ArrayList实例来说,toArray是安全的,但是对于对象类型的ArrayList实例来说,toArray是不安全的,如下所示:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static java.lang.reflect.Proxy.newProxyInstance;

public class A  implements Cloneable{
    public String name;

    public static void main(String[] args) throws CloneNotSupportedException {
        ArrayList<A> objects = new ArrayList<>();
        A a1 = new A();
        a1.name = "1";
        objects.add(a1);
        A[] objects1 = (A[])objects.toArray(new A[0]);
        A[] objects2 = (A[])objects.toArray(new A[0]);
        objects1[0].name = "2";
        System.out.println(objects1[0].name);
        System.out.println(objects2[0].name);
    }
}

 可以看到只修改了objects1[0],但objects2[0]也受影响了。

 

标签:toArray,Java,newLength,ArrayList,original,copyOf,public
From: https://www.cnblogs.com/rockdow/p/17503389.html

相关文章

  • 【淘宝商品详情数据】api接口获得宝贝详情数据、优惠价格数据Java调用示例
    淘宝详情API接口的作用是获取淘宝平台上某个商品的详细信息,包括商品标题、价格、图片、规格、参数、店铺信息等。开发者可以通过该接口获取到商品的原始数据,方便进行数据分析、价格比较、爬取等操作。通过该接口获取到的商品详情数据可以结合其他数据进行深度挖掘,例如可以将商品数......
  • 【Java】修改生成的PDF的表格中文字的字体
    首先导入依赖<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency>使用form.setFieldProperty("${表格名字}",&......
  • 使用java中的Calendar遇到的时区问题
    项目中有一个增加1小时的工具函数结果今天测试出现了一个问题原因是1986年的9月13号到14号之间会有一个时区的转换需要程序特殊处理下这是原函数的结果SatSep1322:00:00CDT1986SatSep1323:00:00CDT1986SatSep1323:00:00CST1986SunSep1400:0......
  • Java学习之Mysql基础问题整理
    Mysql常见存储引擎命令:SHOWENGINES; Mysql版本5.5以后默认引擎是InnoDB,5.5版本以前的是MyISAMInnoDB和MyISAM的区别1、InnoDB支持事务,MyISAM不支持。对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个......
  • JAVA SE基础《二》---- JAVA语法
    目录JAVA基础语法注释字面量变量变量使用注意事项关键字、标识符 一.注释详解什么是注释?注释是写在程序中对代码进行解释说明的文字,方便自己和其他人查看,以便理解程序的。注释有哪些单行注释 多行注释 文档注释:文档注释的内容是可以提取到一个程序说......
  • 迟来的秋招面经,17家公司,Java岗位
    一位朋友秋招面试了17家公司(都是中小公司或者银行),Java后端岗。下面是他的个人情况、求职经验已经这17家公司的面经。个人情况和求职经验其实现在是挺后悔大学没有好好的学习的,因为基本上都会提到一些成绩相关的事情,每次填成绩都只能填个50%(实际上更低),并且还有挂科,没有奖学金,没......
  • java调用cmd命令
    importlombok.extern.slf4j.Slf4j;importorg.apache.commons.io.IOUtils;importjava.io.InputStream;importjava.nio.charset.StandardCharsets;importjava.util.AbstractMap;importjava.util.List;importjava.util.Map;importjava.util.concurrent.Completab......
  • WebAssembly能不能取代JavaScript?15张卡通图给你答案!
    一切能用JavaScript实现的,终将用JavaScript实现。一切能编译为WebAssembly的,终将编译为WebAssembly。前端er们,WebAssembly用上了吗?在浏览器中快速运行非JavaScript语言,比如C、C++、Rust,是不是很香?今天,我们就来用15张小画图说WebAssembly。有必要先介绍一下小画的创作者。她叫LinCl......
  • JAVA SPI简单实现
    JavaSPI(ServiceProviderInterface)是一种用于实现组件化、插件化和可扩展性的机制。它是Java标准库提供的一种服务发现机制,用于在运行时动态加载和实例化实现了特定接口的类。JavaSPI的核心概念是服务接口(ServiceInterface)、服务实现者(ServiceProvider)和服务提供者配置文件(S......
  • JavaScript
    JavaScriptHTML(结构层)CSS(表现层)JavaScript(行为层)什么是JavaScriptJavaScript是一门世界上最流行的脚本语言。一个合格的后端人员,必须要精通JavaScript历史ECMScript它可以理解为是JavaScript的一个标准。最新版本已经到es6版本。但是大部分浏览器还只停留在支持es5代......