我可以使用什么来代替包含集合的方法来找出集合中的类似条目。包含是一个非常繁重(耗时)的方法。
现在我正在使用像这样的包含
if (EntityTree.setMobileEnablerTxnList.contains(iMobileEnablerTxnList)) {
}
这里setMobileEnablerTxnList是一个集合。
答案 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
内部使用)
最后一条建议:如果遇到性能问题,请使用分析器查看实际瓶颈的位置。我怀疑它会在contains
电话中。
答案 1 :(得分:0)
List.contains()
的实现遍历列表,检查target.equals(element)
。
如果可能,请将您的列表放入HashSet
,contains()
方法的返回速度非常快。
使用HashSet
只有在您可以重复使用它时才会有好处,因为填充它的成本会比执行List.contains()
更大。
您的代码代码如下:
设置set = new HashSet(EntityTree.setMobileEnablerTxnList);
if(set.contains(iMobileEnablerTxnList)){
您必须确保MobileEnablerTxnList
正确实施hashCode()
和equals()
。