65

私はアンドロイドで開発するのは初めてです。私のAndroidアプリでは使用しHashMapていますが、警告が表示されます。

**"Use new SparseArray<String>(...) instead for better performance"**

これはどういう意味ですか、SparseArray<String>代わりにどのように使用できますか?

4

4 に答える 4

117

SparseArray<String>(...)パフォーマンスを向上させるために、代わりにnewを使用してください

ここで説明されている理由により、この警告が表示されます。

SparseArraysは整数をオブジェクトにマップします。オブジェクトの通常の配列とは異なり、インデックスにギャップがある可能性があります。これは、HashMapを使用して整数をオブジェクトにマップするよりも効率的であることを目的としています。

SparseArrayの使い方は?

あなたは以下の方法でそれを行うことができます:

  1. HashMap仕方:

    Map<Integer, Bitmap> _bitmapCache = new HashMap<Integer, Bitmap>();
    private void fillBitmapCache() {
         _bitmapCache.put(R.drawable.icon, BitmapFactory.decodeResource(getResources(), R.drawable.icon));
         _bitmapCache.put(R.drawable.abstrakt, BitmapFactory.decodeResource(getResources(), R.drawable.abstrakt));
         _bitmapCache.put(R.drawable.wallpaper, BitmapFactory.decodeResource(getResources(), R.drawable.wallpaper));
         _bitmapCache.put(R.drawable.scissors, BitmapFactory.decodeResource(getResources(), 
     }
    
    Bitmap bm = _bitmapCache.get(R.drawable.icon);
    
  2. SparseArray仕方:

    SparseArray<Bitmap> _bitmapCache = new SparseArray<Bitmap>();
    private void fillBitmapCache() {
         _bitmapCache.put(R.drawable.icon, BitmapFactory.decodeResource(getResources(), R.drawable.icon));
         _bitmapCache.put(R.drawable.abstrakt, BitmapFactory.decodeResource(getResources(), R.drawable.abstrakt));
         _bitmapCache.put(R.drawable.wallpaper, BitmapFactory.decodeResource(getResources(), R.drawable.wallpaper));
         _bitmapCache.put(R.drawable.scissors, BitmapFactory.decodeResource(getResources(), 
     }
    
    Bitmap bm = _bitmapCache.get(R.drawable.icon);
    

お役に立てば幸いです。

于 2013-02-09T11:56:13.660 に答える
42

SparseArrayキーとしてを使用している場合に使用されIntegerます。

を使用するSparseArray場合、キーとしてaが必要な場合とは異なり、キーは常にプリミティブ変数として残ります。これにより、オブジェクトを取得している間、intがオブジェクトになるのは短時間です。地図。HashMapObjectInteger

を使用することで、ガベージコレクターSparseArrayの作業を節約できます。

したがって、のように使用しMap<Integer,String>ます。

于 2013-02-09T11:56:54.740 に答える
5

これは、コードのデータ構造が優れていることを示唆しています。

そのヒントはLintからのものです。HashMapあなたが何か他のものに整数を持っているとき、あなたは通常それを手に入れます。

その最大の利点は、整数キーをプリミティブとして扱うことです。つまり、Integer(Javaオブジェクト)をキーとして使用することはできません。

これは、大きなマップを使用する場合に大きな問題になります。HashMapその場合、多くのIntegerオブジェクトが作成されます。

ここでさらにいくつかの情報を参照してください。

于 2013-02-09T12:03:48.340 に答える
0

SparseArrayは、整数のキーと値のペアに対して、HashMapよりもメモリ効率の高いデータ構造です。また、Androidに固有であり、JavaSEには使用できないと思います。

Linterの警告は、上記のようにSparseArrayを使用する必要があることを示している場合があります。このばかげた警告は正しいか間違っているかもしれません。適切であると判断した場合、または@SuppressLintアノテーションで抑制する必要がある場合は、HashMapではなくSparseArrayを使用することを決定する必要があります。

実装するかどうかを決定するには、少し調査して状況を評価する価値があります。ここにいくつかの便利なリンクがあります

https://gunhansancar.com/sparsearray-vs-hashmap/

https://developer.android.com/reference/android/util/SparseIntArray

于 2019-01-31T22:48:51.620 に答える