当前位置: 首页 > 知识库问答 >
问题:

在遍历列表时向列表中添加项目是否安全

皇甫伟彦
2023-03-14

我理解不能使用枚举器对列表进行修改

  1. 即使Count小于容量,它是否总是true?(据我所知,在这种情况下,数组不会被重新分配,因此枚举器必须有效);
  2. 为什么当前返回它设置为的元素,即使枚举器已经无效?(我的意思是,如果数组被重新分配...);
  3. 重新分配是否保存了项目的原始顺序?我的意思是如果某个项目的索引为n,添加和项目后是否会有相同的索引?(MSDN说Add在列表末尾添加一个对象)如果是这样,则在常规的for循环中运行列表并添加项目是安全的,假设循环只会遍历每个项目一次,我正确吗?

共有3个答案

席兴朝
2023-03-14

添加或删除项将使枚举器无效,因为内部数组将被重新分配

这是部分正确的。添加、删除或插入项目会使枚举器无效,不是因为内部数组将被重新分配,而是因为List

回答您的问题:

  1. 如果您修改列表而不考虑“计数”,则枚举器无效[1]

1:并不总是正确的,在实现中存在错误。

盛骏祥
2023-03-14

>

  • 不会在每次从列表中添加/删除项时重新分配内部数组,这不是枚举器无效的原因。这里有一个更好的理由:收藏被修改了;枚举操作可能无法执行-为什么?。

    简单地说,当内部阵列的容量耗尽时,它会重新分配,并且阵列的大小将加倍。一些集合还允许您修剪内部数组,例如,<代码>列表

    为什么不呢?对象仍然存在。

    请看一下源代码,特别是EnsureCapacity和List

  • 蔡鹏程
    2023-03-14

    即使计数小于容量,这是否总是正确的

    这可能是真的,也可能不是真的。但是,您应该表现得好像它总是正确的,因为文档没有对此行为做出任何例外。

    列表的至少一个实现

    即使枚举数已经无效,为什么返回它设置为的元素?

    因为当前的值存储在迭代器中。虽然有充分的理由在集合被修改时阻止您进一步迭代,但当迭代器有效时,让您访问迭代器前进到的位置的值是可以的。

    重新分配是否保留了项目的原始顺序?

    对这就是为什么即使在列表中添加或删除元素时,使用for循环和索引遍历列表仍然是安全的。

     类似资料:
    • 问题内容: 我的问题是我想在遍历新元素的同时扩展一个包含新元素的列表,并且希望迭代器继续刚才添加的元素。 根据我的理解,会在列表中的当前元素之前而不是之后添加一个元素。是否可以通过其他方式实现这一目标? 问题答案: 除了以外,您无法在修改集合时使用进行迭代。 但是,如果使用方法,该方法返回,并对其进行迭代,则您还有更多要修改的选项。从javadoc中获取: 新元素插入到隐式光标之前:…后续调用将返

    • 问题内容: 我想避免。我该怎么办? 问题答案: 您可以在迭代本身期间使用支持remove / add方法的。

    • 问题内容: 是否可以在Python中以以下方式迭代列表(将此代码作为伪代码进行处理)? 它应该产生 问题答案: 从食谱:

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

    • 我的目标是从用户输入的“AM”-“PM”字符串格式打印包含24小时十进制格式的进入和退出时间的列表,如以下字符串数组:{6AM#8AM,11AM#1PM,7AM#8PM,7AM#8AM,10AM#12PM,12PM#4PM,1PM#4PM,8AM#9AM} 我在for循环中声明了各个列表,并在循环中为它们赋值,但从代码中得到了以下运行时异常:java。lang.IndexOutOfBoundsEx

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