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

     

  • 相关阅读:
    样式超出设定宽度显示显示省略号
    客户端存在潜在危险request.from
    MenuStrip如何设置快捷键
    SVN的使用方法
    长串英文字符不换行的解决办法
    thickbox使用
    System.Web.UI.UserControl”,因此此处不允许
    C#中实现拖动无边框Form窗体和窗体的起始位置
    (转)Altera Forum精彩问答汇总
    (转)如何以32 bit的方式存取SDRAM?
  • 原文地址:https://www.cnblogs.com/maokun/p/6715560.html
Copyright © 2011-2022 走看看