7

タイトル通りです。次のようなものを作成しても問題ありませんか。

HashMap<Integer, Object> foo = new HashMap<>();

または、任意のインデックスに値を追加できるより良いコンテナがあるのでしょうか? 「より良い」とは、「パフォーマンスが向上する」ことを意味し、「RAM 使用量が少ない」ことを意味します。

ArrayList<Object> bar = new ArrayList<>();
bar.add(10_000, new Object());

上記のコードのようなことをしたいのですが、これはもちろん ArrayList では機能しません。作成したいリストはまばらです。インデックスが分散されているため、ArrayList ではなく HashMap について考えていました。

よろしく。

4

2 に答える 2

4

あなたの質問は非常に一般的であり、指定した詳細から、HashMap と ArrayList の両方が要件に合っているようで、パフォーマンスだけが気になります。パフォーマンスにはさまざまな側面があります。

  1. データが連続しているか、あまり広がっていない場合[つまり、整数が多かれ少なかれ連続している場合]、挿入のコストがHashMapと比較して少ないため、ArrayListを使用します。
  2. データに多くの広がりがある場合、または挿入と同時に多くの削除を実行する場合は、HashMap を使用します。

したがって、それはあなたの要件に依存します。

編集:データに多くの広がりがある場合は、HashMap が適しています。Array または ArrayList を使用すると、データのストレージ間に多くのギャップがあるため、メモリ消費が高くなります。挿入の HashMap コストは Array よりも高くなりますが、 RAM について懸念があるため、 HashMap を使用する必要があります。

于 2013-06-16T13:22:07.587 に答える
3

あなたが(実際に)行っていることはHashMap、スパース配列を表すために使用することです。

これは合理的な実装の選択になる可能性がありますが、その有効性は、達成しようとしているものと配列のプロパティによって異なります。

HashMap配列が十分にまばらな場合は、単純な配列の代わりに を使用してメモリを節約できます。ただし、非スパース配列と比較すると、配列よりもHashMapおおよそ 1 桁多くのメモリを使用します。その上、 a に対するgetandput操作はHashMap、単純な配列のインデックス付けよりもおおよそ 1 桁遅くなります。

また、配列のサイズとスパース性によっては、(Android のスパース配列クラスなど) よりも使用するスペースが大幅に少ないHashMap表現もありますが、同様にスケーリングされない get/put パフォーマンスが犠牲になります。

于 2013-06-16T14:50:33.153 に答える