哪一项效率更高? :
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) + "");
}
或者,是否有更快的方式来阅读列表的内容?
答案 0 :(得分:15)
在这种情况下,效率是无关紧要的,因为这两者完全不同。
我认为你意识到你的ArrayList
示例遍历了数组列表的所有元素。
你没有意识到你的SparseIntArray
示例不遍历稀疏整数数组的所有元素,因为稀疏整数的键-array not 范围从零到数组大小减去一。相反,它的键是任意整数。与HashMap<Integer, Integer>
一样,稀疏整数数组与接口一样具有ArrayList<Integer>
。
(顺便说一句,这与软件设计的一般规则有关:您的代码正确比高效更好。您可以始终采取正确的方法,清理代码并找到提高其性能的方法;但是很难采用快速,错误的代码并找到使其正确的方法。)
答案 1 :(得分:2)
当你因为其他原因不需要索引变量时,像你的第一个例子那样的每个循环几乎总是更可取。
编辑:ArrayLists将比SparseIntArray更有效地迭代(在您的示例中,重复调用“get”),因为查找是恒定时间而不是对数时间。这将取决于您的用例 - 如果您的密钥稀疏,那么SparseIntArray将为您节省大量内存空间。
我想指出SparseIntArray可以在标记中有间隙,这意味着循环遍历0和Size之间的每个值不仅效率低,而且每个丢失的索引也会返回0,这可能不是你想要的行为
答案 2 :(得分:2)
SparseIntArrays 将整数映射到整数。与正常的整数数组不同,指数可能存在差距。它旨在比使用HashMap将整数映射到整数更有效。