毎日適度な量のデータを処理する Java バックエンド コンポーネントを構築しています。Widget
約 10 個のプロパティを持つ POJO があります。私のソフトウェアは、リストのグループを処理する必要がありWidget
ます。基本的には、独自の をまとめて、List<Widget>
それらを私のソフトウェアに送信する他のプロセス (完全に異なるシステム) があります。私のソフトウェアは実際に次のようなラッパー POJO を受け取ります。
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>
私のソフトウェアは、それぞれが異なるシステムによって作成されたこれらすべてを集約し、1 つの大きなバッチでまとめて処理します。
この一連のリストArrayList<ArrayList<Widget>>
を保持するためのデータ構造として暫定的に選択しました。(外側の)のWidget
グループは約 500,000 あり、それぞれに約 5の s があります。内側の合計で〜250万秒です。List<Widget>
ArrayList
List<Widget>
Widget
Widget
ArrayList
最近のコード レビューで、何人かの技術リーダーから、私がこのウィジェットのバッチに間違ったデータ構造を選択したと言われました。HashMap<String,List<Widget>>
彼らは、より効率的で作業しやすいので、を使用するべきだったと私に言いました。Payload
ハッシュマップ キーは、私のソフトウェアに与えられた に含まれる GUIDです。なんらかの理由で GUID が必要なわけではありません。これは、〜 500,000List<Widget>
を個別に保持するためのキーとして機能するだけです。これを行う必要があります。
これは私に考えさせました:誰が正しいの?!? このデータ構造に対して行っている唯一の操作は、「追加」( の場合、またはビアをArrayList
追加するだけ) と「読み取り」(私のソフトウェア内では、すべてを反復処理して検査する必要があります) です。私のネストされた要点は次のとおりです。Widget
List<Widget>
add(...)
Widget
ArrayList
for(List<Widget> widgetList : myDoublyNestedArrayOfWidgets) {
for(Widget widget : widgetList) {
...
}
}
必要な操作はこれらだけです。異なるList<Widget>
s をいくつかの大きな「バッチ」データ構造に追加し、後でそれらすべてを調べて、それぞれの を操作しますWidget
。このソフトウェアは、多くのメモリと処理能力を備えた一部の強化されたサーバーで実行されます。
だから私は尋ねます:**ArrayList<ArrayList<Widget>>
正しい選択、、、HashMap<String,List<Widget>>
または何か他のものですか...そしてなぜですか?