什么传递给Arrays实例方法toArray(T [] a)方法?

Cra*_*tis 7 java arrays collections casting

如果您有一个Collection的实例,请说:

Collection<String> addresses = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

然后用一堆值填充哪些值,这是"最好的"方式,如果有的话,使用toArray()方法而不需要类型转换?

String[] addressesArray = addresses.toArray(new String[] {});
String[] addressesArray = addresses.toArray(new String[0]);
String[] addressesArray = addresses.toArray(new String[addresses.size()]);
String[] addressesArray = addresses.toArray(new String[addresses.size() + 5]);
Run Code Online (Sandbox Code Playgroud)

前两个之间是否存在语义差异?第三是最有效的吗?第四个效率低于第三个吗?

Tom*_*ine 7

为了我的钱

String[] addressesArray = addresses.toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

是最简单的,最不容易出错,因此"最好".它还具有以下优点:相同的代码适用于并发/同步集合.您必须使用一些非常低级别,频繁使用的代码才能获得可忽略的性能差异,从而产生任何差异.

通常,您会看到分配给a的空数组,static final以避免在每次执行时分配.显然,事实证明,由于"优化"(分配确实非常快),性能可能会下降.

更新:结果显示这比使用大小的数组更快.http://shipilev.net/blog/2016/arrays-wisdom-ancients/ tl; dr:反射是一种微不足道的类型,不涉及慢速方法查找,如果可以确定全部,则可以删除数组的归零将写入元素(或数组变得无法访问).

  • +1用于注意并发问题.我面对我的代码问题一次:http://github.com/orfjackal/dimdwarf/blob/0d1a0897821a4e0e557a1390a7252a8580d2ec95/dimdwarf-core/src/main/java/net/orfjackal/dimdwarf/scheduler/TaskThreadPool.java#L111 -116 (2认同)

H M*_*les 5

根据findbugs的报告,这是最有效的:

String[] addressesArray = addresses.toArray(new String[addresses.size()]);
Run Code Online (Sandbox Code Playgroud)

我相信他们;)

  • 根据@AlekseyShipilev的一篇文章http://shipilev.net/blog/2016/arrays-wisdom-ancients/,这是不正确的. (5认同)