散列集和数组列表性能

时间:2012-04-17 17:50:42

标签: java performance algorithm arraylist hashset

我已经实现了一种方法,它只是循环一组包含许多不同模块数据的CSV文件。然后将'moduleName'添加到hashSet中。 (代码如下所示)

我使用了一个hashSet,因为它保证不会插入重复项而不是ArrayList,它必须使用contains()方法并遍历列表以检查它是否已经存在。

我相信使用哈希集的性能比数组列表更好。 我说的是正确的吗?

另外,有人可以向我解释一下:

  1. 如果使用,如何处理每个数据结构的性能?
  2. 使用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; 
    

    }

4 个答案:

答案 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并查看元素是否不存在。