1. ホーム
  2. java

[解決済み] SparseArrayとHashMapの比較

2022-04-22 01:20:02

質問

いくつかの理由が思い当たります。 HashMap よりも、整数のキーを持つものの方がはるかに優れています。 SparseArray s:

  1. のAndroidのドキュメントは SparseArray には、「一般に、従来の HashMap "です。
  2. を使ってコードを書くと HashMap ではなく SparseArray を使用すると、コードが他の Map の実装で動作し、Map 用に設計されたすべての Java API を使用できるようになります。
  3. を使ってコードを書くと HashMap ではなく SparseArray を使用すれば、Android以外のプロジェクトでもコードが動作します。
  4. マップのオーバーライド equals()hashCode() 一方 SparseArray がない。

しかし、私が HashMap を使用するよう指示されました。 SparseArray の代わりに。これは本当に理解しがたいことだと思います。誰か SparseArray s?

どのように解決するのですか?

SparseArray は、以下のように置き換えることができます。 HashMap は、キーがプリミティブ型である場合。 すべてが公開されているわけではありませんが、異なるキー/バリュータイプに対応するいくつかのバリエーションがあります。

メリットは

  • アロケーションフリー
  • 箱詰め不要

欠点

  • 一般的に速度が遅く、大規模なコレクションには適していません。
  • Android以外のプロジェクトでは動作しません。

HashMap は、以下のように置き換えることができます。

SparseArray          <Integer, Object>
SparseBooleanArray   <Integer, Boolean>
SparseIntArray       <Integer, Integer>
SparseLongArray      <Integer, Long>
LongSparseArray      <Long, Object>
LongSparseLongArray  <Long, Long>   //this is not a public class                                 
                                    //but can be copied from  Android source code 

メモリの面では、以下のような例があります。 SparseIntArrayHashMap<Integer, Integer> を1000要素で表示します。

SparseIntArray :

class SparseIntArray {
    int[] keys;
    int[] values;
    int size;
}

クラス = 12 + 3 * 4 = 24 バイト

配列=20+1000×4=4024バイト

合計 = 8,072バイト

HashMap :

class HashMap<K, V> {
    Entry<K, V>[] table;
    Entry<K, V> forNull;
    int size;
    int modCount;
    int threshold;
    Set<K> keys
    Set<Entry<K, V>> entries;
    Collection<V> values;
}

クラス = 12 + 8 * 4 = 48 バイト

エントリー=32+16+16=64バイト

配列=20+1000×64=64024バイト

合計 = 64,136バイト

出典 アンドロイド・メモリーズ by ロマン・ガイ スライド90より

上記の数値は、JVMがヒープ上に確保したメモリ量(バイト)です。 使用する特定のJVMによって異なる場合があります。

を使用します。 java.lang.instrument パッケージには、オブジェクトのサイズをチェックするような高度な操作に役立つメソッドがいくつか含まれています。 getObjectSize(Object objectToSize) .

その他の情報は、公式から入手可能です。 オラクルのドキュメント .

クラス = 12 バイト + (n 個のインスタンス変数) * 4 バイト

配列=20バイト+(n要素)×(要素サイズ)

エントリ = 32バイト + (第1要素サイズ) + (第2要素サイズ)