Guava Interner错过了一些提升绩效的潜力

时间:2015-09-05 08:12:24

标签: java performance guava

我对Java对象内化感兴趣。似乎难以提供避免陷阱的高性能实现,所以我倾向于使用库。一个选项是来自Google Guava的Interner。但它发生在我身上:该实现是否缺少一些改进性能的潜力? (番石榴错过了什么?不可能是真的。最有可能的是,我在这里错过了一些东西!请点缀我。)

对象内化的一个优点是可以通过指针比较来实现对象相等,即a.equals(b)等同于a == b,这比基于字段比较的等同快得多。但是要内化的对象无法将boolean equals(Object b)函数实现为return this == bInterner库要求您创建一个对象,然后通过对象将对象与实体对象进行比较。 s"真实" equals()方法(即通过比较对象的字段)。只有在内化后,才能使用==。类似的论点适用于hash()

现在,我不想在我的代码中用a.equals(b)替换所有a == b。 (无论如何,功能等价物将是Objects.requireNonNull(a) && a == b。对于hash(),没有这样的"技巧"。因此,您需要为内部化付出代价,但是您没有充分利用它。

如何改进?提供定义两个方法Internalizableboolean realEquals(Object other)的接口int realHash()。在计划内化某个类的对象时,请使该类实现Internalizable并相应地重命名equals()hash()。要求其对象实现该接口的Interner将使用WeakHashMap(或类似)的特殊实现,它使用这些方法而不是equals()hash()

1 个答案:

答案 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; 方法应该与您期望的一样高效。