我创建了一些相当大的对象,其中很多都是重复的。所以我考虑过为他们使用Guava' Interner
并且只使用interned对象(即每个对象在创建后立即被实现)。
我突然意识到这些对象的equals
相当缓慢(并且经常使用)而我实际上从不需要它,因为a.equals(b)
在实习后相当于a == b
。不幸的是,Interner
本身使用了equals
,所以我必须覆盖它才能一次性使用。
我想知道是否有一种简单的方法可以让我的平等吃掉它?
免责声明:我知道root of all evil,我不确定这个地方的优化是否值得付出努力。但是,如果上述问题有一个很好的解决方案,我很感兴趣。
答案 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
}
}
作为进一步的步骤,您可以考虑在(私有)方法中包装“一堆其他东西”,这将鼓励等于内联。很难知道这些东西何时起作用,但是......