List转数组toArray方法

java list 专栏收录该内容
9 篇文章 0 订阅

一、List.toArray方法

 

List提供了一个将List转为数组的一个非常方便的方法toArray。toArray有两个重载的方法:

 Object[]toArray()
          返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。
<T> T[]toArray(T[] a)
          返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

第一种重载方法,是将list直接转为Object[] 数组并不是数组的原类型

第二种方法是将list转化为你所需要类型的数组,当然我们用的时候会转化为与list内容相同的类型

 

二、toArray编程规则

(1) Object[] toArray()方法

List list = new ArrayList();
list.add(new Student());
list.add(new Student()); 
list.add(new Student());
Student[] s = (Student[]) list.toArray();

运行程序会抛出异常:java.lang.ClassCastException

 

(2)T[] toArray(T[] a)方法    如果a数组的长度小于原数组的长度,则重新分配空间复制并返回,否则使用a数组复制并返回

List list = new ArrayList();
list.add(new Student());
list.add(new Student());
list.add(new Student());
Student[] student = (Student[]) list.toArray(new Student[0]);

运行结果正确

 

三、ArrayList toArray方法源码

(1)Object[] toArray()方法

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

 Arrays类copyOf方法

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

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
     //判断类型是否为Object[]类型
     T[] copy = ((Object)newType == (Object)Object[].class)
         //Object[]类型实例化
         ? (T[]) new Object[newLength]
         //非Object[]类型实例化
         : (T[]) Array.newInstance(newType.getComponentType(), newLength);
     //复制数组
     System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
  return copy;
}

 

(2) T[] toArray(T[] a)方法

public <T> T[] toArray(T[] a) {
    //传入的数组长度小于实际数组长度重新分配空间并复制数组
    if (a.length < size)
      // Make a new array of a's runtime type, but my contents:
      return (T[]) Arrays.copyOf(elementData, size, a.getClass());
    //复制数组
    System.arraycopy(elementData, 0, a, 0, size);
    //旧数组长度作为索引,指向新数组的空间赋值为null
    if (a.length > size)
       a[size] = null;
    return a;
 }

 

 

 

  • 3
    点赞
  • 0
    评论
  • 11
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页

打赏

茅坤宝骏氹

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值