我是靠谱客的博主 温柔小蝴蝶,最近开发中收集的这篇文章主要介绍集合遍历时remove方法的问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这是一道标准的Java数据结构面试题,重点是回答区别。

Collection接口的remove()方法本质上就是各个底层自己实现的remove()方法,其优点就是当其不是遍历的情况下,效率应该是最快的。但是其在遍历的情况下,将会导致各种问题,比如在现在 Collection c = new ArrayList();

那么无论是使用forEach还是fori方法都将导致一个致命的问题,ArrayList进行remove之后,所有的下标会前移一位,其将直接跳过remove的下一位,直接对其下下一位进行判断。

比如:

public static void remove(ArrayList<String> list)
{
    // list = {"b1","b2","b3"};
    for(inti=0;i<list.size();i++)
    {
        Strings=list.get(i);
        if(s.contains("b"))
        {
            list.remove(s);
        }
    }
    // 期待结果是 list = {};
    // 最终结果为 list = {"b2"}
}

如果list = {“b1”,“b2”,“b3”};

那么我们期望的是list = {};

但是实际运行结果将是:list = {“b2”};

因为其在删除 b1 之后,b2,b3 将会向前移动一位,但是下标依旧后移,所以直接删除b3,结束循环.

对于一个Collection类,我们在很多情况下甚至都不知道底层对象到底是谁,我们更希望底层实现自己实现遍历时删除的功能,为我们屏蔽掉各种各样的问题,而Iterator接口则定义了Collection遍历时锁需要的全部操作,所以其底层实现也都是在集合类内部实现,能够有效减少Bug和异常的产生。

所以我会这样告诉面试官:

Collection的remove适合于非遍历情况下的删除,直接调用底层自己实现的 
remove 方法,但是因为对底层实现的不了解,所以当其在遍历情况下,将导 
致异常或者BUG, 比如在ArrayList中,直接删除元素后,所有之后的元素会
向前移一位,如果不考虑清 楚,则可能会遗漏若干个对象的判断,而Iterator
的remove方法是由底层各个实现专 门 为遍历删除时提供的方法,其的安全性,
准确性,效率都高于Collection的remove()方法。

转载于 (https://blog.csdn.net/m0_37961948/article/details/88886010)

最后

以上就是温柔小蝴蝶为你收集整理的集合遍历时remove方法的问题的全部内容,希望文章能够帮你解决集合遍历时remove方法的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部