1、安全性:
-
在多线程情况下,使用迭代器的remove()方法修改集合可以避免在遍历集合的过程中修改集合,从而避免ConcurrentModificationException并发修改异常异常(在使用迭代器遍历集合时,每次使用迭代器的next()方法获取下一个元素时,迭代器都会
检查集合是否被修改过
,如果在迭代器外部修改了集合的结构,则会抛出此异常
)。 -
单线程情况下虽然没有并发修改异常,但如果在遍历集合时使用集合自身的方法进行修改,会导致集合的结构发生变化,后续元素的索引也发生变化,从而影响了遍历的结果。具体来说,如果在遍历过程中添加或删除元素,可能会导致某些元素被跳过或多次遍历,或者导致遍历过程中抛出异常。
举个例子:假设有一个ArrayList列表,包含如下元素:[1, 2, 3, 4, 5],现在使用for循环遍历该列表,并在遍历到第三个元素时,使用remove()方法删除该元素,在执行完第三次循环之后,列表中的元素发生了变化,变成了[1, 2, 4, 5],此时i的值为3,由于删除元素后索引前移, 索引3对应的值为元素5, 元素4就这样被跳过了。这样就导致了某些元素被跳过或多次遍历的情况。
2、高效性:
使用迭代器的remove()方法不仅能够避免并发修改异常,还能够高效地删除元素。因为迭代器内部维护了一个指向当前元素的指针,所以在使用迭代器遍历集合时,可以直接删除当前元素,而不需要再次查找该元素的位置。而使用集合自身的remove()方法删除元素时,需先从集合中查找该元素的位置,然后再执行删除操作,效率相对较低。