为什么java中有两种不同的for循环?

Eph*_*aim 25 java for-loop

我有一个for循环,我不知道它是如何工作的.我熟悉:

for(int i = 0; i <= 9; i++)
{
    /* implementation */
}
Run Code Online (Sandbox Code Playgroud)

我对以下形式的for循环感到困惑:

String[] myString = new String[] {"one", "two", "three", "some other stuff"};

String str1 = "", str2 = "";  

for (String s :  myString)
{
    /* implementation */
}
Run Code Online (Sandbox Code Playgroud)

这些类型的for循环如何工作?它们与常规for循环有什么不同?

MJB*_*MJB 35

第一个是原始for循环.初始化变量,设置终止条件,并提供状态递增/递减计数器(有例外,但这是经典)

为了那个原因,

for (int i=0;i<myString.length;i++) { 
  System.out.println(myString[i]); 
}
Run Code Online (Sandbox Code Playgroud)

是正确的.

对于Java 5,提出了一种替代方案.可以支持任何实现iterable的东西.这在收藏中特别好看.例如,您可以像这样迭代列表

List<String> list = ....load up with stuff

for (String string : list) {
  System.out.println(string);
}
Run Code Online (Sandbox Code Playgroud)

代替

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

所以它只是一个替代符号.任何实现Iterable的项(即可以返回迭代器)都可以这样编写.

幕后发生的事情是这样的事情:(更有效率,但我明确地写了它)

Iterator<String> it = list.iterator();
while (it.hasNext()) {
  String string=it.next();
  System.out.println(string);
}
Run Code Online (Sandbox Code Playgroud)

最后它只是语法糖,但相当方便.

  • 注意使用速记这样的一个限制而不是原始迭代器是你不能使用迭代器的remove()方法.当使用迭代器样式时,你也无法获得索引计数 - 对于相关集合来说,这是一个交易破坏者. (3认同)