java成长笔记

ArrayList的toArray()和toArray(T[]

2019-08-13  本文已影响0人  G_uest

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;
}
上一篇下一篇

猜你喜欢

热点阅读