什么是更快的hashset清除或新的hashset?

时间:2011-11-02 07:44:45

标签: java performance hashmap hashset

假设我已经定义了HashSet<String> set 在性能方面有什么好处:

set.clear;

set = new HashSet<String>();

编辑:我检查这个的原因是目前我的代码有第二个选项,但我想将其更改为第一个选项以进行设置final

6 个答案:

答案 0 :(得分:11)

虽然 clear 可能性能更高,但这取决于集合的大小。实际上,这不太可能对您的应用程序的性能产生重大影响。即使在围绕此函数的代码行中,性能也将受其他因素(如JIT编译)的支配。

重要的是设计质量,这样可以在分析代码之后轻松地重构。在大多数情况下,避免难以跟踪的状态更改很重要,创建新的 HashSet 比重用 HashSet 更好。

答案 1 :(得分:5)

我建议你做你认为最清楚,最简单的事情。

尝试重用HashSet的问题是内部使用的大多数对象都不会被回收。如果你想要这个,请使用Javolution的FastSet http://javolution.org/target/site/apidocs/javolution/util/FastSet.html

HashSet不是最有效的集合集合,所以如果您真的关心这种级别的微优化,您可能会发现不同的集合更适合您的用例。然而,99%的时间它很好,是哈希集最明显的选择,我怀疑你如何使用它并不重要。

答案 2 :(得分:3)

HashSet明确调用map.clear()

 /**
  621        * Removes all of the mappings from this map.
  622        * The map will be empty after this call returns.
  623        */
  624       public void clear() {
  625           modCount++;
  626           Entry[] tab = table;
  627           for (int i = 0; i < tab.length; i++)
  628               tab[i] = null;
  629           size = 0;
  630       }

所以它肯定取决于Set的大小。但答案是在您的应用环境中对其进行基准测试

注意:参考本次演讲中的OpenJDK实现

答案 3 :(得分:3)

HashSet支持HashMapclear()的呼叫重新路由到HashMap.clear()。这是(至少在Java 1.6中)实现如下:

/**
 * Removes all of the mappings from this map.
 * The map will be empty after this call returns.
 */
public void clear() {
    modCount++;
    Entry[] tab = table;
    for (int i = 0; i < tab.length; i++)
        tab[i] = null;
    size = 0;
}

所以我认为,如果您的旧HashSet非常大,那么新的HashSet将会快得多。

答案 4 :(得分:1)

HashSet#clear将遍历支持HashMap中的所有元素,并将它们设置为null。

我认为set = new HashSet<String>()会更快,n的值越来越大。

答案 5 :(得分:1)

除非您描述了问题,否则这听起来像是您应该避免的优化。如果没有,那么一般来说,你可能会更好地按照预期的方式使用API​​(即调用clear())。

如果您使用clear()或新的HashMap()在代码区域中分析了问题,那么您可能最好更快地查看HashSet的替代方法。除非您需要保证集合级别的唯一性,否则LinkedList或ArrayList将始终更快。