在此方案中使用Java集合

Kev*_*vin 1 java

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

文件下载方式如下:

  1. 从Web服务下载文件列表.如果文件数太大,请下载第一组文件,每组中的最大数量未知.下载的文件保存在系统临时目录中.
  2. 对于每个文件,构造一个FileDescriptor(customed)类,其中包含文件文件名和系统临时文件夹中的临时文件名以及其他一些属性.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());
Run Code Online (Sandbox Code Playgroud)

可以看出,每次检索到一组新文件时,我都会创建一个新的LinkedList.处理完文件组后,不再需要LinkedList.我无法创建一个列表并重复使用它,因为每个组可以包含的最大数量是未知的.

如果我使用这样的代码并且有数百万个文件,例如,每个组最多只能有1000个文件,最终会有很多LinkedList(及其元素)作为Garbage.这件好事吗?我相信在这种情况下会有更好的方法来处理它.

请提出你的意见.

非常感谢.

JB *_*zet 5

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

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

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

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