java list 删除元素_面试中遇到的问题(list中删除元素 问题)

今天去面试了下,先总结面试的问题吧,然后在继续复习集合,今天遇到个比较模糊的问题,对于我来说

1.list中删除元素

当时面试的时候我回答出在foreach中不可以删除元素,会出现异常,用迭代器的方式可以在循环中删除,当面试官问我为什么会报错的原因:我说删除元素的时候索引会有问(这点不正确),之后回来查资料,正确的回答应该是:在for中是可以删除元素(不过会有问题的,后面的所有元素索引都会前移,此时for循环的指针却会下移,因此会略过下一个元素,解决方案是删除时将指针回调一次),foreach不支持删除,因为当我们把foreach循环反编译之后是一个do while循环,类似迭代器的,删除完成后size的数量减1,但是cursor并没有变化。导致下一次循环不相等继续向下执行,导致检查数组不通过,抛出java.util.ConcurrentModificationException,或者是删除之后直接break就没问题,又或者是用copyonwritelist,因为copyonwritelist重写的remove方法。

----ArrayList
public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }
----copyonwritelist
    public boolean remove(Object o) {
        Object[] snapshot = getArray();
        int index = indexOf(o, snapshot, 0, snapshot.length);
        return (index < 0) ? false : remove(o, snapshot, index);
    }

for循环的例子:

dba40c1c5187760a7f74b37352eae76f.png
for循环的例子

答案:

9c657345f61f547f1d82963ec2b68113.png
错误的例子的答案

解决方法上面有说到: 在调用remove方法之后执行 i--;

成功解决:

3127cdd5036e1b29e7c96bd62898a8c4.png
正确的答案
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值