我在收藏方面做了很多工作,但我对此毫无疑问。
我知道我们可以用迭代器迭代列表。
另一种方式是我们可以通过以下方式进行:
for(int i=0; i<list.size(); i++){
list.get(i);
}
在这里我认为每次调用list.size()都会产生影响性能的整个树。
我认为其他解决方案也是如此:
int s = list.size();
for(int i=0; i<s; i++){
list.get(i);
}
我认为这可以解决问题。我没有太多接触线程。我在想,这应该是正确的方法。
我认为的另一种方式是:
for (Object obj; list){
}
使用这个新的for循环,我认为编译器会再次检查列表的大小。
请从这些或替代性能效率方法中提供最佳解决方案。谢谢你的帮助。
答案 0 :(得分:5)
对于你的例子是最好的方法:
for (Object obj: list){
}
与java版本相同; 1.5:
for (Iterator it = hs.iterator() ; it.hasNext() ; ){}
它使用集合的迭代器。你实际上并不需要收藏的大小。 .size()方法实际上应该不构建树,但.get()可以循环到给定元素。 .get()和.size()方法依赖于List实现。 .get()在ArrayList中实际应该是O(1)复杂度而不是O(n)
<强>更新强>
在java 8中,您可以使用:
myList.forEach{ Object elem ->
//do something
}
答案 1 :(得分:4)
在每次迭代时调用size()
并不是真正的问题。对于我所知道的所有集合,此操作为O(1):size()只返回列表字段的值,保持其大小。
第一种方式的主要问题是重复调用get(i)
。这个操作对于ArrayList是O(1),但是对于LinkedList是O(n),使得整个迭代O(n 2 )而不是O(n):get(i)
力从列表的第一个元素(或最后一个元素)开始的列表,并转到下一个节点,直到第i个元素。
使用迭代器或使用foreach循环(内部使用迭代器),保证使用最合适的迭代方式,因为迭代器知道列表的实现方式以及从一个元素到最佳元素的最佳方式下。
顺便说一句,这也是迭代非索引集合(如集合)的唯一方法。所以你最好习惯使用那种循环。答案 2 :(得分:1)
在性能方面迭代列表的最佳方法是使用迭代器(使用foreach的第二种方法)。 如果您使用list.get(i),它的性能将取决于列表的实现。对于ArrayList,list.get(i)是O(1),其中它是LinkedList的O(n)。
此外,list.size()是O(1),不应对性能产生任何影响。
答案 3 :(得分:1)
for (Object obj: list){
}
以上代码对我来说是最好的方式,它很干净,可以轻松阅读。
Java 8中的forEach也很不错。