Guava Interner 遗漏了一些性能改进的潜力

Guava Interner misses some potential for performance improvement

我对 Java 对象内部化很感兴趣。似乎很难提供避免陷阱的高性能实现,所以我倾向于使用库。一种选择是来自 Google Guava 的 Interner。但我突然想到:这种实现不会错过一些提高性能的潜力吗? (番石榴遗漏了什么?不可能是真的。很可能,我在这里遗漏了一些东西!请赐教。)

对象内部化的一个优点是可以通过指针比较实现对象相等,即a.equals(b)等价于a == b,比基于字段比较的equaliy快很多。但是要内部化的对象不能将其 boolean equals(Object b) 功能实现为 return this == bInterner 库要求您创建一个对象,然后通过对象的 [=41] 将其与 interned 对象进行比较=] equals() 方法(即通过比较对象的字段)。只有内化后,才能使用==hash().

也有类似的论点

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

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

即使调用虚拟 equals 方法(包含 == 比较)的性能也不如直接通过 == 进行比较。我建议您替换 equals 方法。

然而,如果有一个原因你不能安全地这样做:好的 equals 方法(以及那些由 IDE 生成的)开始于一些短路 returns,例如

    if (this == obj) {
        return true;
    }
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    MyObject other = (MyObject) obj;

这样的 equals 方法应该和您预期的一样高效。