0

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

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

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

 }

这里 setMobileEnablerTxnList 是一个集合。

4

2 回答 2

3

contains方法不一定非常繁重(耗时)。例如,如果您使用 aHashSet它会相当快。对于 a 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;
}

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

另请参阅此问题以获取有关 a 的更多信息HashMap(由 a 内部使用HashSet

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

于 2012-08-30T07:04:38.500 回答
0

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

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

仅当您可以重用它时,使用 aHashSet才会有好处,因为填充它的成本通常会大于执行List.contains()

您的代码如下所示:

设置 set = new HashSet(EntityTree.setMobileEnablerTxnList);

如果(set.contains(iMobileEnablerTxnList)){

您必须确保正确MobileEnablerTxnList执行。hashCode()equals()

于 2012-08-30T07:06:44.890 回答