关于HashSet类对象使用迭代器无法进行增删操作的问题

问题的产生:

在学习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(); // 更改后

正常运行,结果如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/SoupTC/article/details/109398618
今日推荐