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

前端之家收集整理的这篇文章主要介绍了java – 传递零大小的数组,保存分配?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在此代码示例中,来自第107页的第107页,最后一行:
Update[] updates = lu.toArray(new Update[0]);

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

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

究竟是什么分配节省了?

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

If the list fits in the specified array,it is returned therein.
Otherwise,a new array is allocated with the runtime type of the
specified array and the size of this list.

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

这个说明是不正确的?或者它意味着什么呢?

解决方法

Plainly,there are 256 elements in the list,which cannot fit in an array of size 0,therefore a new array must be allocated inside the method,right?

是.

您可以使用

private static final Update NO_UPDATES = { }

 lu.toArray(NO_UPDATES);

但是,如果您希望列表通常为0长度,这将只会有所帮助.

一般来说,我会采用与fge相同的方法

lu.toArray(new Update[lu.size()]);

在您的具体情况下,您事先知道尺寸,这样您就可以做到

Update[] updates = new Update[256];
String text = "";
final Update.Builder ub = new Update.Builder();
final Author a = new Author("Tallulah");

long now = System.currentTimeMillis();
for (int i=0; i<updates.length; i++) 
  updates[i] = ub.author(a).updateText(text += 'X').createTime(now++).build();

Collections.shuffle(Arrays.asList(updates));

猜你在找的Java相关文章