我已经实现了一种方法,它只是循环一组包含许多不同模块数据的CSV文件。然后将'moduleName'添加到hashSet中。 (代码如下所示)
我使用了一个hashSet,因为它保证不会插入重复项而不是ArrayList,它必须使用contains()方法并遍历列表以检查它是否已经存在。
我相信使用哈希集的性能比数组列表更好。 我说的是正确的吗?
另外,有人可以向我解释一下:
使用big-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;
}
答案 0 :(得分:45)
My experiment表明HashSet
比包含3个元素的集合的ArrayList
更快。
完整的结果表
| 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
答案 1 :(得分:24)
他们是完全不同的课程,所以问题是:你想要什么样的行为?
HashSet
确保没有重复项,为您提供O(1)contains()
方法,但不保留顺序。
ArrayList
无法确保没有重复项,contains()
为O(n),但您可以控制条目的顺序。
答案 2 :(得分:20)
我相信使用哈希集的性能比数组列表更好。我说的是正确的吗?
有很多(不管它意味着)条目,是的。但是,对于较小的数据大小,原始线性搜索可能比散列更快。确切地说,收支平衡就在哪里,你只需要衡量。我的直觉是,只需少于10个元素,线性查找可能更快;有超过100个元素散列可能更快,但这只是我的感觉......
从HashSet查找是常量时间O(1),前提是元素的hashCode实现是理智的。列表中的线性查找是线性时间,O(n)。
答案 3 :(得分:5)
这取决于数据结构的用法。
您将数据存储在HashSet
中,而您的存储空间HashSet
优于ArrayList
(因为您不需要重复输入)。但只是存储不是通常的意图。
这取决于您希望如何读取和处理存储的数据。如果您想要顺序访问或基于随机索引的访问,那么ArrayList
会更好,或者如果排序无关紧要,那么HashSet
会更好。
如果排序很重要但你想做很多修改(添加和删除),那么LinkedList会更好。
对于访问特定元素HashSet
将具有时间复杂度O(1),如果您使用ArrayList
,那么它将是O(N),因为您自己已指出您将拥有通过列表到iterate
并查看元素是否不存在。