为什么没有toArray(Class <T>)?

时间:2019-07-31 17:49:44

标签: java arrays collections toarray

为什么toArray中没有List变体,仅接受类型,例如:

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]);

但是,当我只想指定类型而不创建不必要的一次性数组时,创建一个空数组对我来说似乎效率低下并且违反直觉。

1 个答案:

答案 0 :(得分:6)

从界面的角度来看,我同意。

该方法只需要类型(除了副作用),因此只需要类型就合适了。

我想,主要原因是效率。仅采用该类型的实现要慢得多,尽管我没有检查实现细节(请参阅.toArray(new MyClass[0]) or .toArray(new MyClass[myList.size()])?和博客Arrays of Wisdom of the Ancients中的基准)。

但是,请注意,自Java 11以来,我们有了一个新的变体,它更接近您想要的,并且在这种情况下也更合适:

toArray(Foo[]::new)

从其documentation

  

使用提供的生成器函数分配返回的数组,以返回包含此集合中所有元素的数组。

     

使用toArray()创建运行时类型为Object[]的数组,或使用toArray(T[])重用现有数组。

     

默认实现会使用零调用生成器函数,然后将结果数组传递到toArray(T[])

该方法不需要反射,因为您直接提供了生成器。

总结一下,今天您应该使用

  • toArray(),如果您想要Object[](非常合适),
  • toArray(T[])如果要重用现有数组(应该足够大),
  • toArray(IntFunction<T[]>)(如果要输入安全性和新数组)。