android的SparseIntArray会自动执行自动标记密钥

时间:2016-03-12 17:53:17

标签: android hashmap

我想知道两种类似方法之间的性能差异。一个将使用Integer java包装器,一个将使用原始int。

第一个使用Integer:

public SparseIntArray readCountArray(Cursor cursor){
        SparseIntArray countMap=new SparseIntArray();
        while (cursor.moveToNext()) {
//notice the Integer objects here
            Integer id=cursor.getInt(ID_INDEX);
            Integer count=cursor.getInt(TASK_COUNT_INDEX);
            countMap.put(id,count);
        }
        return countMap;
    }

这是原始的例子:

    public SparseIntArray readCountArray(Cursor cursor){
            SparseIntArray countMap=new SparseIntArray();
            while (cursor.moveToNext()) {
//now im using primitive ints
                int id=cursor.getInt(ID_INDEX);
                int count=cursor.getInt(TASK_COUNT_INDEX);
                countMap.put(id,count);
            }
            return countMap;
        }

现在在自动装箱方面,原语示例应该更快,对吧?为什么我要在第二个例子中使用第一个例子?它们是等效的吗?它不会在Integer类上进行自动装箱,所以第一个会降低内存效率吗?

1 个答案:

答案 0 :(得分:2)

从{javadoc中可以看出,SpareIntArray的全部内容是避免整体自动装箱。当你在代码中开始这样做时,它会破坏SparseIntArray的一个主要优化。所以第一个例子没有提供我能看到的明显优势。它们在功能上是等效的,但是当处理大量元素时,第二个示例应该运行得更快。对于少数元素,速度可能没有明显差异。

内存消耗不是问题,因为所有创建的Integer对象将在循环完成后的某个时间被垃圾收集。 SparseIntArray没有持有任何盒装整数,因为它们在您执行countMap.put(id,count);时被取消装箱。

在第一个例子中最终发生的事情是,一堆intts被装入Integers,然后立即取消装箱以进入SparseIntArray,这是完全没必要的。