我正在構建一個每天處理中等數據量的Java後端組件。我們有一個POJO,我們稱之爲Widget
,它有大約10個屬性。我的軟件必須處理Widget
列表組:本質上還有其他進程(完全不同的系統)將它們自己的List<Widget>
放在一起,然後將它們發送到我的軟件。我的軟件實際收到的包裝POJO,看起來像這樣:比雙重嵌套的ArrayList更高效嗎?
public class Payload {
private List<Widget> widgets; // <-- what I want
private String guid; // GUID; my software doesn't need this
private boolean fizz; // again, my software doesn't need this
... many other properties that I don't care about
}
我的軟件彙集了所有這些List<Widget>
,各由不同的系統上創建的,然後在一個大批量一起對其進行處理。
我暫時選擇了ArrayList<ArrayList<Widget>>
作爲保存這批Widget
列表的數據結構。將會有大約500,000個組List<Widget>
(外部ArrayList
),並且每個List<Widget>
將各自具有大約5個Widget
;在內部ArrayList
的總共約250萬Widget
s。
在最近的代碼審查中,一些技術負責人告訴我,我爲這個批處理小部件選擇了錯誤的數據結構。他們告訴我,我應該使用HashMap<String,List<Widget>>
,因爲它更高效,更容易使用。 hashmap密鑰是我的軟件給出的Payload
中包含的GUID。不是因爲任何原因我需要GUID,它只是保持〜500,000 List<Widget>
獨立的關鍵 - 我確實需要這樣做。
這讓我想到:誰是對的?!?我們在這個數據結構上做的唯一操作是「增加」(在ArrayList
的情況下,只需通過add(...)
添加Widget
或List<Widget>
)然後「讀取」(在我的軟件中,我必須遍歷每個Widget
並檢查。它的東西與我的嵌套ArrayList
它的要點是:
for(List<Widget> widgetList : myDoublyNestedArrayOfWidgets) {
for(Widget widget : widgetList) {
...
}
}
這些都是我們所需要的只是操作:添加不同List<Widget>
s到一些大「批量」數據結構,然後在以後的時間,檢查所有這些軟件,並與每個Widget
一起做這個軟件。這個軟件運行在一些內存和處理能力都很強大的服務器上。
所以我問:**是ArrayList<ArrayList<Widget>>
正確的選擇,HashMap<String,List<Widget>>
,還是別的......爲什麼?
我覺得你說的很多東西不是回答核心問題所必需的。試着把它看作是列舉事實而不是講故事。 – Dukeling 2013-02-14 13:10:15
如果你一起處理所有東西,你可以使用'ArrayList',並在進入主列表時添加Widget?另外,在開始處理之前是否需要全部500k套,或者是否可以處理每個小列表,並將結果存儲起來。產生一個處理每個小列表的線程,然後在完成後拋出列表可能會提高內存效率 –
Windle
2013-02-14 13:12:10
在附註中,您的用戶名讓我大笑=) – Windle 2013-02-14 13:14:18