ToStringBuilder,HashCodeBuilder,EqualsBuilder使用反射的速度有多慢

时间:2013-07-30 14:19:04

标签: java apache-commons stringbuilder

ToStringBuilder提供了一种实现toString方法的便捷方式,就像这个

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

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

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

我很少在生产代码中使用equals或hashCode方法,我只在调试过程中使用toString但在生产中没有,所以我的问题是: 如果我使用 EqualsBuilder HashCodeBuilder ToStringBuilder 使用反射实现我的bean方法,我很少使用toStringhashCode或者equals是否仍然是性能损失?

4 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

Equals和HashCode的原因往往是在整个应用程序中定期使用,IDE会产生足够好的实现。

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

答案 3 :(得分: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;
}