概述
这是一道标准的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()方法。
最后
以上就是俊秀银耳汤为你收集整理的Collection接口的remove()方法和Iterator接口的remove()方法的区别.的全部内容,希望文章能够帮你解决Collection接口的remove()方法和Iterator接口的remove()方法的区别.所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复