JAVA hash Code() 덮어쓰기

17826 단어 hashcodeJava

equals () 를 다시 쓰더라도 HashSet은remove () 할 수 없습니다



사이트 축소판 그림

hashCode 덮어쓰기()


▪️Test54.java
import java.util.*;

public class Test54 {
    public static void main(String[] args) {
        Set<Hero54> list = new HashSet<Hero54>();
        Hero54 h1 = new Hero54();
        h1.name = "ミナト";
        list.add(h1);
        System.out.println("要素数=" + list.size());
        h1 = new Hero54();
        h1.name = "ミナト";
        list.remove(h1);
        System.out.println("要素数=" + list.size());
    }

}
▪️Hero54.java
import java.util.*;

public class Hero54 {

    private int hp;
    public String name;

    public boolean equals(Object o) {
        if (o == this)
            return true;
        if (o == null)
            return false;
        if (!(o instanceof Hero54))
            return false;
        Hero54 r = (Hero54) o;
        if (!this.name.trim().equals(r.name.trim())) {
            return false;
        }
        return true;

    }

    public int hashCode() {
        int result = 37;
        result = result * 31 + name.hashCode();
        result = result * 31 + hp;
        return result;
    }
}
▪️Test54.java 실행 결과
요소 = 1
요소 수 = 0

hashCode()를 덮어쓰기 전에


▪️Hero54.java
import java.util.*;

public class Hero54 {

    private int hp;
    public String name;

    public boolean equals(Object o) {
        if (o == this)
            return true;
        if (o == null)
            return false;
        if (!(o instanceof Hero54))
            return false;
        Hero54 r = (Hero54) o;
        if (!this.name.trim().equals(r.name.trim())) {
            return false;
        }
        return true;
    }
}
▪️Test54.java 실행 결과
요소 = 1
요소 = 1
hashSet 표시
• 중복 허용 안 함
• 기본적으로 순서 관계가 없다

hashCode()의 덮어쓰기 예 ②


▪️Test55.java hashCode()의 덮어쓰기 예 ②
import java.util.*;

public class Test55 {
    public static void main(String[] args) {
        Set<Cat55> cat = new HashSet<Cat55>();
        Cat55 c1 = new Cat55();
        c1.name = "ねこ";
        Cat55 c2 = new Cat55();
        c2.name = "ねこ2";
        Cat55 c3 = new Cat55();
        c3.name = "ねこ3";
        cat.add(c1);
        cat.add(c2);
        cat.add(c3);
        System.out.println(c1);
        System.out.println(cat.size());
        cat.remove(c2);
        System.out.println(cat.size());

    }

}
▪️Cat55.java hashCode()의 덮어쓰기 예 ②
public class Cat55 {
    private int cp;
    public String name;

    public boolean equals(Object o) {
        if (o == this)
            return true;
        if (o == null)
            return false;
        if (!(o instanceof Cat55))
            return false;
        Cat55 f = (Cat55) o;
        if (!this.name.trim().equals(f.name.trim())) {
            return false;
        }
        return true;
    }

    public int hashCode() {
        int catResult = 13;
        catResult = catResult * 31 + name.hashCode();
        catResult = catResult * 31 + cp;
        return catResult;
    }

}
즉 "hashCode는 equals가 정말 똑같다고 일치된 견해를 가지고 있다"고 말했다.해시코드가 일치하지 않으면 원래 equals는 평가를 받지 않는다.
▪️Test55.java hashCode () 의 재작성 예시 ② 실행 결과
Cat55@bbd407
3
2
▪️보태다
Cat55.java
public class Cat55 {
    public int cp;
    public String name;

    public boolean equals(Object o) {
        if (this.name == o) {
            return true;
        }
        return false;
    }

    public int hashCode() {
        int catResult = 13;
        catResult = catResult * 31 + name.hashCode();
        catResult = catResult * 31 + cp;
        return catResult;
    }

}
결과도 마찬가지다

좋은 웹페이지 즐겨찾기