【发布时间】:2015-04-10 03:59:49
【问题描述】:
我知道当我们需要存储重复项时,我们更喜欢ArrayList 而不是HashSet,并且HashSet 使用hashCode() 函数来计算其数组中每个元素的索引。
所以,这意味着如果我们想要存储单个元素,那么ArrayList 应该比HashSet 花费更少的时间。如果我在任何地方错了,请纠正我。
但是当我通过代码检查性能时,我得到了不同的行为。
案例一:
import java.util.*;
class HashsetVSArraylist
{
public static void main(String args[])
{
ArrayList<Integer> a1=new ArrayList<Integer>();
long nanos = System.nanoTime();
a1.add(1);
System.out.println("ArrayList Time:"+(System.nanoTime()-nanos)+"ns");
HashSet<Integer> h1=new HashSet<Integer>();
nanos = System.nanoTime();
h1.add(2);
System.out.println("HashSet Insertion Time:"+(System.nanoTime()-nanos)+"ns");
}
}
Output:
ArrayList Time:495087ns
HashSet Insertion Time:21757ns
案例 2:
import java.util.*;
class HashsetVSArraylist
{
public static void main(String args[])
{
HashSet<Integer> h1=new HashSet<Integer>();
long nanos = System.nanoTime();
h1.add(2);
System.out.println("HashSet Insertion Time:"+(System.nanoTime()-nanos)+"ns");
ArrayList<Integer> a1=new ArrayList<Integer>();
nanos = System.nanoTime();
a1.add(1);
System.out.println("ArrayList Time:"+(System.nanoTime()-nanos)+"ns");
}
}
Output:
HashSet Insertion Time:582527ns
ArrayList Time:21758ns
现在,我假设HashSet 应该花费更多时间来插入单个元素。但是,在这两种情况下,行为都是不同的……在代码中排在第二位的数据结构花费的时间更少。此外,当插入的元素数量超过 1000 个时,行为会发生变化。
请解释发生了什么。
【问题讨论】:
-
您的测试只有在您测量大量元素时才有效。尝试将 100,000 个元素添加到 5 次中,然后取平均值。
-
你应该看看这个...... [这个][1] [1]:stackoverflow.com/questions/17985029/hashset-vs-arraylist
-
您最初假设
hashCode会导致较小的开销在某些情况下确实成立。通过小数组的线性搜索可以比散列查找执行得更好。 (并且还有缓存考虑因素。HashSet可能会做更多的负载。)但是,它是一种微优化,而不是您想要设计代码的类型。差别很小。