当前位置: 首页 > 面试题库 >

在Java中,您可以在遍历列表时修改它吗?

林俊晖
2023-03-14
问题内容

我了解在Java中,Collection<E>不应在遍历Java时对其进行修改,例如删除或添加元素。但是,如何更改列表中的元素呢?例如,如果我们有

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++;
}

因此,我不是在谈论修改存储在某个元素上的对象;我说的是改变对象是 什么
。List的大小未更改,但是索引处的对象正在更改,因此从技术上讲,List也在被修改。我的老板声称此代码很好(并且确实可以正常工作),但我仍然认为它是不正确的。是否可以使用ListIterator的set(E
e)方法更好地做到这一点?


问题答案:

在遍历列表时修改列表中的元素没有什么错(不要修改列表本身,不建议这样做),但是可以这样更好地表达它:

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

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

请注意,以上代码段 并未 修改列表的结构-
含义:未添加或删除任何元素,列表的大小保持不变。简单地将一个元素替换为另一个元素不算作结构修改。这是@ZouZou在评论中引用的文档的链接,其中指出:

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



 类似资料:
  • 问题内容: 例如: 上面的代码不执行任何操作,因为条件不是通过引用获得的。正确的方法是什么? 问题答案: 您可以使用: 但是,总的来说,这些东西在使用辅助函数和列表理解时会更加干净: 应该注意的是,第二种解决方案不会适当地更新列表-换句话说,如果您对此列表有其他引用,则它们不会受到影响。如果需要,可以使用切片分配很容易地进行替换:

  • 我想在Java中使用for-each循环迭代节点列表。我有一个for循环和do-while循环,但不是每个循环都有。

  • 想改进这个问题吗 通过编辑这篇文章,更新问题,以便用事实和引用来回答。 我说的是一个人的名单。我必须遍历此列表才能找到id为X的人,如果找到,我必须更新该人的某些属性: 这段代码对我来说很有用,但我不确定这是为了实现什么,我正在使用它。映射我并不真正需要的返回值,所以我想知道是否有更好的方法来实现这一点?

  • 问题内容: 您可以在速度模板中执行类似的操作吗? 它输出空白标签,如下所示: 和 我究竟做错了什么? 问题答案: 您的错误是将 键 和 值 称为方法(在括号后加上“()”),而不是属性。试试这个: 换句话说,使用诸如 mapEntry.key之 类的属性,或诸如 mapEntry.getKey()之 类的方法。

  • 输入是一个列表列表。请看下面。文件名是一个列表,包含的名称与列表中的列表数量相同(,,) 每个名称都附加到路径中:-- 程序在遍历列表时遍历包含路径的列表,并打印路径及其文件名。我希望输出是--。然而,我得到了下面的输出。请查看输入后的输出 输入 输出 我希望输出是-- 然而,我得到的结果如下: 我无法理解为什么在遍历列表时不能使用文件名遍历路径列表。我希望这有助于澄清问题。有人能帮忙吗? 我已经

  • 问题内容: 我试图设置一个不可修改的。 在我的代码中,我有一个返回列表的方法。 此列表不应该修改,但我不想捕获unmodifiableList返回的异常。 它是现有代码,我必须对其进行转换以返回不可修改的列表,但是如果调用了“ add”方法,则不必捕获任何异常。 首先,我创建一个类,该类实现List来覆盖“ add”方法以记录异常而不是捕获异常。 但是我不知道如何正确地实例化它。 问题答案: 如果