Java中ArrayList转二维数组的方法

  • Post author:
  • Post category:java



https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/

本题用到了ArrayList转二维数组


方法1:

List<int[]> list = new ArrayList<>();
list.toArray(new int[0][]);


方法2:

List<int[]> res = new ArrayList<int[]>();
merged.toArray(new int[res.size()][]);


解释:

ArrayList的toarray源码:

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

1. a数组的长度小于list元素个数(list长度为size),那么就会直接调用工具类Arrays.copyOf()方法直接进行一个拷贝,长度为size,并返回。

注意,这儿的是Arrays.copyOf(elementData, size, a.getClass())方法,是有元素类型参数的,就是最后一项参数。

2. 如果数组a的长度length不小于list元素个数,即a.length()>=size,就会走下面的流程:

2.1  首先调用System.arraycopy(elementData, 0, a, 0, size)将ArrayList里的元素数组elementData中的元素拷贝到a对象中,

2.2  再判断是否a.length()>size?若是,会在a[size]位置设置一个null,这个设置的目的是了toArray(T[] a)方法调用者从返回的数组中检测到null时就知道后面已经没有list元素对象了


总结:

当泛型的长度<=list的size时,会以size长度返回T;否则,使用传入的T。为了确保泛型的长度<=list的size,所以参数传入:

1. new int[0][] (此时a的长度为0)

或:2.new int[merged.size()][] (此时a的长度为size)

若泛型的长度>list的size,则在返回的数组中会出现null。这是错误的。



版权声明:本文为weixin_40139164原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。