2

ToStringBuildertoStringこのように、メソッドを実装する便利な方法を提供します

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

hashCodeと equals メソッドを実装することはほぼ同じです。

しかし、ドキュメントとstackoverflowのいくつかの回答では、少し遅いと言われています。

メソッドequalsまたはhashCode本番コードで使用することはめったになく、デバッグ プロセスでのみ使用し、本番環境では使用toStringしないため、質問は次のとおりです。それはまだパフォーマンスのペナルティですか?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

クラスが不変であるか、hashCode および toString に使用されるフィールドが変更されない場合、hashCode および toString の結果をキャッシュできます。そのため、遅いリフレクティブ コードは 1 回だけ呼び出されます。これにより、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 に答える
0

「Caliper」を使用してマイクロベンチマーク テストを行うことをお勧めします。ただし、ToStringBuilder を除いて、私は を使用せずEqualsBuilderHashCodeBuilder代わりに IDE によって生成されたものを使用します。

その理由は、Equals と HashCode がアプリケーション全体で定期的に使用される傾向があり、IDE が適切な実装を生成するからです。

一方、私はToStringBuilder一般的にtoStringをデバッグに使用するため、使用します。

于 2013-07-30T15:09:34.377 に答える
0

パフォーマンスへの影響に関しては、常に自分で測定することをお勧めします。それがあなたのシステムにどのように影響するかは誰にもわかりません。equals と hashCode をほとんど使用していませんか? これらは、たとえば、非常に一般的な構造である Map および Set でも使用されます。

于 2013-07-30T14:22:33.530 に答える