美文网首页java成长笔记
ArrayList的toArray()和toArray(T[]

ArrayList的toArray()和toArray(T[]

作者: G_uest | 来源:发表于2019-08-13 22:22 被阅读0次

    API方法介绍

    方法 返回值类型 方法描述
    toArray() Object[] 以正确的顺序(从第一个到最后一个元素)
    返回一个包含此列表中所有元素的数组。
    toArray(T[] a) <T> T[] 以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素);
    返回的数组的运行时类型是指定数组的运行时类型。

    假装我有一个ArrayList类型的list集合,里边存满了Person对象(Person 已经实现了 Comparable接口)。
    我现在需要对person根据年龄排序,sort()方法只能接收数组类型的数据。
    所以我就需要把 list 转换为数组类型

    toArray()

    刚开始我是这样写的

    Person[] kvs = (Person[]) list.toArray();
    

    但是会报错

    java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Lbase.Person
    

    原因很简单,不能把Object[] 转换为 Person[],想要转换只能把元素从数组中拿出来,一个一个的强转。
    比如:

    for(int i = 0; i < list.size(); i++){
        person[i] = (Person) lise.get(i);
    }
    

    其实也可以不向下转型,使用多态的概念

    // 转换为数组,得到 Object[]
    Object[] kvs =  keyValueList.toArray();
    // 排序
    Arrays.sort(kvs);
    // 输出
    for(Object kv : kvs){
        System.out.print(kv);
    }
    

    toArray(T[] a)

    对于数组转换类型,上边的方法有点麻烦。
    使用toArray(T[] a)更简单

    
    Person[] persons = list.toArray(new Person[list.size()])
    
    // 输出
    for(Person person : persons){
        System.out.print(person);
    }
    

    toArray(T[] a)部分源码

    public <T> T[] toArray(T[] a) {
        // size: ArrayList的大小(它包含的元素的数量)
        if (a.length < size)
            // 如果传入数组长度小于size,新建一个和a同类型的数组,拷贝数据并返回
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        
        // 把数据拷贝到数组 a 中,返回
        System.arraycopy(elementData, 0, a, 0, size);
        // 如果数据长度大于列表数据个数
        if (a.length > size)
            // 在数据末尾紧跟一个null,在调用者知道列表中没有null值,需要确定列表长度时使用。
            a[size] = null;
        return a;
    }
    

    相关文章

      网友评论

        本文标题:ArrayList的toArray()和toArray(T[]

        本文链接:https://www.haomeiwen.com/subject/ecmijctx.html