ArrayList.toArray()用法详解
1. API
Object[] toArray()
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
2. 源码
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
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);
if (a.length > size)
a[size] = null;
return a;
}
3. 用法
当使用ArrayList
时,有时想获得一个实际的数组,这个数组包含了列表的内容。
可以通过调用方法toArray()
来实现。
示例:
List<Integer> list = new ArrayList<>();
for (int i = 0; i< 10; i++) {
list.add(i);
}
System.out.println("List<Integer> 类型对象:");
System.out.println(list);
System.out.println();
System.out.println("Object[] 类型对象:");
Object[] integerObjs = list.toArray();
System.out.println(Arrays.toString(integerObjs));
System.out.println();
System.out.println("Integer[] 类型对象: ");
Integer[] integers = list.toArray(new Integer[list.size()]);
System.out.println(Arrays.toString(integers));
System.out.println();
System.out.println("int[] 类型对象:");
int[] ints = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
ints[i] = list.get(i);
}
System.out.println(Arrays.toString(ints));
输出:
List<Integer> 类型对象:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Object[] 类型对象:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Integer[] 类型对象:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
int[] 类型对象:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4. 总结
可以看出,不带参数的toArray()
方法,是构造的一个Object
数组,然后进行数据copy,此时进行转型就会产生ClassCastException
。
而带参数的toArray(T[] a)
方法,则是根据参数数组的类型,构造了一个对应类型的,长度跟ArrayList
的size一致的空数组,虽然方法本身还是以 Object
数组的形式返回结果,不过由于构造数组使用的组件类型跟需要转型的组件类型一致,就不会产生转型异常。
正确方法:
1. String[] str_a = (String []) arr.toArray(new String[0]);
2. String[] a = new String[size];
String [] str_a = (String []) arr.toArray(a);
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆