环路效率比较



以下哪项更高效?:

ArrayList<Integer> list = new ArrayList<Integer>();
for(int a : list){
   log.i(tag, a + "");
}
SparseIntArray list2 = new SparseIntArray();
int count = list2.size();
for(int j = 0; j < count; j++) {
   log.i(tag, list2.get(j) + "");
}

或者,有没有更快的方法来读取列表的内容?

在这种情况下,效率是无关紧要的,因为这两者做的事情完全不同。

我想您已经意识到您的ArrayList示例会遍历数组列表的所有元素。

您没有意识到的是,您的SparseIntArray示例不会遍历稀疏整数数组的所有元素,因为稀疏整数数组中的键不会从0到数组大小减1。相反,它的键是任意整数。稀疏整数数组在接口方面与HashMap<Integer, Integer>ArrayList<Integer>有同样多的共同点。

(顺便说一句,这与软件设计的一条一般规则有关:你的代码正确比高效要好。你总是可以使用正确、干净的代码,并找到提高其性能的方法;但很难使用快速、有缺陷的代码并找到使其正确的方法。)

SparseIntArrays将整数映射为整数。与普通的整数数组不同,索引中可能存在间隙。它旨在比使用HashMap将整数映射到整数更高效。

阅读更多

对于每个循环,当您出于其他原因不需要索引变量时,像第一个示例这样的循环几乎总是更可取的。

Edit:ArrayLists比SparseIntArray更有效地迭代(在您的示例中,重复调用"get"),因为查找是恒定时间,而不是对数时间。不过,这将在一定程度上取决于您的用例——如果您的密钥是稀疏的,那么SparseIntArray将为您节省大量内存空间。

我要指出的是,SparseIntArray的标记中可能有间隙,这意味着在0和Size之间的每个值上循环不仅效率低下,而且它还会为每个丢失的索引返回0,这可能不是您想要的行为。

最新更新