在List类的具体实现类 ArrayList类中,有一个toArray()方法,该方法的作用是将ArrayList类型的对象转换为数组。

该类型有两个方法:1.toArray()  和 2. toArray(T[])

先来看一下源码:

    public Object[] toArray() {return Arrays.copyOf(this.elementData, this.size);}
首先,返回值变成了Object[]类型,而toArray()的实质是调用了Arrays.copyof()方法。
由于是用的idea的反编译,所以,参数类型显示的是var变量值,但是,这个不影响我们阅读简单的代码。
    public static <T> T[] copyOf(T[] var0, int var1) {return (Object[])copyOf(var0, var1, var0.getClass());}
    public static <T, U> T[] copyOf(U[] var0, int var1, Class<? extends T[]> var2) {Object[] var3 = var2 == Object[].class?(Object[])(new Object[var1]):(Object[])((Object[])Array.newInstance(var2.getComponentType(), var1));System.arraycopy(var0, 0, var3, 0, Math.min(var0.length, var1));return var3;}
到这个我们发现了,这么一行代码:
 Object[] var3 = var2 == Object[].class?(Object[])(new Object[var1]):(Object[])((Object[])Array.newInstance(var2.getComponentType(), var1));
这就是ArrayList.toArray()方法的实质。
如果我们ArrayList容器中元素的类型是Object[]类型,那么就new一个Object的数组,然后调用
System.arraycopy
把ArrayList对象中的元素依次复制进入新的数组,然后新数组。
下面看一下ArrayList(T[]var1)这个方法,其实这才是关键
    public <T> T[] toArray(T[] var1) {if(var1.length < this.size) {return (Object[])Arrays.copyOf(this.elementData, this.size, var1.getClass());} else {System.arraycopy(this.elementData, 0, var1, 0, this.size);if(var1.length > this.size) {var1[this.size] = null;}return var1;}}
我们看到了,其内部实现,是将ArryList列表的长度和我们提供的数组var1的长度进行比较,如果:
1.ArrayList列表长度更长,那么就调用Arrays.copyOf()方法,和上面一样,生成新的数组,然后依次将元素复制过去。
2.如果var1数组的长度更长,那就好办了,直接使用var1数组进行一个元素复制的操作,那么,var1数组更长的部分怎么办呢?
仅仅是将ListArray对象长度的末尾置为了null,然后后面的就不管了。
     var1[this.size] = null;
我们可以写一个例子测试一下toArray(T[]var1)方法:

我们的var1[]数组长度为3,而定义的ArrayList列表st长度为1.


现在将st列表复制进入var数组,我们预计的结果是,复制后的地址和原来var1的地址是一样的,并且var1中第一个元素被换成了"zzz",第二个元素变成了null,第三个元素不变

下面看一下结果:



发现结果果然如此。





var1 的地址 :[Ljava.lang.String;@74a14482
复制后的地址 :[Ljava.lang.String;@74a14482
zzz
null
2

        String[]var1 = new String[3];var1[0] ="0";var1[1] = "1";var1[2] = "2";System.out.println("var1 的地址 :" + var1);List<String> ll= new ArrayList<String>();ll.add("zzz");System.out.println("复制后的地址 :" + ll.toArray(var1));for(String i : var1){System.out.println(i);
												

深入理解ArrayList中 toArray(),toArray(T[])方法相关推荐

  1. 理解Vue中的methods对象方法里的this指向,并解读源码

    Vue3的版本 "version": "3.2.20" 阅读区域 618 - 645 解决疑惑 1. methods 对象的 this指向 2. methods ...

  2. python装饰器原理wraps(method)(self)_理解Python中装饰器最佳方法~

    了解装饰器之前, 可以先了解一下什么是闭包的概念为好: 闭包, 是指在一个函数中定义了一个另外一个函数,内函数里运用了外函数的临时变量(实际参数也是临时变量),并且外函数的返回值是内函数的引用(一切皆 ...

  3. python中的类是什么意思_如何理解python中的类和方法(转)

    一.python中类和对象的概念 首先,我们先来说说什么是类.看了很多关于python类的介绍,大多都介绍如何使用,但是对于概念却一笔带过,一个初学编程的小伙伴很难理解. 概括的说:类可以比作是某种类 ...

  4. 怎么理解python的__init___理解Python中super()和__init__()方法

    __init__()一般用来创建对象的实例变量,或一次性操作.super()用于调用父类的方法,可用来解决多重继承问题.单继承中,super()和__init__()功能类似,主要区别:1)使用sup ...

  5. 理解JQuery中的data()使用方法

    在前端我们经常会做的操作就是做数据状态的判断和数据处理.提交,经常会操作dom,也会保存一个全局的数据处理.这样做是可以实现很多功能,但是缺点就是过多操作dom会浪费性能,全局数据保存多了有时候真的会 ...

  6. 深入理解List的toArray()方法和toArray(T[] a)方法

    深入理解List的toArray()方法和toArray(T[] a)方法 这两个方法都是将列表List中的元素转导出为数组,不同的是,toArray()方法导出的是Object类型数组,而toArr ...

  7. 详解List的toArray()方法和toArray(T[] a)方法

    这两个方法都是将列表List中的元素转导出为数组,不同的是,toArray()方法导出的是Object类型数组,而toArray[T[] a]方法导出的是指定类型的数组. 下面是两个方法的申明及说明, ...

  8. ArrayList中元素的删除操作

    ArrayList中元素的删除操作 在聊 ArrayList 的删除删除操作之前,先来说说它的遍历方法. 一个 list 的遍历方法主要有三种: Iterator 迭代器遍历 遍历下标 for 循环遍 ...

  9. [Java 基础] 深入理解List的toArray()方法和toArray(T[] a)方法

    深入理解List的toArray()方法和toArray(T[] a)方法 这两个方法都是将列表List中的元素转导出为数组,不同的是,toArray()方法导出的是Object类型数组,而toArr ...

最新文章

  1. maven基础概念学习1
  2. 要找到现阶段最适合自己的方法
  3. java int数组写入文件中_Java程序将int数组写入文件
  4. mouted vue 操作dom_vue中使用refs定位dom的坑-阿里云开发者社区
  5. windows稀疏文件
  6. Spring Boot 单例模式中依赖注入问题
  7. 百度区块链所遇到的问题及处理汇总
  8. 当输入法语音识别准确率达97%是怎样一种体验?
  9. Ubuntu安装虚拟机工具(VMware Tool)详解
  10. html5历史纪录管理,HTML 5 新增方法以及历史管理
  11. 举办了一个如何对外协作的讲座,4人到场
  12. 汇编语言王爽实验16
  13. java table注解_java注解简单使用
  14. 微博营销的优劣势。如何利用微博开展营销。
  15. 【BZOJ4134】【树上博弈】【博弈论】【线段树合并】ljw和lzr的hack比赛 题解
  16. Unable to add window android.view.ViewRootImpl$W@c1bf05d -- permission denied for window type 2003
  17. 2020蓝天杯论文评比系统_2020年杭州市初中数学核心组教师高级研修培训系列视频(十一)...
  18. 把经纬度转换成十进制
  19. 避坑外连腾讯云服务器redis 6379
  20. JAVA 调用摄像头 拍照 实现人脸识别

热门文章

  1. AVB校验微观版本:android avb(Android Verified Boot)验证
  2. 学人工智能必备的数学课,再也不怕学AI了
  3. Cat.1、Cat.4、4G之间的区别
  4. SPFA单源最短路径算法
  5. shell字符串包含空格处理
  6. 移植WebRTC中的VAD
  7. Ubuntu 安装 libvirt
  8. mysql的binlog开启方式,查看方式.三种binlog模式介绍.以及使用binlog恢复数据.删除binlog
  9. 使用 ab 对网站进行压力测试
  10. js 实现 页面 自动关闭