警告显示我在Android中使用哈希映射(使用新的SparseArray <string>)</string>

时间:2013-02-09 11:47:37

标签: android hashmap

我是Android新手。在我的Android应用程序中,我正在使用HashMap,但我收到了警告:

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

这是什么意思,我该如何使用SparseArray<String>

4 个答案:

答案 0 :(得分:114)

  

使用新的SparseArray<String>(...)代替更高的效果

由于描述here的原因,您收到此警告。

  

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);
    
  3. 希望它会有所帮助。

答案 1 :(得分:42)

当您使用SparseArray作为密钥时,会使用

Integer

使用SparseArray时,将始终作为原始变量保留,与您使用HashMap时不同要求 Object 作为,这会导致 int成为Integer对象仅用于在地图中获取对象的时间很短。

使用SparseArray,您将保存垃圾收集器一些工作。

所以请像Map<Integer,String>一样使用。

答案 2 :(得分:5)

这暗示您的代码有更好的数据结构。

该提示来自Lint。当你对其他东西有HashMap个整数时,你通常会得到它。

它的最大优点是将整数键视为基元。换句话说,它不会转换为Integer(Java对象)将其用作键。

使用大型地图时,这是一个大问题。在这种情况下,HashMap将导致创建许多Integer个对象。

查看更多信息here

答案 3 :(得分:0)

对于整数键值对,SparseArray比HashMap具有更好的内存效率数据结构。而且它特定于Android,我认为它不能用于Java SE。

有时,Linter警告表明必须像上面一样使用SparseArray。这个愚蠢的警告可能是对还是错。如果您认为合适,则需要决定使用SparseArray而不是HashMap,或者需要使用@SuppressLint注释取消显示。

要决定是否实施,值得进行一些研究并评估您的情况。您可以在这里找到所有有用的链接

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

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