假设我已经定义了HashSet<String> set
在性能方面有什么好处:
set.clear;
或
set = new HashSet<String>();
编辑:我检查这个的原因是目前我的代码有第二个选项,但我想将其更改为第一个选项以进行设置final
。
答案 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
支持HashMap
,clear()
的呼叫重新路由到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将始终更快。