如何避免interned对象的缓慢等于?

时间:2013-12-21 05:33:01

标签: java guava equality string-interning

我创建了一些相当大的对象,其中很多都是重复的。所以我考虑过为他们使用Guava' Interner并且只使用interned对象(即每个对象在创建后立即被实现)。

我突然意识到这些对象的equals相当缓慢(并且经常使用)而我实际上从不需要它,因为a.equals(b)在实习后相当于a == b 。不幸的是,Interner本身使用了equals,所以我必须覆盖它才能一次性使用。

我想知道是否有一种简单的方法可以让我的平等吃掉它?


免责声明:我知道root of all evil,我不确定这个地方的优化是否值得付出努力。但是,如果上述问题有一个很好的解决方案,我很感兴趣。

2 个答案:

答案 0 :(得分:1)

这取决于您的使用模式,以了解您希望获得性能影响的位置。

如果您要在创建对象之后进行大量比较,并且您知道重复次数很多,那么flyweight模式可能有意义,因为所有后期创建比较可以通过参考相等来完成。

要考虑的另一件事是空间效率;你提到它们是大型物体。什么更重要?如果你通过汇集对象来节省大量内存,那可能就是一场胜利。

使用这两种方法分析代码也可以帮助您做出决定。

编辑添加:这就是说我很惊讶他们的内部人员完全依赖于equals()。在我看来,依靠hashcode()并仅使用equals()进行碰撞会更有意义。

答案 1 :(得分:1)

如果你的equals方法在内部使用“a == b”,那还够快吗?

class BigObject {
  public boolean equals(Object o) {
    if(o == this) return true;
    if(o == null) return false;
    // a bunch of other stuff
  }
}

作为进一步的步骤,您可以考虑在(私有)方法中包装“一堆其他东西”,这将鼓励等于内联。很难知道这些东西何时起作用,但是......