【问题标题】:Contains method replacement in collection包含集合中的方法替换
【发布时间】:2012-08-24 20:29:25
【问题描述】:

我还可以使用什么来代替包含集合的方法来找出集合中的类似条目。因为包含是一个非常繁重(耗时)的方法。

现在我正在使用这样的包含

if (EntityTree.setMobileEnablerTxnList.contains(iMobileEnablerTxnList)) {

 }

这里的 setMobileEnablerTxnList 是一个集合。

【问题讨论】:

  • 因为包含是一种非常繁重(耗时)的使用方法是什么让你这么认为?例如在aHashSet这个操作比较快。
  • @Robin 我认为您的评论是正确的答案 - 即使用HashSet。考虑让它成为一个答案
  • @Robing 因为在内部它会检查每个节点以找出正确的解决方案。
  • @Sunil 不,不会,只有在同一个桶中的那些(至少如果它是HashSet,你还没有说你正在使用Set 的什么实现)。
  • @FrankPavageau 是的,对不起,信息不完整。我在这里使用哈希集,并实现了哈希码和 equals 方法。

标签: java collections contains


【解决方案1】:

contains 方法不一定非常繁重(耗时)。例如,如果您使用HashSet,它会相当快。对于HashSet,它将计算对象的hashCode,并且只遍历相应“桶”中的对象。它肯定不会遍历所有元素(或者您对 hashCode 方法的实现会很差)。

这在HashSet#contains方法的源码中可以看出,最终在HashMap中调用了如下代码:

final Entry<K,V> getEntry(Object key) {
    int hash = (key == null) ? 0 : hash(key.hashCode());
    for (Entry<K,V> e = table[indexFor(hash, table.length)];
         e != null;
         e = e.next) {
        Object k;
        if (e.hash == hash &&
            ((k = e.key) == key || (key != null && key.equals(k))))
            return e;
    }
    return null;
}

这清楚地表明它只在有限的一组对象上循环。

有关HashMap(由HashSet 在内部使用)的更多信息,另请参阅this question

最后一条建议:如果您遇到性能问题,请使用分析器查看实际瓶颈所在的位置。我怀疑它会出现在contains 电话中。

【讨论】:

  • 谢谢,这对我来说真的是一个获得知识的答案。
【解决方案2】:

List.contains() 的实现会遍历列表检查 target.equals(element) 是否存在。

如果可能,将您的列表放入HashSet,其contains() 方法总是很快返回。

使用HashSet 只有在您可以重复使用它的情况下才会有好处,因为填充它的成本通常会比执行List.contains() 更高。

您的代码如下所示:

Set set = new HashSet(EntityTree.setMobileEnablerTxnList);

if (set.contains(iMobileEnablerTxnList)) {

您必须确保 MobileEnablerTxnList 正确实现 hashCode()equals()

【讨论】:

  • 我知道这很混乱,但在问题中已经说明** setMobileEnablerTxnList 是一个集合**(顺便说一句不好命名)
  • @Robin 我开始认为问题在于他有Set&lt;List&gt;,并且列表没有正确实现equals()hashCode()(以反映其内容)
  • 即使集合还不是SetSet 中的副本也可能只有在完成一次然后用于多个contains() 调用时才有意义。否则,您已经在原始集合上迭代一次以填充 Set,在项目上调用 hashCode(),然后在同一个存储桶中的项目上迭代以调用 equals()
  • 是的,我这里用的是hashset,也实现了hascode和equals方法。
  • @Robin 非常感谢 robin 指出问题,以后会处理这些问题。
猜你喜欢
  • 2012-01-24
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多