集合删除元素的方法foreach循环的底层原理及正确使用方式

  上述情况抛出并发修改异常的原因分析:1、ArrayList内部有一个成员变量,用来记录list内部元素改变的次数。扩展:

  因为,这种情况下,一旦remove之后,原ArrayList的size会减少1,下一轮通过(hasNext只是返回迭代器内部的迭代位置cursor是否已达到被迭代容器的size,本身不会抛异常)判断是否还有元素时,发现没有了,直接返回false,进而不会调用到方法。当然也就不会有从这个方法中抛出的异常啦。

  遍历过程中,集合或数组中同时只有一个元素可见,即只有“当前遍历到的元素”可见,而前一个或后一个元素是不可见的。

  foreach循环其实是一种加强的for循环,相较于for循环更加简洁,可以用来遍历数组或者集合,它的底层原理其实是实现了迭代器的功能,所以本质上来说foreach可以遍历任何实现了Iterable接口的对象。

  2、Iterator迭代器方式遍历,通过迭代器的remove方法进行删除。

  可以发现使用foreach遍历集合时,它会被转译为迭代器的方式去实现集合的遍历。即:

  foreach在遍历集合的过程中不能修改集合中元素的值。不过,如果遍历的是数组,则不受此限制。

  均会导致子列表的遍历、增加、删除产生 异常。高度注意对父集合元素的增加或删除,iter内部会用成员变量记录下当时的modCount的值。下一轮循环的方法中抛出的。一旦不一致就会抛。在 subList 场景中,在整个循环的遍历过程中,异常是在增减集合元素后,——阿里巴巴Java开发规范(嵩山版)2、通过返回一个新的迭代器对象的时候,因此,不管是还是方法都会检查原ArrayList的modCount值是否与iter内部记录的值一致。

  foreach在遍历过程中不能往集合中增加或删除元素,否则会抛出异常。即使在个别特殊情况下没有抛出这个异常,那也是因为巧合(下文会有说明)。

  foreach本质上不过是编译器提供的“语法糖”包装。编译器在遇到代码时,会进行代码的转译。

  2、如果是遍历集合类型,则要求被遍历的集合类型必须实现接口,在方法中返回一个Iterator迭代器。

留下评论

您的电子邮箱地址不会被公开。 必填项已用*标注