集合转数组

简介: ArrayList.toArray()推荐有参数,还是无参数,为什么?2)如果有参数,那么参数的数组长度是多少

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的情况

相关文章
|
3月前
关于数组的两个应用
关于数组的两个应用
30 0
关于数组的两个应用
|
4月前
|
存储 算法 编译器
C 数组详解
在C语言中,数组是一种用于存储多个同类型数据的集合。本文介绍了数组的基本特性与使用方法,包括定义与初始化、索引访问、多维数组、指针操作、大小计算及函数传递等内容。数组名可视为指向首元素的指针,支持遍历、排序与查找等常见操作。数组大小固定,访问越界会导致未定义行为。此外,还可以将数组嵌套在结构体中以增加数据复杂性。
70 10
|
8月前
|
存储 算法 计算机视觉
数组
数组
65 0
|
8月前
|
存储 C++ 索引
c++数组
c++数组
73 2
|
7月前
|
存储 开发框架 .NET
C#中的数组探索
C#中的数组探索
|
8月前
|
存储 搜索推荐 程序员
C++ 数组
C++ 数组
55 0
|
8月前
|
程序员 索引
C 中数组详解
C 中数组详解。
37 3
|
8月前
数组练习2
数组练习2。
32 2
|
8月前
|
编译器 C++
C++系列四:数组
C++系列四:数组
|
算法
三 数组
三 数组
63 0