传递零大小的数组,保存分配?

Tom*_*sky 7 java arrays garbage-collection

The Well-Grounded Java Developer的第114页的代码示例中,最后一行:

Update[] updates = lu.toArray(new Update[0]);
Run Code Online (Sandbox Code Playgroud)

包含注释:传递零大小的数组,保存分配

List<Update> lu = new ArrayList<Update>();
String text = "";
final Update.Builder ub = new Update.Builder();
final Author a = new Author("Tallulah");

for (int i=0; i<256; i++) {
  text = text + "X";
  long now = System.currentTimeMillis();
  lu.add(ub.author(a).updateText(text).createTime(now).build());
  try {
    Thread.sleep(1);
  } catch (InterruptedException e) {
  }
}

Collections.shuffle(lu);
Update[] updates = lu.toArray(new Update[0]);
Run Code Online (Sandbox Code Playgroud)

确切地说,节省了多少分配?

List#toArray(T [] a)的javadoc 提到:

如果列表适合指定的数组,则返回其中.否则,将使用指定数组的运行时类型和此列表的大小分配新数组.

这就是我记得的:如果传递给的数组toArray(T[] a)不能满足列表中的所有内容,则会分配一个新数组.显然,列表中有256个元素,不能放入大小为0的数组中,因此必须在方法内部分配一个新数组,对吧?

这个说明是不正确的?或者还有什么意思吗?

Tom*_*sky 2

离开@Andreas对这个问题的评论,我认为这一个错字,应该说:

传递零大小的数组,安全分配。

因为如果您没有向该方法传递任何内容,您最终将调用List#toArray()无参数重载!

这将返回一个Object[](尽管它只包含Update实例)并且需要更改updates变量的类型,因此最后一行将变为:

Object[] updates = lu.toArray();
Run Code Online (Sandbox Code Playgroud)

然后每次您想要迭代并使用该数组中的元素时,您都必须将它们转换为Update.

提供数组会调用List#toArray(T[] a)方法,该方法返回 a <T> T[]。该数组被具体化以知道它是一个实例数组Update

因此,提供空的 Update 数组会导致从 toArray 调用返回 Update[],而不是 Object[]。这是一个类型安全得多的分配! 笔记中的“保存”二字一定是拼写错误!

……这消耗了太多的脑力。将在本书的论坛中发布此链接,以便他们可以更正它。