2012-04-21 49 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 (...);