集合常用的3种遍历方式
1 迭代器 Iterator
运行结果
说明上面例子中for和while不能使用同一个iterator对象,因为在while循环中iterator已经返回最后一个元素,指针指向的下一个元素为空了,即hasNext()返回值为false,不能用该迭代器的hasNext()作为for循环的判断条件。
2 转换为Object[]进行遍历
运行结果
3 使用增强for(foreach)实现遍历
运行结果
`注意·
增强for有个缺点,如果集合或者数组为null,会报空指针异常(NullPointerException),在调用增强for时最好先做判断。通过反编译可以看到增强for是用iterator的for循环实现的,是iterator的替代,iterator也有这种空指针异常的问题。
4说明
运行结果,集合元素内容不变
*4.2 并行修改异常ConcurrentModificationException
4.2.1 迭代器和foreach(增强for)遍历的循环中,不能出现集合对象本身调用方法更改集合内容,否则运行会报错 java.util.ConcurrentModificationException(并修改异常)
原因是--迭代器和foreach都是依赖集合而存在的,如果集合更改了,迭代器和增强for都不知道,所以就报并行修改异常。
运行结果
4.2.2 解决办法
A 使用普通for循环,在循环中根据判断集合对内容进行修改
B 使用迭代器对集合内容进行修改,Iterator接口中没有该方法,它的子类ListIterator接口中提供add()
详情请参考: https://www.jianshu.com/p/94b12cceb6c7 中(二、3.3)
4.3 一个集合对象的迭代器循环中多次使用next(),会出现java.util.NoSuchElementException异常。
运行结果
4.4 迭代器的remove()能删除next()返回的元素,这也算是更改了集合的内容,不能用元素的值在进行迭代进行解释,遗留
运行结果