thisとtoString/equals/hashCode
thisで現在のオブジェクトを参照し、役立つtoStringを記述し、equalsとhashCodeを正しく実装します。
「thisとtoString/equals/hashCode」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全3レッスンが含まれています。
this キーワード
this は現在のオブジェクトを指します。フィールドへのアクセスや、別のコンストラクタの呼び出しに使います。引数名とフィールド名が同じ場合にも役立ち、意図を明確にできます。
読みやすい toString
toString() は、オブジェクトの内容を人間が読みやすく要約して返します。id や name などの主要なフィールドを表示するようにオーバーライドします。ログやデバッグ出力が、はるかに理解しやすくなります。
equals と ==
equals は論理的な等価性を確認し、== は 2 つの参照が同じオブジェクトを指しているかを確認します。多くのドメインクラスでは、メモリアドレスではなく内容で比較するように equals をオーバーライドします。
hashCode は equals と一致させる
hashCode は equals と一貫していなければなりません。a.equals(b) が true なら、a.hashCode() は b.hashCode() と等しくなる必要があります。この規則は、HashSet と HashMap を正しく動作させるために必要です。
ヒントと注意点
等価性には、id や email のように変化しないフィールドを選び、toString は短く保ちます。equals や hashCode の中で可変コレクションを使うのは避けてください。迷ったときは、IDE でメソッドを生成してから内容を確認します。
コード:this、equals、hashCode
このデモでは、同じ内容を持つ 2 つの人物オブジェクトを作成します。equals は true を返し、ハッシュコードは一致し、HashSet は 2 つ目のオブジェクトを見つけられます。
public class Main {
// Simple Person class to demo this, toString, equals, hashCode
static class Person {
private int id;
private String name;
// Constructor uses this to set fields
Person(int id, String name) {
this.id = id; // this.id refers to the field
this.name = name; // name comes from the parameter
}
// Human friendly string
@Override
public String toString() {
return "Person{id=" + id + ", name=" + name + "}";
}
// Logical equality: same id and same name
@Override
public boolean equals(Object o) {
if (this == o) return true; // same reference
if (o == null || getClass() != o.getClass()) return false;
Person other = (Person) o;
if (this.id != other.id) return false;
// Compare names safely (null aware)
if (this.name == null) return other.name == null;
return this.name.equals(other.name);
}
// Hash code consistent with equals
@Override
public int hashCode() {
int result = Integer.hashCode(id);
result = 31 * result + (name == null ? 0 : name.hashCode());
return result;
}
}
public static void main(String[] args) {
// Create two persons with the same content
Person a = new Person(1, "Ada");
Person b = new Person(1, "Ada");
// toString shows readable info
System.out.println(a);
// equals compares content, not memory address
System.out.println("a == b ? " + (a == b)); // false (different objects)
System.out.println("a.equals(b) ? " + a.equals(b)); // true (same content)
// hashCode must match for equal objects (useful in hash collections)
System.out.println("hash(a) = " + a.hashCode());
System.out.println("hash(b) = " + b.hashCode());
// Example with HashSet: contains works because equals and hashCode agree
java.util.Set<Person> set = new java.util.HashSet<>();
set.add(a);
System.out.println("set contains b ? " + set.contains(b)); // true
}
}
契約の確認
確認問題:equals をオーバーライドした場合、ほかに何をすべきですか。また、それはなぜですか。
まとめ
まとめ:this はフィールドへのアクセスを明確にし、toString はデバッグに役立ち、equals は内容を比較し、hashCode はコレクションの一貫性を保ちます。
よくある質問
「thisとtoString/equals/hashCode」レッスンは無料ですか?
はい。「thisとtoString/equals/hashCode」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全3レッスンが含まれています。
「thisとtoString/equals/hashCode」で何を学びますか?
thisで現在のオブジェクトを参照し、役立つtoStringを記述し、equalsとhashCodeを正しく実装します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。
「thisとtoString/equals/hashCode」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- thisとtoString/equals/hashCode
- オブジェクトのコンポジション
- ドメインのモデル化(UML→コード)