Hashset 和 Arraylist 性能
Posted
技术标签:
【中文标题】Hashset 和 Arraylist 性能【英文标题】:Hash Set and Array List performances 【发布时间】:2012-04-29 02:15:57 【问题描述】:我已经实现了一种方法,它简单地循环一组 CSV 文件,其中包含许多不同模块上的数据。然后将“moduleName”添加到 hashSet 中。 (代码如下)
我使用了 hashSet,因为它保证不会插入重复项,而不是 ArrayList,后者必须使用 contains() 方法并遍历列表以检查它是否已经存在。
我相信使用散列集比数组列表有更好的性能。 我这样说对吗?
还有,谁能给我解释一下:
-
如果使用每个数据结构,如何发挥性能?
使用大 O 表示法的复杂度是多少?
HashSet<String> modulesUploaded = new HashSet<String>();
for (File f: marksheetFiles)
try
csvFileReader = new CSVFileReader(f);
csvReader = csvFileReader.readFile();
csvReader.readHeaders();
while(csvReader.readRecord())
String moduleName = csvReader.get("Module");
if (!moduleName.isEmpty())
modulesUploaded.add(moduleName);
catch (IOException e)
e.printStackTrace();
csvReader.close();
return modulesUploaded;
【问题讨论】:
您可能希望将您使用的语言作为标签之一包含在内(您必须删除其他语言之一,但语言无疑更重要)。 【参考方案1】:My experiment 表明 HashSet
比 ArrayList
更快,从包含 3 个元素的集合开始。
完整的结果表
| Boost | Collection Size |
| 2x | 3 elements |
| 3x | 10 elements |
| 6x | 50 elements |
| 12x | 200 elements | <= proportion 532-12 vs 10.000-200 elements
| 532x | 10.000 elements | <= shows linear lookup growth for the ArrayList
【讨论】:
【参考方案2】:它们是完全不同的类,所以问题是:你想要什么样的行为?
HashSet
确保没有重复,为您提供 O(1) contains()
方法,但不保留顺序。ArrayList
不确保没有重复,contains()
是 O (n) 但您可以控制条目的顺序。
【讨论】:
【参考方案3】:我相信使用散列集比数组列表有更好的性能。我这样说对吗?
有很多(无论是什么意思)条目,是的。但是,对于较小的数据大小,原始线性搜索可能比散列更快。盈亏平衡点在哪里,你必须衡量。我的直觉是,如果元素少于 10 个,线性查找可能会更快;超过 100 个元素的散列可能更快,但这只是我的感觉......
如果元素的 hashCode 实现是健全的,则从 HashSet 中查找是常数时间,O(1)。从列表中线性查找是线性时间,O(n)。
【讨论】:
【参考方案4】:这取决于数据结构的使用。
您将数据存储在 HashSet
中,并且对于您的存储情况,HashSet
比 ArrayList
更好(因为您不希望重复条目)。但仅仅存储并不是通常的意图。
这取决于您希望如何读取和处理存储的数据。如果您想要顺序访问或基于随机索引的访问,那么ArrayList
更好,或者如果排序无关紧要,那么HashSet
更好。
如果排序很重要,但您想进行大量修改(添加和删除),LinkedList 会更好。
对于访问特定元素 HashSet
的时间复杂度为 O (1),如果您使用 ArrayList
则为 O (N),正如您自己指出的那样,您必须使用 iterate
通过列表查看元素是否不存在。
【讨论】:
以上是关于Hashset 和 Arraylist 性能的主要内容,如果未能解决你的问题,请参考以下文章
5.秋招复习简单整理之请介绍一下List和ArrayList的区别,arrayList和HashSet区别?
Java自学-集合框架 ArrayList和HashSet的区别
HashSet的contains()和ArrayList的contains()方法哪个更快一些?
Java集合 -- ArrayList 的扩容机制HashMap 和 Hashtable的区别HashMap 和 HashSet区别HashSet如何检查重复
Arraylist 和 linkedlist || hashset 和treeset. || hashMap 和 TreeMap