14

キー/値を Android アプリに格納するためにハッシュマップを使用する必要がありますが (数千になる可能性があります)、メモリを節約するために SparseArray を使用する必要があることを理解しています。ただし、キーは文字列である必要があります。SparseArray またはその他の代替手段のカスタム実装を作成する方法はありますか?

4

4 に答える 4

19

SparseArray は、整数がキーである場合にのみ有効です。キーをバイナリ検索する必要があるため、整数値でのみ可能なメモリ最適化です。文字列のバイナリ検索はコストがかかり、明確に定義されていないため (「1」は「a」または「狂った日本語の文字」よりも小さいか大きいか?)、そのため、実行しません。

ところで、SparseArray はメモリを節約しますが、時間がかかる場合があります。HashMap の get は O(n/size) である必要があります。ここで、size はハッシュマップ内のバケットの数です。SparseArray は O(log(n)) になります。どちらを使用するかは、必要なメモリと速度によって異なります。本当に大きな (100K のエントリ) がある場合、最大 1 つのキャッシュを持つため、キャッシュ ミスの物理的な現実により、たとえ技術的に悪くても、より多くの HashMap のパフォーマンスが向上する可能性があるメモリ ページングの問題に遭遇することさえあります。取得ごとにミスしますが、バイナリ検索には複数のミスがある場合があります。

于 2014-07-19T04:39:26.000 に答える
7

ArrayMapを使用できます: ArrayMap は、従来の HashMap よりもメモリ効率が高くなるように設計された、汎用のキー -> 値マッピング データ構造です。

詳細については: ArrayMap Doc

于 2015-09-11T06:48:24.043 に答える
1

SparseArrayは、キー タイプとして整数を持つマップに特化したクラスです。基本的に、その事実を使用して、Integer オブジェクトへの参照ではなく int 値を保存します (したがって、メモリを節約します)。

HashMapキーが他のタイプの場合、標準を使用しても本質的に問題はありません。

于 2014-07-19T04:38:09.957 に答える