HashSet vs ArrayList 包含性能

2022-08-31 22:18:22

在处理大量数据时,我经常发现自己在做以下事情:

HashSet<String> set = new HashSet<String> ();
//Adding elements to the set
ArrayList<String> list = new ArrayList<String> (set);

类似于“转储”列表中集合的内容。我通常这样做,因为我添加的元素通常包含我要删除的重复项,这似乎是删除它们的简单方法。

只有考虑到这个目标(避免重复),我也可以写:

ArrayList<String> list = new ArrayList<String> ();
// Processing here
if (! list.contains(element)) list.add(element);
//More processing here

因此,无需将集合“转储”到列表中。但是,在插入每个元素之前,我会做一个小检查(我假设HashSet也是如此)

这两种可能性中的任何一种显然更有效率吗?


答案 1

集合将提供更好的性能(与列表相比),这是正常的,因为集合成员资格(操作)是集合的真正目的O(n)O(n^2)contains

包含 for a 与列表进行比较,因此,如果您经常需要运行 ,则永远不要使用列表。HashSetO(1)O(n)contains


答案 2

使用数组来存储数据。将具有 O(n) 复杂性。因此,从本质上讲,一次又一次地在数组中搜索将具有复杂性。ArrayListArrayList.containsO(n^2)

同时使用哈希机制将元素存储到其各自的存储桶中。对于长值列表,的操作将更快。它将到达 中的元素。HashSetHashSetO(1)


推荐