java - 在 Java 中,您可以在迭代 List 时修改它吗?

标签 java arraylist

我知道在 Java 中是 Collection<E>不应在迭代时修改,例如删除或添加元素。但是如何改变 List 中的元素呢?例如,如果我们有

List<String> letters = new ArrayList<String>();
letters.add("A");
letters.add("B");
letters.add("C");
int i = 0;

for (String letter : letters) {
    letters.set(i, "D");
    i++;
}

所以,我不是在谈论修改存储在元素中的对象。我说的是改变对象的what。 List 的大小没有改变,但索引处的对象正在改变,所以从技术上讲,List 正在被修改。我的老板声称这段代码很好(而且看起来确实有效),但我仍然认为它不正确。使用 ListIterator 的 set(E e) 方法可能会更好吗?

最佳答案

在遍历列表的同时修改列表中的元素的想法并没有错(不要修改列表本身,不建议这样做),但可以更好地表达为:

for (int i = 0; i < letters.size(); i++) {
    letters.set(i, "D");
}

最后,整个列表将以字母 "D" 作为其内容。在这种情况下使用增强的 for 循环不是一个好主意,您没有将迭代变量用于任何事情,而且您不能使用迭代变量修改列表的内容。

请注意,上面的代码段没有修改列表的结构 - 意思是:没有添加或删除任何元素,列表的大小保持不变。简单地将一个元素替换为另一个元素不算作结构修改。这是link对于@ZouZou 在评论中引用的文档,它指出:

A structural modification is any operation that adds or deletes one or more elements, or explicitly resizes the backing array; merely setting the value of an element is not a structural modification

关于java - 在 Java 中,您可以在迭代 List 时修改它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20639098/

相关文章:

php - PHP 多维数组分割

Java - 多种对象的一种方法

java - 如何从 Spring Boot jar 构建 Docker 镜像

java - 如何将动态 Bean 参数注入(inject) Jersey 方法?

java - 在 ArrayList 的 ArrayList 中查找唯一的 Arraylist

java - 如何从 Java 中的 String 中删除重复的单词?

java - 如何将 Retrofit 响应映射到数据模型类?

java - 获取文件的总大小(以字节为单位)

java - 如何在 LibGDX 中绘制 BitmapFont?

java - 在 Soap Security Header (Spring WS) 中设置自定义标签