在添加之前检查LinkedHashSet.contains(...)是否值得?

时间:2015-05-27 02:49:32

标签: java

我使用LinkedHashSet来实现按条目排序的集合。如果添加了一个重复元素,它应该在结尾处,并且应该删除该集合中已有的条目。

我在讨论set.remove(条目)之前,是否值得检查set.contains(条目)是否值得?基本上检查包含()每次提供任何时间/空间的好处,而不是每次盲目调用remove()?

Set<Integer> set = new LinkedHashSet<>();
// The below
set.remove(entry);
set.add(entry);
// Versus the below
if (set.contains(entry)) {
set.remove(entry);
}
set.add(entry);

2 个答案:

答案 0 :(得分:1)

我建议不要同时调用contains和remove。两个调用都必须搜索链以查找元素,而contains执行此操作的速度不会快于remove。因此,您每次拨打电话的时间可能会增加一倍。

您可以自己浏览containsremove的代码。

您会发现两者最终都可能在HashMap的removeNoderemove中的某些点(contains遍历哈希映射&#39; s getNode),如果您的装置负载很重,可能会受到性能影响。

如果您的设置不是很重,那么它仍然可能不值得,但不是那么重要,因为在稀疏哈希链中设置预期的查找/删除是O (1)(即无论你有5个元素还是5000个元素,它都会一样快。)

答案 1 :(得分:1)

幕后使用LinkedHashSet HashMap remove(Object)仅在Object对象contains移除#include <iostream> #include <string> #include <algorithm> int main(){ std::string s1 = " Hello World 1 "; std::string s2 = " Hello World 2 "; while(s1.find(' ') != std::string::npos){ s1.erase(s1.find(' ')); } while(s2.find(' ') != std::string::npos){ s2.erase(std::find(s2.begin() , s2.end() ,' ')); } std::cout<<s1<<"\n"; std::cout<<s2; return 0; } 因此不必要,并且会增加时间复杂度对象存在于集合中。