1)ArrayList.toArray()推荐有参数,还是无参数,为什么?
推荐有参数 无参的方法返回值是Object[],传入构造的也是Object[],
返回值直接用别的类型的接受有可能报ClassCastException异常
eg:
List list = new ArrayList(2);
list.add(8L);
list.add(5L);
Long[] array = new Long[list.size()];
// Long[] objects =(Long[] ) list.toArray();//报错
list.toArray(array);//不报错
2)如果有参数,那么参数的数组长度是多少?给出分析的逻辑思考。注意:《阿里巴巴JAVA开发手册》在这一点上,有可能是描述错误的。
jdk1.8
//有参数
public 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);
//数组长度>集合长度 ,将集合里的元素直接进行拷贝,多余的元素赋值为null。
if (a.length > size){
a[size] = null;
return a;
}
}
//无参
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
//有参和无参共同调用的copyOf 方法
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength] // 类型相同,则重新生成一个大小为newLength的数组实例
: (T[]) Array.newInstance(newType.getComponentType(), newLength); // 类型不同,重新生成一个大小为 newLength的新类型数组实例
System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); //将原数组内容拷贝到新数组中,新数 组取最小的数组长度
return copy; // 返回新数组的引用
}
总结:
1 .数组长度>=集合长度,直接拷贝,不会产生新的数组对象;
2.数组长度<集合长度,会创建一个与集合长度相同的新数组,将集合的数据拷贝到新数组并将新数组的引用返回。
最好是数组的长度和集合长度相等,这样就不存在扩容问题,节省空间,get取值也不会存在Null的情况