文章

java中Array注意

java中Array注意

在使用toArray()方法时,需要注意转型的问题

1
2
3
4
5
6
public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    String[] tt = (String[]) list.toArray(new String[0]);
}

这段代码是没问题的,但我们看到String[] tt =(String[]) list.toArray(new String[0]) 中的参数很奇怪,然而去掉这个参数new String[0]却在运行时报错.

我们发现toArray()有两个方法,无参的toArray方法会先构造一个Object数组,然后进行数据copy,最后返回的是Object类型的数组,所以就会出现转型错误了

1
2
3
4
5
public Object[] toArray() {
    Object[] result = new Object[size];
    System.arraycopy(elementData, 0, result, 0, size);
    return result;
}

而带有参数的toArray()方法,则是根据参数数组的类型,构造一个对应类型的,长度与ArrayList一样的一个空数组,之后进行数据copy,虽然方法本身返回的还是Object类型,不过构造数组

1
2
3
4
5
6
7
8
public Object[] toArray(Object a[]) {
    if (a.length < size)
        a = (Object[]) java.lang.reflect.Array.newInstance(a.getass().getComponentType(), size);
    System.arraycopy(elementData, 0, a, 0, size);
    if (a.length > size)
        a[size] = null;
    return a;
}

因此在使用toArray的时候可以参考以下三种方式

1
2
3
4
5
1. Long[] l = new Long[<total size>];
list.toArray(l);
2. Long[] l = (Long[]) list.toArray(new Long[0]);
3. Long[] a = new Long[<total size>];
Long[] l = (Long[]) list.toArray(a);
本文由作者按照 CC BY 4.0 进行授权