包含集合中的方法替换

时间:2012-08-30 06:48:27

标签: java collections contains

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

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

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

 }

这里setMobileEnablerTxnList是一个集合。

2 个答案:

答案 0 :(得分:3)

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电话中。

答案 1 :(得分:0)

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

如果可能,请将您的列表放入HashSetcontains()方法的返回速度非常快。

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

您的代码代码如下:

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

if(set.contains(iMobileEnablerTxnList)){

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