目录
首先我们需要明确的是:在很多编程语言(比如 Java)中,有集合类(如 ArrayList、LinkedList 等),这些集合类通常会有一个叫做toArray
的方法,并且有带参数的形式和无参数的形式。
一、toArray 无参方法
1. 如果使用 toArray() 的无参方法,返回结果只能为Object类型,强转为其他类型为报异常
案例演示:
public class Main {
public static void main(String[] args) {
List<Integer> ret=new ArrayList<>();
ret.add(10);
ret.add(20);
ret.add(30);
System.out.println("List的大小:"+ret.size());
// 如果使用 toArray() 的无参方法,返回结果只能为Object类型,强转为其他类型为报异常
Object[] array = ret.toArray();
System.out.println("===========");
System.out.println("正常转换后:"+array);
for (Object o:array){
System.out.println(o);
}
//Integer[] arr=(Integer)array;
System.out.println("===========");
}
}
二、toArray带参方法
这个带参数的toArray
方法的主要作用是将集合中的元素转换为数组的形式,并且可以按照我们传入的数组类型来生成相应类型的数组。也就是说:使用 toArray(T[] a) 方法,可以指定返回类型,返回结果为指定类型的数组。
使用toArray带参方法,入参分配的数组空间不够大时,toArray方法内部将重新分配内存空间,并返回新数组地址;如果数组元素大于实际所需,下标为[ list.size() ]的数组元素将被置为null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致。
2.1 入参分配的数组空间不够大
假设我们有一个集合里面有若干个元素,比如有 5 个元素,现在我们调用toArray
带参方法并且传入一个数组作为参数,但是这个传入的数组长度可能小于集合中元素的个数,比如我们只传入了一个长度为 3 的数组。
这时,toArray
方法内部发现传入的数组空间不够容纳集合里所有的元素,它就会在方法内部自动重新分配一块足够大的内存空间来创建一个新的数组,这个新数组的长度能够正好容纳集合中的所有元素。然后把集合里的元素依次复制到这个新数组中,最后返回这个新数组的地址。也就是说,原来我们传入的那个数组因为空间不够用就被舍弃了,方法会返回一个全新的、能装下所有元素的数组。
通过代码及结果进行演示:
public class Test01 {
public static void main(String[] args) {
List<Integer> ret=new ArrayList<>();
ret.add(10);
ret.add(20);
ret.add(30);
System.out.println("List的大小:"+ret.size());
//数组个数小于集合元素个数
System.out.println("===========");
System.out.println("数组个数小于集合元素个数的情况");
Integer[] array1 = new Integer[1];
Integer[] tmp = ret.toArray(array1);
for (Integer num:array1){
System.out.println("原数组:"+num);
}
System.out.println("新数组:"+tmp);
}
}
}
2.2 数组元素大于实际所需
反过来,如果我们传入的数组元素个数比集合实际的元素个数要多。比如集合里还是只有 5 个元素,但是我们传入了一个长度为 8 的数组作为toArray
方法的参数。
那么在执行toArray
方法后,它会把集合里的 5 个元素依次复制到这个传入的数组的前 5 个位置(下标从 0 到 4)。然后呢,对于下标为[ list.size() ]
的这个数组元素(在这里list.size()
就是集合的元素个数,也就是 5,所以就是下标为 5 的数组元素),会被置为null
。而数组中剩下的其他元素(也就是下标从 6 到 7 的元素)会保持它们原来的值不变。
通过代码及结果进行演示:
public class Test01 {
public static void main(String[] args) {
List<Integer> ret=new ArrayList<>();
ret.add(10);
ret.add(20);
ret.add(30);
System.out.println("List的大小:"+ret.size());
//数组个数小于集合元素个数
System.out.println("===========");
System.out.println("数组个数小于集合元素个数的情况");
Integer[] array1 = new Integer[1];
Integer[] tmp = ret.toArray(array1);
for (Integer num:array1){
System.out.println("原数组:"+num);
}
System.out.println("新数组:"+tmp);
System.out.println("===========");
System.out.println("数组个数大于集合元素个数的情况");
Integer[] array2 = new Integer[5];
ret.toArray(array2);
for(Integer num:array2){
System.out.println(num);
}
}
}
2.3 总结
我们推荐:使用集合转数组的方法,必须使用集合的toArray(T[] array),传入的是类型完全一样的数组,大小就是list.size()。
public class Main {
public static void main(String[] args) {
List<Integer> ret=new ArrayList<>();
ret.add(10);
ret.add(20);
ret.add(30);
System.out.println("List的大小:"+ret.size());
System.out.println("===========");
// 使用 toArray(T[] a) 方法,可以指定返回类型,返回结果为指定类型的数组
Integer[] arr=new Integer[ret.size()];
ret.toArray(arr);
for(Integer num : arr){
System.out.println(num);
}
}
}