在此方案中使用Java集合

时间:2012-04-21 10:12:13

标签: java

我正在编写一个从Web服务下载文件的应用程序。

文件的下载方式如下:

  1. 从Web服务下载文件列表。如果文件数太大,请下载第一组文件,每组中的最大数量未知。下载的文件保存在系统临时目录中。
  2. 对于每个文件,构造一个FileDescriptor(customed)类,其中包含文件文件名和系统临时文件夹中的临时文件名以及其他一些属性.b FileDescriptor保存在列表中。
  3. 在这里做一些商业逻辑。
  4. 下载下一组文件(如果有)。
  5. 我用来保存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。这件好事吗?我相信在这种情况下会有更好的方法来处理它。

    请提出您的意见。

    非常感谢。

1 个答案:

答案 0 :(得分:5)

与下载数百万个文件相比,创建1000个LinkedList对象(并对其进行垃圾回收)的成本可以忽略不计。我们谈论的是1毫秒与小时数。一些米与地球到月球的距离。

您正在进行预优化,而且在预优化时通常情况下,您在错误的位置进行优化。

也就是说,列表是动态大小的数据结构,您无需知道其最大大小即可重用它。它会动态增长:

List<FileDescriptor> list = new LinkedList<FileDescriptor>();
do {
    list.clear(); // remove everything from the list
    ...
}
while (...);