繁体   English   中英

比较项目时的Java收集性能

[英]Java collection performance when comparing items

来自C / C ++的人提出的基本性能问题。

我正在使用Collection( ArrayDeque )来按标识简单地保存,添加或删除项。 我知道协定是集合在检查相等性时使用equals()的示例,例如在remove(obj)期间,但是在我的情况下,我想使用引用语义(例如IdentityHashMap,但不需要映射)。 因此,只要知道我将永远不会覆盖集合内的任何对象(声明为保留接口)上的equals()便可以了。

来自本机编程,我无法避免问自己, remove(obj)的编译后的代码是否会遍历项目并在Object.equals()上执行虚拟调用而最终只能比较地址? 由于我存储的是接口引用,因此没有方法(?)使用final优化此方法,因此编译器不会费心进行无用的调用(即内联它们)-但现在我已经超越了我自己,因为它可能是无论如何,这种优化是没有必要的,在这种情况下,JVM还有其他方法(去虚拟化?)来生成最佳代码。

假设我的代码需要首先通过考虑此方面而获得的优化级别- 我的理解正确吗? 这个案例有什么好的设计

将方法设置为final不会避免虚拟调用,因为无论如何都将使用invokevirtual操作码,并且JVM无法判断方法是否为final。

好消息是,如果JVM无法看到方法在类路径中的任何地方被覆盖,则JVM可以内联它或避免虚拟调用,因此您的性能将随着程序的运行而提高。

当使用remove方法时,它将调用equals方法进行比较。 理想情况下,您应该重写equals和hashcode方法以使用此类方法。 否则,默认情况下会进行类型检查和地址比较。 强烈建议在使用Collections方法时定义equals和hashcode方法的实现。 关于性能,是的,您是对的-集合中的所有对象将被线性扫描,直到J​​VM遇到正确的匹配为止。 这是线性搜索,因此此删除操作的时间复杂度为O(n)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM