在此代码示例中,第 114 页基础扎实的 Java 开发人员 https://rads.stackoverflow.com/amzn/click/com/1617290068,最后一行:
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]);
这笔节省到底是什么分配?
javadoc 为列表#toArray(T[] a) http://docs.oracle.com/javase/7/docs/api/java/util/List.html#toArray%28T%5B%5D%29提到:
如果列表适合指定的数组,则将其返回其中。
否则,将使用运行时类型分配一个新数组
指定的数组和该列表的大小。
我记得的是:如果你传递给的数组toArray(T[] a)
无法容纳列表中的所有内容,因此会分配一个新数组。简单来说,列表中有 256 个元素,无法放入大小为 0 的数组,因此必须在方法内部分配一个新数组,对吧?
那么这个注释是错误的吗?或者还有什么别的意思吗?
简单来说,列表中有 256 个元素,无法放入大小为 0 的数组,因此必须在方法内部分配一个新数组,对吧?
yes.
您可以使用
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));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)