Java:尽可能有效地比较哈希集

Java:尽可能有效地比较哈希集,java,performance,hashset,Java,Performance,Hashset,我有3个哈希集。goodLinkSet、badLinkSet和testLinkSet goodLinkSet保存有效URL列表,badLinkSet保存无效URL列表。testLinkSet包含一个URL列表,我需要检查这些URL的好坏,这里的一些链接已经在其他两个集合中进行了测试 我想做的是删除testLinkSet中出现在goodLinkSet和badLinkSet中的所有字符串/链接,这样我就不会多次测试URL。我希望尽可能高效、快速地完成这项工作。每一个循环的速度似乎有点慢 最有效的运行

我有3个哈希集。goodLinkSet、badLinkSet和testLinkSet

goodLinkSet保存有效URL列表,badLinkSet保存无效URL列表。testLinkSet包含一个URL列表,我需要检查这些URL的好坏,这里的一些链接已经在其他两个集合中进行了测试

我想做的是删除testLinkSet中出现在goodLinkSet和badLinkSet中的所有字符串/链接,这样我就不会多次测试URL。我希望尽可能高效、快速地完成这项工作。每一个循环的速度似乎有点慢

最有效的运行方式是什么?有什么函数可以为我实现这一点吗?任何建议都将不胜感激

我想做的是删除testLinkSet中出现在goodLinkSet和badLinkSet中的所有字符串/链接,这样我就不会多次测试URL

这将在内部运行一个循环,但除非你有(许多)数百万个链接,否则在它完成之前你没有时间数到1

如果您需要更好的性能,您应该跟踪每个单独的链接,并在测试时删除/添加它们

我想做的是删除testLinkSet中出现在goodLinkSet和badLinkSet中的所有字符串/链接,这样我就不会多次测试URL

最有效的方法不是删除条目,而是根据需要测试它们

for(URL url: testLinkSet) {
    if(goodLinkSet.conatins(url) || badListSet.conatins(url)) continue;

    // test url
}

与相同数量的测试相比,这样做的工作量要小得多,但避免修改任何内容。

您应该在插入时检查:

boolean addToTestLinkSet(String str) {
  if (goodLinkSet.contains(str) || badLinkSet.contains(str))
    return false;
  testLinkSet.add(str);
  return true;
}
HashSet
s上的
contains()
是O(1),因此开销应该很低

该解决方案与Peter的非常相似,但增加了使用更少内存的好处(因为它将避免在
testLinkSet
中临时存储无用的条目)


此外,如果您知道
badLinkSet.size()>goodLinkSet.size()
,您甚至可以交换测试这两个集合的顺序。

您所需要的是每个条目最多包含两个
调用<代码>包含
为O(1)。你怎么了?您是否已经存在性能问题,或者您只是在问?手动循环可以节省一点时间,仅当对第一组的检查失败时,才根据第二组检查每个成员。这实际上很有意义,我应该想到这一点。我唯一的问题是,当你为每个链接检查两组时,它是否会因为必须同时访问这两个链接而减慢速度?我想这只需要几毫秒?应该是100纳秒,而不是毫秒。
boolean addToTestLinkSet(String str) {
  if (goodLinkSet.contains(str) || badLinkSet.contains(str))
    return false;
  testLinkSet.add(str);
  return true;
}