2012-03-13 103 views
1

哪一个是更有效? :循环效率对比

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) + ""); 
} 

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

+1

检查:http://developer.android.com/guide/practices/design/performance.html#foreach – idiottiger 2012-03-13 03:20:35

+2

请问是否有指标之间的差距,第二个甚至工作?文档说'list2.size()'返回键/值对的数量,而不是最高的索引。意思是,如果你的地图有两个条目({100 => 100,200 => 200}),你不会看到它们吗? – cHao 2012-03-13 03:21:51

+0

@cHao正确,也不一定会遍历所有的值(除非前面的代码写这样一来,这不是强制执行的),另外,在范围内的任何丢失的钥匙将只返回0,这意味着log.i(标签,“ 0“)可能会被称为很多。 – Chet 2012-03-13 03:34:11

回答

15

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

我想你知道,通过数组列表中的所有元素的ArrayList示例循环。

你不知道什么是你SparseIntArray例如不迭代通过稀疏整数数组的所有元素,因为稀疏整数数组的键做范围从零到阵列尺寸减一。相反,它的键是任意整数。稀疏整数数组有很多共同点,接口方面,HashMap<Integer, Integer>ArrayList<Integer>一样。

(这,顺便说一下,涉及到软件设计的一般规则:它是更好地为你的代码正确高效你总是可以采取正确的,干净的代码,并设法提高其性能;但很难采取快速,错误的代码并找到使其正确的方法。)

+0

+1上迭代,以便首先回答并提及与HashMap的相似性。 – Chet 2012-03-13 03:26:54

+1

+1关于正确的>高效代码的美丽报价。 – josephus 2012-03-13 03:42:31

+0

@ruakh,我想是的,感谢您的评论,我认为在我的情况下使用arraylist是正常的更好。 – rex 2012-03-13 04:40:53

2

对于像您的第一个示例那样的每个循环,如果您因为其他原因不需要索引变量,则几乎总是可取的。

编辑:会的ArrayList迭代更有效(在你的榜样,一边喊“得到”),比SparseIntArray因为查找是相对于对数时间常数时间。这将取决于你的用例 - 如果你的密钥稀疏,那么SparseIntArray会为你节省大量的内存空间。

我想指出SparseIntArray可以在指示符中有间隙,这意味着循环遍历0和Size之间的每个值不仅效率低,而且它也会为每个缺失的索引返回0,这可能不是您的意图行为。

+1

实际上,'SparseIntArray'中的查找需要*对数*时间,因为它使用二分搜索。对于'[0,size]'范围内的每个“缺失索引”,该范围外有一个* extra *索引*,该循环永远不会到达,因为'size'是元素的数量,而不是与阵列中最大的索引有关。 (请参阅http://developer.android.com/reference/android/util/SparseIntArray.html,http://www.java2s.com/Open-Source/Android/android-core/platform-frameworks-base/android/ util/SparseIntArray.java.htm。) – ruakh 2012-03-13 03:45:12

+0

@ruakh哦,谢谢,我只是错过了这一点,非常感谢XD。 – rex 2012-03-13 04:41:53

+0

@ruakh很有意思。我只是猜测在实施。考虑到SparseIntArray应该比HashMap更有效,但它实际上具有更高的算法时间。 – Chet 2012-03-13 11:56:58

2

SparseIntArrays地图整数到整数。与普通的整数数组不同,索引中可能存在空白。它的目的是比使用HashMap将整数映射到整数更有效。

Read More