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的数组中,因此必须在方法内部分配一个新数组,对吧?
这个说明是不正确的?或者还有什么意思吗?
离开@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[]。这是一个类型安全得多的分配! 笔记中的“保存”二字一定是拼写错误!
……这消耗了太多的脑力。将在本书的论坛中发布此链接,以便他们可以更正它。
| 归档时间: |
|
| 查看次数: |
286 次 |
| 最近记录: |