对于每个循环,循环到a的传统等同于什么

时间:2017-01-26 02:05:17

标签: java for-loop foreach

我有一个循环传统,我只是想知道每个循环的等效循环是什么。

for (int i = 0; i < words.size(); i++)
{
    words.set(i, words.get(i).toUpperCase());
}

另外,对于那些想知道的人来说,单词是String类型的arrayList。

4 个答案:

答案 0 :(得分:3)

for-each构造不允许您设置元素。这是因为它提供的语法糖完全隐藏了Iterator<E>

for (String word : words)
 ...

相当于

for (Iterator<String> it = words.iterator(); it.hasNext(); /**/) {
  String word = it.next();
  ...
}

如果String实例是可变对象,这可以起作用,这样您可以在不修改引用的情况下修改内容,但事实并非如此。为了能够用for-each做你需要的东西,你需要一个包装类,例如:

List<AtomicReference<String>> words = ...;
for (AtomicReference<String> word : words)
  word.set(word.get().toUpperCase());

答案 1 :(得分:3)

带索引的for循环很好,但您也知道,您还可以使用ListIteratorset替换当前项:

for (ListIterator<String> iterator = words.listIterator(); iterator.hasNext();) {
  String word = iterator.next();
  iterator.set(word.toUpperCase());
}

这不是增强的for循环,但非常接近于非数组Iterable的增强for循环。

答案 2 :(得分:1)

也许你会对java 8的方式感兴趣:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Class {
  public static void main(String... args) {
    List<String> words = new ArrayList<String>();
    words.add("hello");
    words = words.stream()
      .map(String::toUpperCase)
      .collect(Collectors.toList());
    System.out.println(words);
  }
}

答案 3 :(得分:1)

我很惊讶没有人使用增强的for循环指出以下结构:

int i = 0;
for (String str : words) {
  words.set(i++, str.toUpperCase());
}

现在,除非wordsRandomAccess的实例,否则这非常严重且效率低下;我更喜欢使用ListIterator approach proposed by Weston

这适用于ArrayListLinkedList等,而不是ConcurrentModificationException,因为只会在structural modification of the list之后抛出:

  

结构修改是添加或删除一个或多个元素或显式调整后备数组大小的任何操作;仅设置元素的值不是结构修改。

请注意,对于一般List实现没有安全的方法(包括原始问题中的基本for循环):set是一个可选操作,你无法判断它是否是在没有尝试的情况下为List实施。