迭代列表的最佳方法是什么

Nim*_*esh 4 java collections iterator list thread-safety

我在收藏方面做了很多工作,但我很少有疑问.

我知道我们可以用迭代器迭代列表.

另一种方式是我们可以通过以下方式进行:

for(int i=0; i<list.size(); i++){
   list.get(i);
}
Run Code Online (Sandbox Code Playgroud)

在这里我认为每次调用list.size()都会产生问题,这将构建影响性能的整个树.

我认为其他解决方案也是如此:

int s = list.size();
for(int i=0; i<s; i++){
  list.get(i);
}
Run Code Online (Sandbox Code Playgroud)

我认为这可以解决问题.我没有太多接触线程.我在想,这应该是正确的方法.

我认为的另一种方式是:

for (Object obj; list){

}
Run Code Online (Sandbox Code Playgroud)

有了这个新的for循环,我认为编译器会再次检查列表的大小.

请从这些或替代性能有效的方法中提供最佳解决方案.谢谢您的帮助.

JB *_*zet 6

size()在每次迭代中调用并不是真正的问题。对于我知道的所有集合,这个操作是 O(1):size() 只是返回列表字段的值,保持其大小。

第一种方式的主要问题是重复调用get(i). 这个操作对于 ArrayList 是 O(1),但是对于 LinkedList 是 O(n),使得整个迭代 O(n 2 ) 而不是 O(n):get(i)强制列表从列表的第一个元素开始(或最后一个),然后转到下一个节点,直到第 i 个元素。

使用迭代器,或使用 foreach 循环(内部使用迭代器),保证使用最合适的迭代方式,因为迭代器知道列表是如何实现的,以及如何最好地从一个元素到下一个元素。

顺便说一句,这也是迭代非索引集合(如 Sets)的唯一方法。所以你最好习惯使用那种循环。


Cyb*_*eks 5

对于你的例子是最好的方法:

for (Object obj: list){

}
Run Code Online (Sandbox Code Playgroud)

它与java版本<1.5中的相同:

for (Iterator it = hs.iterator() ; it.hasNext() ; ){}
Run Code Online (Sandbox Code Playgroud)

它使用集合的迭代器.你实际上不需要收集的大小..size()方法实际上应该不构建树,但.get()可以循环到给定元素..get()和.size()方法依赖于List实现..get()在ArrayList中实际应该是O(1)复杂度而不是O(n)

UPDATE

在java 8中,您可以使用:

myList.forEach{ Object elem -> 
 //do something
}
Run Code Online (Sandbox Code Playgroud)