哪个更快?检查一个元素是否已经在一个集合中,如果没有添加它或者只是添加它?

时间:2016-04-03 08:28:22

标签: java set add

哪种方式最快将元素添加到集合中?

我看到它的方式你可以用两种不同的方式做到这一点:

  • 检查您要添加的元素是否已经在集合中,如果它不在集合中,请添加它。

  • 只需添加它,因为一个集合具有唯一元素。我不确定这种方式不会引发错误。

3 个答案:

答案 0 :(得分:5)

只需直接添加即可。它有检查的机制。

来自add方法的文档。

  

如果指定的元素尚不存在,则将其添加到此集。更正式地,如果此集合不包含元素e2(e == null?e2 == null:e.equals(e2)),则将指定元素e添加到此集合。如果此set已包含该元素,则调用将保持set不变并返回false。

答案 1 :(得分:2)

我做了一些工作来检查出来

Random rng = new Random();
ArrayList<Integer> numbers = new ArrayList<>();
for (int i = 0; i < 100000; ++i)
    numbers.add(rng.nextInt());

HashSet<Integer> set = new HashSet<>();
long beginNoCheck = System.nanoTime();
for (int i : numbers)
{
    set.add(i);
}
long endNoCheck = System.nanoTime();

set = new HashSet<>();
long beginCheck = System.nanoTime();
for (int i : numbers)
{
    if (!set.contains(i))
        set.add(i);
}
long endCheck = System.nanoTime();

System.out.println("Without check: " + (endNoCheck - beginNoCheck));
System.out.println("With check: " + (endCheck - beginCheck));

看来,在添加元素之前检查HashSet是否包含元素要快一点。我得到了像

这样的结果
  

不检查:66060748
  检查:46209808

     

不检查:38249163
  检查:32058546

     

不检查:58362677
  检查:34429848

     

不检查:52095512
  检查:39612073

     

不检查:34892990
  检查:28945278

     

不检查:42090287
  检查:38426209

答案 2 :(得分:1)

您还可以随时查看实施情况,了解背后的情况:

HashSet只是一个HashMap

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java#HashMap.getEntry%28java.lang.Object%29

下面发布的测试可能会在不同的计算机上产生不同的结果,甚至只是在不同的情况下。如果运行时之间没有真正的巨大差异,那么可读性通常比几毫秒好很多。 通常,整个软件的简单适当的概念和设计远远超过了复杂的技巧。