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