LoginSignup
1
0

More than 5 years have passed since last update.

[Java]HashCodeとequalsのオーバーライド

Last updated at Posted at 2018-10-09

1、ObjectのHashCode()とequals()
image.png
image.png
上記のように、
equals()はobjのアドレスを比較している。
hashCode()はnative側で計算している。つまりC/C++側で計算している。

そなると==の比較にするとfalseになる。
image.png

2、StringのHashCode()とequals()
Stringはobjectを継承している。
image.png

StringはHashCode()とequals()をオーバーライドしている。
image.png

image.png
上記equals
1、同じアドレスのobjectなら、true
2、比較文字列のクラスはStringでないなら、false
3、比較文字列のクラスの長さは同じではないなら、false
4、ループで比較、間違いなら、false
5、ループ完了したら、true

3、自前でHashCode()とequals()

private static class Person {
    int age;
    String name;

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

    public String toString() {
        return name + " - " +age;
    }

    /**
     * @desc
     */
    @Override
    public boolean equals(Object obj){
        if(obj == null){
            return false;
        }

        if(this == obj){
            return true;
        }

        if(this.getClass() != obj.getClass()){
            return false;
        }

        Person person = (Person)obj;
        return name.equals(person.name) && age==person.age;
    }

    @Override
    public int hashCode() {
        return this.name.hashCode();
    }
}

サンプルコード
https://github.com/YanHengGo/java/tree/master/04_hashcode

1
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0