1

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

文件下载方式描述如下:

  1. 从 Web 服务下载文件列表。如果文件数量太大,则下载第一组文件,每组的最大数量未知。下载的文件保存在系统临时目录中。
  2. 对于每个文件,构造一个 FileDescriptor(自定义)类,其​​中包含系统临时文件夹中的文件文件名和临时文件名以及其他一些属性。b FileDescriptor 保存在列表中。
  3. 在这里做一些业务逻辑。
  4. 下载下一组文件(如果有)。

我用来保存 FileDescriptor 列表的集合是 LinkedList。但是,对于每组文件,我将创建一个全新的 LinkedList 来保存它们的 FileDescriptor。伪代码类似于:

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

请发表你的意见。

非常感谢。

4

1 回答 1

5

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

您正在预优化,并且通常在预优化时的情况下,您在错误的地方进行。

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

List<FileDescriptor> list = new LinkedList<FileDescriptor>();
do {
    list.clear(); // remove everything from the list
    ...
}
while (...);
于 2012-04-21T10:46:18.190 回答