0

我正在创建一些相当大的对象,其中许多是重复的。所以我考虑Interner为他们使用番石榴,并且总是只使用实习对象(即,每个对象在创建后立即被实习)。

我突然想到equals这些对象相当慢(并且经常被使用)而且我实际上从来不需要它,就像a.equals(b)实习a == b之后一样。不幸的是,它Interner本身使用equals,所以我必须覆盖它以供一次性使用。

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


免责声明:我知道万恶之源,我不确定这个地方的优化是否值得。但是,如果上述问题有一个很好的解决方案,我很感兴趣。

4

2 回答 2

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
  }
}

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

于 2014-01-03T09:14:10.690 回答
1

这取决于您的使用模式,您希望在哪里受到性能影响。

如果您要在创建对象进行大量比较,并且您知道重复出现的频率很高,那么享元模式可能是有意义的,因为您所有的创建后比较都可以通过引用相等来完成。

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

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

编辑补充:也就是说我很惊讶他们的实习生完全依赖equals(). hashcode()在我看来,依赖并仅equals()用于碰撞会更有意义。

于 2013-12-21T05:45:00.567 回答