我还可以使用什么来代替包含集合的方法来找出集合中的类似条目。因为包含是一种非常繁重(耗时)的方法。
现在我正在使用这样的包含
if (EntityTree.setMobileEnablerTxnList.contains(iMobileEnablerTxnList)) {
}
这里 setMobileEnablerTxnList 是一个集合。
我还可以使用什么来代替包含集合的方法来找出集合中的类似条目。因为包含是一种非常繁重(耗时)的方法。
现在我正在使用这样的包含
if (EntityTree.setMobileEnablerTxnList.contains(iMobileEnablerTxnList)) {
}
这里 setMobileEnablerTxnList 是一个集合。
该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
电话中。
的实现List.contains()
遍历列表检查是否target.equals(element)
.
如果可能,将您的列表放入 aHashSet
中,其contains()
方法总是很快返回。
仅当您可以重用它时,使用 aHashSet
才会有好处,因为填充它的成本通常会大于执行List.contains()
。
您的代码如下所示:
设置 set = new HashSet(EntityTree.setMobileEnablerTxnList);
如果(set.contains(iMobileEnablerTxnList)){
您必须确保正确MobileEnablerTxnList
执行。hashCode()
equals()