2012-04-21 25 views
1

我正在写一个应用程序,它从Web服务中下载文件。在这种情况下使用Java集合

方式文件是如何被描述下载如下:

  1. 从网络服务,下载文件的列表。如果文件数量过大,请下载第一组文件,每个组中的最大数量未知。下载的文件保存在系统临时目录中。
  2. 对于每个文件,构建一个FileDescriptor(customed)类,其中包含文件filename和临时文件名,位于系统临时文件夹和其他一些属性中.b FileDescriptor保存在列表中。
  3. 在这里做一些商业逻辑。
  4. 如果有,请下载下一组文件。

我用来保存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(及其元素)作为垃圾。这有什么好做的吗?我相信在这种情况下会有更好的方法来处理它。

请给出意见。

非常感谢。

+0

将对此列表执行哪些操作?在大多数情况下'ArrayList'效率更高。为什么你不能重用它?当您向他们添加元素时,大多数集合都会动态增长。 – 2012-04-21 10:31:46

回答

5

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

您正在进行预优化,并且与预先优化时的情况一样,您在错误的位置执行该操作。

也就是说,一个列表是一个动态大小的数据结构,你不需要知道它的最大大小就可以重用它。它将动态增长:

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