Java集合迭代为什么会发生异常
packageuseCollect;importjava.util.*;publicclassIteratorUse{publicstaticvoidmain(Strin...
package useCollect;
import java.util.*;
public class IteratorUse {
public static void main(String[] args){
Collection books = new HashSet();
books.add("学习C语言");
books.add("学习Java语言");
books.add("学习C#语言");
Iterator it = books.iterator();
while(it.hasNext()){
String book = (String)it.next();
System.out.print(book+"--->");
if(book.equals("学习C#语言")){
//books.remove(book);
books.add("学习移动开发");
}
}
}
}
//这个程序运行时没有异常发生,但是当我将book.equals("学习C#语言")改成book.equals("学习C语言")或者book.equals("学习Java语言")时都会发生异常,为什么会出现两种不同的情况? 展开
import java.util.*;
public class IteratorUse {
public static void main(String[] args){
Collection books = new HashSet();
books.add("学习C语言");
books.add("学习Java语言");
books.add("学习C#语言");
Iterator it = books.iterator();
while(it.hasNext()){
String book = (String)it.next();
System.out.print(book+"--->");
if(book.equals("学习C#语言")){
//books.remove(book);
books.add("学习移动开发");
}
}
}
}
//这个程序运行时没有异常发生,但是当我将book.equals("学习C#语言")改成book.equals("学习C语言")或者book.equals("学习Java语言")时都会发生异常,为什么会出现两种不同的情况? 展开
展开全部
在用迭代器iterator迭代元素的时候,是不能够直接添加删除元素的,就是说不能进行修改,否则可能会产生异常。移除元素可以使用it.remove()这个方法是标记移除,等遍历完才真正删除。你上述程序没有发生异常是因为学习C#语言是set的最后一个元素,但是在里面添加,循环中没有打印出来吧。
追问
没有打印出来,是不是因为打印学习C#语言的时候迭代已经结束了?
追答
在hashset和hashmap中保存了修改次数,迭代器会保存刚建立迭代器的时候的修改次数,每次添加删除都会增加修改次数,在迭代器调用next()的时候(调用next()方法会将next这个成员变量置为指向下一个元素或者为NULL),会比较迭代器和set或map的修改次数,若不相同,则会抛出异常,而hasnext不会比较这个次数。而hasnext这个方法不会比较次数,只是比较next这个成员变量是否为空。所以“打印“学习C#语言”后,迭代会结束。 但是在中间添加元素的话,因为下一个hashnext判断不为空,所以会执行next()这个方法,导致抛出异常。
展开全部
//你增加一个元素后,集合就发生变化,因此迭代器需要重新初始化。
while(it.hasNext()){
String book = (String)it.next();
System.out.print(book+"--->");
if(book.equals("学习C语言")){
books.remove(book);
books.add("学习移动开发");
it = books.iterator();//add
}
}
while(it.hasNext()){
String book = (String)it.next();
System.out.print(book+"--->");
if(book.equals("学习C语言")){
books.remove(book);
books.add("学习移动开发");
it = books.iterator();//add
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
报什么异常?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为book.equals("学习C#语言") 恰好是最后一次迭代.
iterator 在迭代中不能改变原有collection 的size
iterator 在迭代中不能改变原有collection 的size
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你应该把异常提示贴出来,看你的代码,语法什么的应该是没问题的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询