>  기사  >  Java  >  같음과 해시코드

같음과 해시코드

(*-*)浩
(*-*)浩앞으로
2019-08-24 15:53:482414검색

equals 및 해시 코드 요약:

같음과 해시코드

equals 메서드는 재정의되지 않습니다. 그렇다면 객체의 메모리 주소 참조가 주소인지 여부를 확인하는 데 사용됩니다. 다시 작성한 후 일반적으로 개체의 내용이 동일한지 비교하는 데 사용됩니다(예: 학생 개체에 이름과 나이가 포함되어 있음). 이름과 나이가 같은 한 동일한지 판단하기 위해 같음 메서드를 다시 작성합니다. 학생)으로 간주됩니다.

hashCode는 객체의 주소나 문자열 또는 숫자를 기반으로 jdk에서 계산한 int 유형 값입니다. 물론 해시코드 메서드는 컬렉션에서만 사용됩니다.

객체를 집합에 넣을 때 먼저 해시코드가 동일한지 확인한 다음, 동일한지 여부를 확인하면 동일한 객체일 수 있습니다. 넣지만 세트는 중복을 허용하지 않으므로 넣지 않습니다.

예:

public class Student {
        private int age;
        private String name; 
        public Student(int age ,String name){
            this.age = age;
            this.name = name;
        }
        public int getAge() {
           return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public String getName() {
           return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        //重写equals方法,判断姓名和年龄相同就是相等的
        public boolean equals(Object o){
            if(o == null){
                return false;
            }
            if(this.getClass() != o.getClass()){
             return false;   
            }
            Student student = (Student)o;
            if(name == null){
                return false;
            }
            if(age==student.getAge()&&name.equals(student.getName())){
                return true;
            }
            return false;
        }       
    public static void main(String[] args) {
        Student studentOne = new Student(1,"yjc");
        Student studentTwo = new Student(1,new String("yjc"));
        System.out.println(studentOne.equals(studentTwo));
        System.out.println("1: "+studentOne.getName().hashCode());
        System.out.println("2: "+studentTwo.getName().hashCode());
    }
    //输出结果:true
                1: 119666
                2: 119666
}

위에서 볼 수 있듯이 두 문자열은 직접 "yjc"이든 새 문자열이든 "yjc"라고 합니다. ("yjc" ), 해시코드는 동일합니다. 따라서 hashcode 메서드를 재정의할 때 이를 사용할 수 있습니다.

예를 들어, 이름과 나이가 동일하다면 동일자뿐만 아니라 해시 코드도 동일해야 합니다. 해시 코드를 다음과 같이 다시 작성할 수 있습니다.

public int hashcode(){
    final int prime = 31; 
    int result = 1;    
    result = prime*result + age;    
    result = prime*result + (name == null? 0 : name.hashcode());   
    return result;//直接写age+(name == null? 0 : name.hashcode())也行就是感觉太简单了0.0
}

이렇게 하면 같은 나이의 두 이름과 Student 객체는 동일한 객체이며 세트에 배치될 때 동일한 객체로 간주됩니다. 이러한 객체가 아무리 많이 배치되어도 set.size()는 항상 동일하게 간주됩니다. 1과 같아야 합니다.

마찬가지로 HashMap 키도 고유합니다. HashMap 객체는 해당 Key의 hashCode에 따라 저장 위치를 ​​찾고 해당 Value를 얻기 위해 equals(key)를 사용하므로 해당 값이 맞는지 여부를 판단합니다. 키는 넣을 때 재사용됩니다. 해시 코드와 같음의 경우 반복되면 덮어쓰게 됩니다.

위 내용은 같음과 해시코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제