我想知道两种类似方法之间的性能差异。一个将使用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类上进行自动装箱,所以第一个会降低内存效率吗?
答案 0 :(得分:2)
从{javadoc中可以看出,SpareIntArray的全部内容是避免整体自动装箱。当你在代码中开始这样做时,它会破坏SparseIntArray的一个主要优化。所以第一个例子没有提供我能看到的明显优势。它们在功能上是等效的,但是当处理大量元素时,第二个示例应该运行得更快。对于少数元素,速度可能没有明显差异。
内存消耗不是问题,因为所有创建的Integer对象将在循环完成后的某个时间被垃圾收集。 SparseIntArray没有持有任何盒装整数,因为它们在您执行countMap.put(id,count);
时被取消装箱。
在第一个例子中最终发生的事情是,一堆intts被装入Integers,然后立即取消装箱以进入SparseIntArray,这是完全没必要的。