[解決済み] JavaでequalsとhashCodeをオーバーライドする際に考慮すべき事項は?
質問
オーバーライドする際の問題点・落とし穴は?
equals
と
hashCode
?
解決方法は?
理論(言語弁護士と数学に興味のある人向け)。
equals()
(
ジャバドック
) は、同値関係を定義しなければなりません (それは必ず
反射的
,
シンメトリック
および
推移的
). さらに、以下の条件を満たす必要があります。
一貫性
(オブジェクトが変更されなければ、同じ値を返し続けなければならない)。さらに
o.equals(null)
は常にfalseを返さなければならない。
hashCode()
(
ジャバドック
) も必要です。
一貫性
(の観点からオブジェクトが変更されない場合)。
equals()
の場合、同じ値を返し続けなければならない)。
は リレーション の2つのメソッドの間にある。
いつ
a.equals(b)
であればa.hashCode()
と同じでなければなりません。b.hashCode()
.
実際に使ってみると
片方をオーバーライドしたら、もう片方もオーバーライドしてください。
を計算するために使用するフィールドのセットと同じものを使用します。
equals()
を計算するために
hashCode()
.
優れたヘルパークラスを使用する EqualsBuilder と HashCodeBuilder から アパッチコモンズラング ライブラリを使用します。一例です。
public class Person {
private String name;
private int age;
// ...
@Override
public int hashCode() {
return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
// if deriving: appendSuper(super.hashCode()).
append(name).
append(age).
toHashCode();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Person))
return false;
if (obj == this)
return true;
Person rhs = (Person) obj;
return new EqualsBuilder().
// if deriving: appendSuper(super.equals(obj)).
append(name, rhs.name).
append(age, rhs.age).
isEquals();
}
}
また、覚えておいてください。
ハッシュベースの コレクション または 地図 というように ハッシュセット , LinkedHashSet , ハッシュマップ , ハッシュテーブル または ウィークハッシュマップ コレクションに入れたキーオブジェクトのhashCode()が、そのオブジェクトがコレクションにある間は決して変化しないことを確認します。これを確実にする方法は、キーをイミュータブルにすることです。 これには他の利点もあります。 .
関連
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
[オリジナル】java学習ノート【II】よくあるエラー クラスパス上のクラスファイルが見つからない、またはアクセスできない場合
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] なぜJavaのVector(およびStack)クラスは時代遅れ、または非推奨とされているのですか?
-
[解決済み] JavaでequalsとhashCodeのメソッドをオーバーライドする必要があるのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
IllegalArgumentException この例外を解決する方法
-
Spring Boot による HTTPS アクセスの設定
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
JDKの設定時にjava.dllが見つからない、java SE Runtime Environmentが見つからない問題が発生しました。
-
JQuery DataTable 详解
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
自動配線された依存性のインジェクションに失敗しました。
-
mavenプロジェクトのテストエラー java.lang.ClassNotFoundException: org.glassfish.jersey.client.ClientConfig の問題を解決する。