实验踩坑记录:Java迭代器iterator无法remove、remove失败原因以及Iterator源码分析

本文记录了在使用Java迭代器iterator进行remove操作时遇到的问题及解决方案。问题一是因未重写hashCode导致无法删除,解决方法是重写hashCode与equals保持一致。问题二是由于modCount和expectedModCount不一致引发的迭代器失效,通过分析源码了解到这是Java的Fail-Fast机制,用于确保迭代过程中的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验踩坑记录:Java迭代器iterator无法remove、remove失败原因以及Iterator源码分析

第一个坑

在软件构造Lab2实验过程中遇到一个问题,调用Set的iterator.remove函数时无法删除,且未报错,但是单步运行时发现所比较对象时完全相同的,根据重写的equals()函数也可判断相同,以下为原代码:

 	public static boolean removePiece(Player player, Piece piece){
   
        Iterator iterator = player.pieces.iterator();
        while (iterator.hasNext()){
   
            if (piece.equals(iterator.next())) {
   
                iterator.remove();
                return true;
            }
        }
        return false;
    }

经单步运行时注意到一个细节,由于未重载hashCode函数,本该相同的iterator.next()和piece的hashCode不同,根据如下hash规则:
如果hash相同,对象不一定相等;但是如果hash不同,则对象一定不相等。
因此在不重载hashCode的前提下,重新修改该方法为:

    public static boolean removePiece(Player player, Piece piece){
   
        Iterator iterator = player.pieces.iterator();
        while (iterator.hasNext()){
   
            Piece piece1 = (Piece) iterator.next();
            if (piece1.equals(piece)) {
   
                iterator.remove();
                return true;
            }
        }
        return false;
    }

即可正确remove。

第二个坑

此处是复现之前实验踩到的,代码如下:

    public static void main(String[] args){
   
        Set<Integer> set = 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值