💨

【Java】equalsとhashCodeメソッドをオーバーライドしないといけない例

2025/01/22に公開

PersonクラスにequalsとhashCodeメソッドをオーバーライドしていない場合

package practiceAdd.person;

public class Person {
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
}
package practiceAdd.person;

import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        HashSet<Person> people = new HashSet<>();
        people.add(new Person("鈴木原", 25));
        people.add(new Person("鈴木原", 25));

        // HashSetは重複したデータは登録されないので1になるはずだが、2と表示される
        System.out.println(people.size());
    }
}

実行結果
期待した結果にならないですね・・・

PersonクラスにequalsとhashCodeをオーバーライドの記述を行う

package practiceAdd.person;

import java.util.Objects;

public class Person {
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public int hashCode() {
		return Objects.hash(age, name);
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		return age == other.age && Objects.equals(name, other.name);
	}
}

※Eclipseの場合、右クリック→[ソース]→[hashCode()およびequals()の生成]から記述することも出来ます!

実行結果
期待した結果になりました!

Udemyで講座を公開中!
https://zenn.dev/codek2/articles/e9e44f3e0023fb

X(旧Twitter)
https://twitter.com/kunchan2_

Zenn 本
https://zenn.dev/codek2?tab=books

Youtube
https://www.youtube.com/@codek2_studio

Discussion