问题的产生:
在学习HashSet类时遇到一个案例:
金角大王有一个紫金葫芦,里面装进了“孙行者”, “行者孙”,“者行孙”。现在来了一个“孙悟空”, 他说:先放出我的朋友“孙行者”,再把我装进去。
请用HashSet和Monkey类实现以上需求。
如果按常理使用迭代器进行增删操作:
public static void main(String[] args) {
Monkey m1 = new Monkey("孙行者");
Monkey m2 = new Monkey("行者孙");
Monkey m3 = new Monkey("者行孙");
Monkey m = new Monkey("孙悟空");
HashSet set = new HashSet();
set.add(m1);
set.add(m2);
set.add(m3);
System.out.print("现在紫金葫芦里有:");
for (Object s : set) {
System.out.print(s);
}
Iterator it = set.iterator();
while (it.hasNext()){
Object o = it.next(); // 此行运行报错!
if (((Monkey)o).getName().equals("孙行者")){
set.remove(o); // 在此处进行删除操作
System.out.println("\n现在放出“孙行者”");
}
}
System.out.println("现在放入“孙悟空”");
set.add(m);
System.out.print("\n现在紫金葫芦里有:");
for (Object s : set) {
System.out.print(s);
}
会报错,结果如下:
问题的解决:
1.理论
后来理解了,迭代器的使用相当于是HashSet类对象将自己的元素暂时托管了给迭代器。所以如果要进行增删操作,必须也要通过迭代器对象来完成。查阅源码可知,如果在迭代器里直接对HashSet类对象进行操作,会引起元素的修改次数和期待修改次数不等进而报错。而通过迭代器对象增删就不会引起问题。
2.实践
将上文的删除操作这行代码进行更改:
// set.remove(o); 原代码
it.remove(); // 更改后
正常运行,结果如下: