我有以下声明:
ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("2");
list.add("3");
list.add("4");
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:如果我想从列表中删除"2",哪种方式更好?
第一种方式:
for(int i = 0; i < list.size(); i++) {
if(list.get(i).equals("2")) {
list.remove(i);
i--;
}
}
Run Code Online (Sandbox Code Playgroud)
第二种方式:
Iterator<String> iterator = list.iterator();
while(iterator.hasNext())
if(iterator.next().equals("2"))
iterator.remove();
Run Code Online (Sandbox Code Playgroud)
两者都安全正确,哪个更有效?
是否还有其他方法可以从ArrayList中删除元素而不会IndexOutOfBounds出现错误?
实际上,可能更快的是
list.removeAll(Collections.singleton("2"));
Run Code Online (Sandbox Code Playgroud)
在幕后,对于一个ArrayList,它确实基本上创建了像@Edmund建议的阵列的新副本,但在较低的水平,这可能会导致更高的性能.
尽管如此,正如其他人所提到的,LinkedList从大型列表中删除多个元素通常具有更好的性能.
(即使您决定切换到a LinkedList仍然可以使用上面的代码,它将等同于使用迭代器方法,对于创建的单例集合以及发生的一些额外方法调用会产生一些开销.)
对于单个元素,您的 for 循环将正常工作(好吧,当您删除时(不,真的,它会正常工作)。你的迭代方法也是如此。i--,它会remove()自动将元素移至左侧)
您只是迭代到 的末尾ArrayList,并且不会退出它。就效率而言,这是一次洗礼 - 我建议您对大小为 100,000 的运行时间进行采样,看看效果如何。(无论列表有多大,它仍然是 O(N) 操作的顺序。)
| 归档时间: |
|
| 查看次数: |
3115 次 |
| 最近记录: |