zoukankan      html  css  js  c++  java
  • List转数组toArray方法

    一、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;
     }

     

  • 相关阅读:
    黑域,黑阈 Permission denied
    手机闪存速度测试工具,AndroBench
    找进程的窗口Handle
    nginx http 正向代理
    windows命令行netstat 统计连接数
    FLIR ONE PRO热成像仪
    python2.0_s12_day14_jQuery详解
    python2.0_s12_day13_javascript&Dom&jQuery
    ssh&scp指定密钥
    apache+php生产环境错误记录
  • 原文地址:https://www.cnblogs.com/maokun/p/6715560.html
Copyright © 2011-2022 走看看