实验踩坑记录: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 =