更有效的方法从数组列表中删除元素

时间:2012-04-29 07:32:52

标签: java arraylist

我开发了类似这样的数组列表

ArrayList<String> list = new ArrayList<String>();
list.add("1");
list.add("8");
list.add("8");
list.add("3");
list.add("4");

现在我的问题是:如果我想从列表中删除“8”,哪种方式更好?

第一种方式:

for(int i = 0; i < list.size(); i++) {
    if(list.get(i).equals("8")) {
        list.remove(i);
        i--;
    }
}
第二种方式:

Iterator<String> iterator = list.iterator();
    while(iterator.hasNext())
        if(iterator.next().equals("8"))
            iterator.remove();

现在请告知从性能的角度来看哪一个更高效,更快,还有其他任何类似于内置函数的方法,通过使用它我们可以删除重复而不需要迭代那么多。

3 个答案:

答案 0 :(得分:5)

如果您只需要一组数字,请使用HashSet而不是List。如果您需要保留输入数字的顺序,请使用LinkedHashSet。至于删除,总是更喜欢带有iterator的版本,即使在特定情况下性能可能具有可比性。 iterator的成语比索引更广泛适用,例如,如果使用LinkedList,索引会导致灾难性的表现。

答案 1 :(得分:3)

性能方面,他们应该是相似的。你测试过吗? 如果你想使用内置的方法,你可以用类似的性能来做到这一点。(通过测试确认):

list.removeAll(Arrays.asList("8"));

最后,如果您想要一个没有重复的列表,请使用其他人提到过的Set。

答案 2 :(得分:0)

如果您需要存储重复项,我建议您使用Map<Integer,Integer>,其中第一个整数是关键,第二个是关键出现次数。因此,当您添加已存在的密钥时,您只需递增相应的计数器。 (在删除操作中,你反之亦然)。当您需要所有不同的值时,只需使用Map.keySet()。