我对Java对象内化感兴趣。似乎难以提供避免陷阱的高性能实现,所以我倾向于使用库。一个选项是来自Google Guava的Interner
。但它发生在我身上:该实现是否缺少一些改进性能的潜力? (番石榴错过了什么?不可能是真的。最有可能的是,我在这里错过了一些东西!请点缀我。)
对象内化的一个优点是可以通过指针比较来实现对象相等,即a.equals(b)
等同于a == b
,这比基于字段比较的等同快得多。但是要内化的对象无法将boolean equals(Object b)
函数实现为return this == b
:Interner
库要求您创建一个对象,然后通过对象将对象与实体对象进行比较。 s"真实" equals()
方法(即通过比较对象的字段)。只有在内化后,才能使用==
。类似的论点适用于hash()
。
现在,我不想在我的代码中用a.equals(b)
替换所有a == b
。 (无论如何,功能等价物将是Objects.requireNonNull(a) && a == b
。对于hash()
,没有这样的"技巧"。因此,您需要为内部化付出代价,但是您没有充分利用它。
如何改进?提供定义两个方法Internalizable
和boolean realEquals(Object other)
的接口int realHash()
。在计划内化某个类的对象时,请使该类实现Internalizable
并相应地重命名equals()
和hash()
。要求其对象实现该接口的Interner
将使用WeakHashMap
(或类似)的特殊实现,它使用这些方法而不是equals()
和hash()
。
答案 0 :(得分:0)
即使调用虚拟SelectedItem
方法(包含equals
比较),也不如直接通过==
进行比较。我建议你替换==
方法。
然而,如果有一个原因你不能安全地做到这一点:好的等于方法(以及由IDE生成的方法)从一些短路返回开始,例如
equals
这样的 if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
MyObject other = (MyObject) obj;
方法应该与您期望的一样高效。