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。这是错误的。