2

ToStringBuilder提供了一种方便的方法来实现该toString方法,就像这样

  @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); 
    }

hashCode实现和 equals 方法几乎相同。

但是在文档和stackoverflow的一些答案中,它说它有点慢。

我很少在生产代码中使用 equals 或 hashCode 方法,我只在调试过程中使用,而不是在生产中使用,所以我的问题是:如果我使用EqualsBuilderHashCodeBuilderToStringBuildertoString和反射实现我的 bean 方法并且我很少使用,或者是它仍然是性能损失吗?toStringhashCodeequals

4

4 回答 4

4

这取决于如何使用它。例如,如果您像这样使用 HashCodeBuilder

public int hashCode() {
    HashCodeBuilder.reflectionHashCode(this);
}

很明显,即使没有测量它也会很昂贵,因为它是基于反射的。但是这种方式并没有那么贵

public int hashCode() {
   HashCodeBuilder hb = new HashCodeBuilder();
   hb.append(field1);
   hb.append(field2);
   ...
   return hb.toHashCode();
}

唯一的问题是它创建了一个额外的对象,如果手动执行相同的操作可以避免。

于 2013-07-30T14:37:28.013 回答
0

当谈到性能影响时,衡量自己总是更好。没有人能告诉你它将如何影响你的系统。你确定你很少使用equals和hashCode吗?例如,它们也被非常常见的结构 Map 和 Set 使用。

于 2013-07-30T14:22:33.530 回答
0

我建议您使用“Caliper”进行微基准测试。但是,除了 ToStringBuilder,我不会使用IDE EqualsBuilderHashCodeBuilder而是使用 IDE 生成的那个。

原因是 Equals 和 HashCode 往往在整个应用程序中经常使用,并且 IDE 生成了足够好的实现。

另一方面,我之所以使用,ToStringBuilder是因为我通常使用 toString 进行调试。

于 2013-07-30T15:09:34.377 回答
0

如果你的类是不可变的,或者用于 hashCode 和 toString 的字段没有改变,你可以缓存 hashCode 和 toString 的结果。这样慢反射代码只被调用一次。这为您提供了为 hashCode 和 toString 编写自定义代码的大部分速度增益,但(通常)更容易编码。

这个技巧在String.hashCode()中使用。

int hashCode = 0;
String toString = null;

public int hashCode() {
  int h = hashCode;  // local copy for thread safety, see String
  if (h == 0) {
     h = HashCodeBuilder.workYourMagic();
     hashCode = h;
  }
  return h;
}

public String toString() {
  String s = toString;
  if (s == null) {
    s = ToStringBuilder.workYourMagic();
    toString = s;
  }
  return s;
}
于 2013-07-30T15:36:50.147 回答