【发布时间】:2019-12-09 07:21:29
【问题描述】:
为什么List中没有toArray变种只接受一个类型,例如:
Foo[] array = list.toArray(Foo.class);
// or
Foo[] array = list.toArray(Foo[].class);
见过
// existing array
Foo[] array = list.toArray(array);
// Fake array
Foo[] array = list.toArray(new Foo[0]);
但是当我只想指定类型而不创建不必要的一次性数组时,创建一个空数组似乎效率低下且违反直觉。
【问题讨论】:
-
不清楚你在问什么。您可以将现有数组传递给
toArray,如果列表适合它,则将使用它。 (如果没有,则创建一个新的。)所以...? -
无论您传入
Type[].class还是new Type[0],都需要以任一方式实例化一个新对象。前者需要反思。 -
@VinceEmigh 因为
toArray无论如何都会为你创建一个新数组,如果给定数组太小,它已经使用反射,当你传入@987654330 @,您实际上是在创建 2 数组,因为零长度数组将被丢弃,因此传入Type[].class实际上会更有效。 -
@Andreas 我没有提到哪个更有效,我只是说明任何一种方式都会导致新实例,以消除关于“可能会不必要地使用 ctor 的任何误解”。是的,通过传入一个大小太小的数组,
Array.newInstance将被调用(基于我看到的最后一个实现)。
标签: java arrays collections toarray