老师说用Iterator的时候,编译器会自动完成一些东西,可是反编译以下这段代码:import java.util.ArrayList;
import java.util.Iterator;public class IteratorTest {
public static void main(String[] args)
{
ArrayList<String> str = new ArrayList();
for (int i = 0; i <=20; i++)
{
str.add("String" + i);
} for (String myStr : str)
{
System.out.println(myStr);
} for (Iterator i = str.iterator(); i.hasNext();)
{
System.out.println(i.next());
}
}
}
用cavaj反编译后的代码如下:import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;public class IteratorTest
{ public IteratorTest()
{
} public static void main(String args[])
{
ArrayList str = new ArrayList();
for(int i = 0; i <= 20; i++)
{
str.add((new StringBuilder()).append("String").append(i).toString());
} String myStr;
for(Iterator i$ = str.iterator(); i$.hasNext(); System.out.println(myStr))
{
myStr = (String)i$.next();
} for(Iterator i = str.iterator(); i.hasNext(); System.out.println(i.next())) { }
}
}请问在效率上,用iterator和用for循环,到底有什么区别呢?用哪个更好?
import java.util.Iterator;public class IteratorTest {
public static void main(String[] args)
{
ArrayList<String> str = new ArrayList();
for (int i = 0; i <=20; i++)
{
str.add("String" + i);
} for (String myStr : str)
{
System.out.println(myStr);
} for (Iterator i = str.iterator(); i.hasNext();)
{
System.out.println(i.next());
}
}
}
用cavaj反编译后的代码如下:import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Iterator;public class IteratorTest
{ public IteratorTest()
{
} public static void main(String args[])
{
ArrayList str = new ArrayList();
for(int i = 0; i <= 20; i++)
{
str.add((new StringBuilder()).append("String").append(i).toString());
} String myStr;
for(Iterator i$ = str.iterator(); i$.hasNext(); System.out.println(myStr))
{
myStr = (String)i$.next();
} for(Iterator i = str.iterator(); i.hasNext(); System.out.println(i.next())) { }
}
}请问在效率上,用iterator和用for循环,到底有什么区别呢?用哪个更好?
而iterator则是用来遍历集合中的元素。本身是不能够循环遍历需要借助循环控制语句进行迭代元素。
个人认为iterator封装了循环体遍历元素的细节,使得编程人员无需关心集合结构,以及访问元素的操作。
例如:
for(int i=0;i<size;i++){
Object o=list.get(i);//List遍历元素
}
for(int i=0;i<size;i++){
Object o=objects[i];//数组遍历元素
}
而对iterator来说,使用一个统一的接口来访问具体的集合元素.
while(iterator.hasNext()){
Object o=iterator.next();//统一的接口来访问具体的集合元素.
}
但是对于没有声明的,则iterator远远高于for
你要说讨论iterator和for的效率问题
这就像是在说鸡蛋和石头谁好吃一样,根本就不是一类东西,你在比较啥?
iterator的效率要看他的实现代码是怎么样写的,难道iterator就不能用for来实现了吗?
没有bench支持的都是信口开河
import java.util.Collections;
import com.google.common.base.Stopwatch;
import java.util.Iterator;public class Bench {
public static void main(final java.lang.String[] args) {
final int SIZE = Integer.MAX_VALUE / 32;
System.out.printf("loop times: %d%n",SIZE);
Stopwatch stopwatch = new Stopwatch().start();
ArrayList<String> list = new ArrayList<>(SIZE);
for (int i = 0; i < SIZE; i++) {
list.add(" ");
}
long millis = stopwatch.elapsedMillis();
System.out.printf("init took: %dms%n",millis); StringBuilder builder = new StringBuilder(SIZE);
stopwatch = stopwatch.reset().start();
for (int i = 0; i < SIZE; i++) {
builder.append(list.get(i));
}
millis = stopwatch.elapsedMillis();
System.out.printf("for loop took: %dms%n",millis); builder.delete(0,SIZE);
stopwatch = stopwatch.reset().start();
for (String v : list) {
builder.append(v);
}
millis = stopwatch.elapsedMillis();
System.out.printf("foreach took: %dms%n",millis); builder.delete(0,SIZE);
stopwatch = stopwatch.reset().start();
for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) {
builder.append(iter.next());
}
millis = stopwatch.elapsedMillis();
System.out.printf("iterator loop took: %dms%n",millis);
}
}
Oracle JDK 7u1
java -Xmx512m -cp .:guava-10.0.jar Bench
loop times: 67108863
init took: 1601ms
for loop took: 3688ms
foreach took: 4766ms
iterator loop took: 4546ms
java -server -Xmx512m -cp .:guava-10.0.jar Bench
loop times: 67108863
init took: 1129ms
for loop took: 3876ms
foreach took: 3491ms
iterator loop took: 4318ms
1) foreach循环编译后还是被转成了iterator,所以效率应该没有区别
2) iterator适用于所有集合类,而foreach并不是(?)
这个总结不知各位前辈觉得怎样?
VariableModifiersopt TargetType Identifier =
(TargetType) #i.next();
Statement
}由此可见,二者是没有区别的引用链接:http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.14.2
自己写个东西测试一下,Iterator去list集合内容就是要比for循环快,去一个含有10000元素的list集合的时候,for总是比iterator多耗费30~50ms