优化java.util.Map/Set中的插入速度

时间:2009-02-22 18:07:00

标签: java algorithm collections insert performance

有没有办法通过指定项目的顺序来优化java.util.Collection中插入的速度?

例如

java.util.Set<String> set = java.util.TreeSet<String>();

这个解决方案:

set.add("A");
set.add("B");
set.add("C");
set.add("D");
set.add("E");

比这个更快(随机顺序)?

set.add("E");
set.add("D");
set.add("C");
set.add("A");
set.add("B");

(和其他集合的问题相同:HashMap,hastable ......)

由于

5 个答案:

答案 0 :(得分:8)

简单的答案是“时间和看到”。

另一个答案是“无所谓”。这似乎是微观优化,几乎不值得努力。我认为它属于"The Sad Tragedy of Micro-Optimization Theater"类别。

答案 1 :(得分:6)

对于java.util.Map和java.util.Set没有,因为这些是接口,并且有不同的实现。

对于具体实现,这不是一个值得优化的。如果您遇到性能问题,请选择更合适的实施方案,或重新考虑您需要存储的内容和方式。

在一台普通的笔记本电脑上插入5000个随机数到一个HashSet大约需要一毫秒,所以你想要插入多少百万个元素才能使这种优化变得有价值?

答案 2 :(得分:3)

red-black tree(用于实现Java的TreeSet/TreeMap)的插入时间最好保证为O(log n)。如果项目按特定顺序排列可能会更快,但我不确定它会是什么(可能预先排序最快?)。

插入哈希表是O(1)(常数时间)操作。插入的主要内容是计算hashcode


编辑:Starblue建议预先排序可能会产生最糟糕的表现,因此您可以尝试随机顺序。

答案 3 :(得分:2)

基于散列的集合和基于树的集合之间自然存在巨大差异。

基于树的元素受益于插入的元素排序(例如,字符串之间的比较),因此当您具有可比较的对象(如字符串)时,最好使用它们。 TreeSet / TreeMap /等。在标准集合中应该是平衡的(红黑树),所以插入顺序并不重要。如果它不平衡,那么插入顺序就很重要,因为你可能最终得到的是链而不是树。

在哈希表中,加载因子和散列函数决定了所有内容,但是如果你正在处理字符串,你可能最好不要使用散列。

如果你需要一组包含重叠字符串的字符串,Trie可能会提高内存效率,但我不认为库中有一个字符串。

答案 4 :(得分:1)

在采取优化措施时,请注意考虑数据结构的特征。对于一个极端的例子,按排序顺序将元素插入二叉树将产生链表。