我正在编写一个从Web服务下载文件的应用程序。
文件的下载方式如下:
我用来保存FileDescriptor列表的集合是LinkedList。但是,对于每组文件,我将创建一个全新的LinkedList来保存它们的FileDescriptors。 Psudocode就像:
do {
List<FileDescriptor> list = new LinkedList<FileDescriptor>();
GroupOfFiles group = webService.getGroupOfFiles();
Iterator<File> itr = group.iterator();
while(itr.hasNext) {
list.add(new(FileDescriptor(itr.next()));
}
<My Business Logic here>
} while(group.hasMoreGroups());
可以看出,每次检索到一组新文件时,我都会创建一个新的LinkedList。处理完文件组后,不再需要LinkedList。我无法创建一个列表并重复使用它,因为每个组可以包含的最大数量是未知的。
如果我使用这样的代码并且有数百万个文件,例如每个组最多只能有1000个文件,最终会有很多LinkedList(及其元素)作为Garbage。这件好事吗?我相信在这种情况下会有更好的方法来处理它。
请提出您的意见。
非常感谢。
答案 0 :(得分:5)
与下载数百万个文件相比,创建1000个LinkedList对象(并对其进行垃圾回收)的成本可以忽略不计。我们谈论的是1毫秒与小时数。一些米与地球到月球的距离。
您正在进行预优化,而且在预优化时通常情况下,您在错误的位置进行优化。
也就是说,列表是动态大小的数据结构,您无需知道其最大大小即可重用它。它会动态增长:
List<FileDescriptor> list = new LinkedList<FileDescriptor>();
do {
list.clear(); // remove everything from the list
...
}
while (...);