作者:Amyjionydp | 来源:互联网 | 2023-05-17 20:49
java中的集合,可以用foreach遍历出集合,但是好像容易出错,必须用迭代器遍历吗?
24 个解决方案
for(对象 o:集合)
增强for
会出错么?
貌似底层原理都是一样的,这些东西用的也是迭代器的原理,要出错应该都出错吧。。
遍历时,不改变遍历的集合应该是不会出错的。如果出错,楼主不妨把错误贴出来
你也只是说了,用foreach只是容易出错,那么掌握不就好了!
怎么会呢 都是一样的
如果是ArrayList 还是别用iterator 用ArrayList的get(int index)要好
除了数组,foreach用的就是iterator,在遍历时用add或remove可能会出错,如果确实需要在遍历时改变集合,可以参见java.util.concurrent包中的集合类
get
E get(int index)返回列表中指定位置的元素。
参数:
index - 要返回的元素的索引
返回:
列表中指定位置的元素
抛出:
IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index >= size())
list接口中提供了get方法 结合循环也能遍历
不一定啊!!比如list 就可以用list.size() 然后for循环!!
foreach就是使用的iterator,不然为什么要求实现Iterable接口。
foreach遍历的本质就是使用迭代器。
因此在使用foreach遍历时不能修改集合的结构,不然会报错。
foreach针对数组和迭代器,都一样,按道理是不应该改集合结构的,如果要改,看什么数据结构,及迭代的实现方式,再决定会不会出错
foreach的遍历集合的中途,不能改变集合的(如删除某个元素)
如果是List集合直接建议使用for循环,如果是Map集合还是使用Iterator吧!
foreach用法主要用于数组,但是也可以用于任何Collection对象。、
foreach可以对容器及数组进行遍历。
Iterator只可以对容器进行遍历。
不用循环还要遍历集合的话,就要用递归了,不过数据量大的话,没有遍历的效率高
不过,你问题的重点肯定不是这个,所以我是来打酱油的
使用迭代器 不会的存在线程的安全问题,如果用for 或者是 增强for 在集合的增删操作的时候会出现错误的。
ConcurrentModificationException,由于你在迭代时修改了元素。你可以使用线程安全的集合去代替,就不会出错。比如CopyOnWriteArrayList。
你要明白出错的本质是因为什么。
主要是这些集合并不是线程安全的。
在不修改集合中的数据的时候,使用 foreach 并不容易出错。
如果要在迭代中修改,那么分两种情况,
一种是单线程,
推荐直接使用 Iterator,循环中判断 next 出来的数据如果不用,调用 remove 即可。
一种是多线程,
这时需要加锁保证一个线程在迭代的时候,其它线程不能修改这个集合,否则可能出错(数据较少时,比较难出现错误,因为可能一个线程迭代完后,CPU 才来得及处理其它线程)。