2014-12-02 143 views
2

每个For循环与我用过的迭代器(使用Iterator.remove();方法)是这样的:的Java:for循环和迭代

for (Iterator<E> iter = list.iterator(); iter.hasNext();) { 
    E element = iter.next(); 
    //some code 
} 

基本for循环风格:

for([initial statement]; [loop condition]; [iterating statement]) {/*Some Code*/} 

所以我的问题是...为什么他们从来没有写过

for (Iterator<E> iter = list.iterator(); iter.hasNext(); E element = iter.next()) { 
    //some code 
} 

回答

6

的迭代语句执行后的循环体已经执行。换句话说,当你写了以下内容:

for (Iterator<E> iter = list.iterator(); iter.hasNext(); element = iter.next()) { 
    //some code 
} 

element = iter.next()将身体已经运行在每次迭代之后运行,所以如果你要打印的元素,例如,第一个元素是任何初始值element有。

实施例:

List<String> list = new ArrayList<String>(); 
list.add("a1"); 
list.add("a2"); 
list.add("a3"); 
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) { 
    String string = iterator.next(); 
    System.out.println(string); 
} 

输出:

a1 
a2 
a3 

随着iter.next()for循环:

List<String> list = new ArrayList<String>(); 
list.add("a1"); 
list.add("a2"); 
list.add("a3"); 
String string = null; 
for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); string = iterator.next()) { 
    System.out.println(string); 
} 

输出:

null 
a1 
a2 

P.S:环路为你申报(for (Iterator<E> iter = list.iterator(); iter.hasNext(); E element = iter.next())将无法​​编译,所以你需要声明element因为这行之前的变量。

6

for循环语法不允许您在“迭代语句”中声明变量。

(你可以声明一,在“初始声明”,这是为什么for (Iterator<E> iter = list.iterator(); iter.hasNext();)是syntatically有效。)

-1

鉴于一个for循环是围绕while环路只是语法糖,你不能使用“迭代语句”你所希望的方式,它可能是整洁使用直接在while循环:

Iterator<E> iter = list.iterator(); 
while (iter.hasNext()) { 
    E element = iter.next(); 
    //some code 
} 
+0

这是最大限度地减少局部变量的范围。 – Puce 2014-12-02 13:17:45

+0

这比以前好,但仍然没有最小化。在这种情况下,最小范围是循环的范围,如果你不需要循环之外的变量。 – Puce 2014-12-02 13:41:41

+0

@Puce我认为可读性比范围界定中的“最佳实践”规则更重要。看看这个问题,我会说这种方法是最常用的。 http://stackoverflow.com/a/1196612/360211 – weston 2014-12-02 14:05:35