equals () 를 다시 쓸 때hashCode () 를 다시 써야 합니다.

3308 단어
클래스의 equals () 를 다시 쓰는 동시에, 클래스의 대상이 HashSet,HashTable,HashMap에 들어가지 않는 한,hashCode () 를 다시 써야 합니다.
그럼 왜 해시코드()를 다시 쓰는 거죠?주로hash표에 중복된 대상이 들어가지 않도록 하여 성능을 높이기 위한 것이다.그런데 왜 해시코드()를 다시 쓰면 이 정도는 할 수 있는 거죠?다음은 코드로 분석합니다.
<strong> /**Strudent equals hashCode, 。 
        hashCode() :0 。 
    */  
    public class Student {  
        public Student(String no) {  
            this.no = no;  
        }  
        // 0  
        @Override  
        public int hashCode() {  
            System.out.println("call hashcode");  
            return 0;  
        }  
      
        //  equals   
        @Override  
        public boolean equals(Object obj) {  
            System.out.println("call equals");  
            if (this == obj)  
                return true;  
            if (getClass() != obj.getClass())  
                return false;  
            Student other = (Student) obj;  
            if (no == null) {  
                if (other.no != null)  
                    return false;  
            } else if (!no.equals(other.no))  
                return false;  
            return true;  
        }  
      
        //  ,   
        private String no;  
        private String name;  
      
        public String getNo() {  
            return no;  
        }  
      
        public void setNo(String no) {  
            this.no = no;  
        }  
      
        public String getName() {  
            return name;  
        }  
      
        public void setName(String name) {  
            this.name = name;  
        }  
    }  
</strong>
<strong>  public class Main {  
        public static void main(String[] args) {  
            Set<Student> set = new HashSet<Student>();  
            set.add(new Student("1"));  
            System.out.println("----------");  
            set.add(new Student("2"));  
            System.out.println("----------");  
            set.add(new Student("3"));  
            System.out.println("----------");  
            System.out.println(set.size());  
        }  
    }  </strong>

출력 결과를 살펴보겠습니다.
<strong>    call hashcode  
    ----------  
    call hashcode  
    call equals  
    ----------  
    call hashcode  
    call equals  
    call equals  
    ----------  
    3  </strong>

보이시나요?허허, 매번 Set에 add(object)를 넣을 때마다hashCode()를 호출하고hash코드가 set 안의 어떤object의hash코드와 같지 않으면 set에 직접 넣는다.그렇지 않으면 equals(object)를 호출합니다. set의 어떤 object와 같을 경우 (즉hashCode와 같고 equals가true로 되돌아올 경우) set를 넣지 않고 set을 넣지 않으면 set을 넣습니다.
<strong> // hashCode。  
    @Override  
    public int hashCode() {  
        System.out.println("call hashcode");  
        return no.hashCode();  
    }  
</strong>

다시 한 번 실행하면 결과는 다음과 같습니다.
<strong> call hashcode  
    ----------  
    call hashcode  
    ----------  
    call hashcode  
    ----------  
    3  </strong>

즉, 학호가 다르고(각 object의hashCode가 다르다) 직접 Set에 넣고 equals를 실행하지 않았다는 것이다.총괄: equals를 다시 쓸 때 보통hashCode를 다시 쓰고 서로 다른 object의hashCode가 다르다는 것을 최대한 보장하여hash의 성능을 향상시킨다.

좋은 웹페이지 즐겨찾기