왜 다시 쓰는 equals 방법 꼭 다시 쓰는 hashcode 방법

3801 단어

왜 다시 쓰는 equals 방법 꼭 다시 쓰는 hashcode 방법

  • equals()는 JDK에 정의된 Object입니다.자바에서.두 대상의 주소가 동일한지 판단(즉, 동일한 대상인지 여부)을 통해 동일한지 여부를 구분한다
  • hashCode()의 역할은 산열 코드를 얻는 것이다
  • HashTable를 사용하지 않으면 "hashCode()와 equals()는 상관없습니다!

  • HashSet,hashcoede(), equals() 간의 관계
  • 산열표를 사용할 때 "hashCode()와 equals()"는 관계가 있습니다!예를 들어 Hashset의 삽입에 대한 판단 순서는 다음과 같다. 먼저 hashcode를 판단하고 같지 않으면 삽입한다.동일하면 equals가true인지 계속 비교하고true라면 두 대상이 같아 삽입할 수 없음을 나타낸다.false이면 다른 위치로 흩어집니다.
  • 두 대상은 같고 equals는true
  • 두 대상이 같고hashcode는 반드시 같다(속성에 따라 계산하면 같은 대상의 속성은 반드시 같다)
  • equals는true,hashcode로 동일
  • 동일한hashcode, 대상이 반드시 같지 않음(equals가true일 수 없음)
  • 요약:
  • equals=true="hashcode()는 같고 반대로 안 된다
  • 산 목록을 사용하고 equals 방법을 다시 쓰려면hashcode () 방법을 다시 써서 같은 대상이HashSet에 동시에 가입하지 못하도록 해야 한다.

  • 왜 equals 방법을 다시 쓰는 데 반드시hashcode 방법을 다시 써야 합니까?
    먼저 String류를 다시 쓰는 이 두 가지 방법을 보세요.
    public boolean equals(Object anObject) {
    		// 、 
            if (this == anObject) {
                return true;
            }
            // String 
            if (anObject instanceof String) {
            	// 
                String anotherString = (String)anObject;
                int n = value.length;
                if (n == anotherString.value.length) {
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }
    
    
    public int hashCode() {
    		// hash 
            int h = hash;
            if (h == 0 && value.length > 0) {
                char val[] = value;
    
                for (int i = 0; i < value.length; i++) {
                    h = 31 * h + val[i];
                }
                hash = h;
            }
            return h;
        }
    

    현재 자신이 쓴 클래스 (id와name가 같으면 같은 대상으로 간주됨) 1, 자동 생성자 두 가지 방법으로 기본적으로 생성된 책 클래스의 모든 파라미터를 비교하고 해시 연산을 진행합니다.
    class Book1 {
        int id;
        String name;
        String author;
        double price;
     @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Book1 book1 = (Book1) o;
            return id == book1.id &&
                    Double.compare(book1.price, price) == 0 &&
                    Objects.equals(name, book1.name) &&
                    Objects.equals(author, book1.author);
        }
    
        @Override
        public int hashCode() {
    
            return Objects.hash(id, name, author, price);
        }
    }
    

    2. 디와name가 같으면 같은 책, 즉 같은 대상으로 간주하고 같은 대상은 산 목록에 추가할 수 없다. id와name만 비교하고 다음과 같이 고친다.
    
        /**
         *  equals id name
         * @param o
         * @return
         */
        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || getClass() != o.getClass()) {
                return false;
            }
            Book1 book1 = (Book1) o;
            return id == book1.id && Objects.equals(name, book1.name);
        }
    
        /**
         *  equals hashcode  set hashcode , equals
         *  hashcode   equals     set 
         * @return
         */
        @Override
        public int hashCode() {
    
            return Objects.hash(id, name);
        }
    
    

    equals 방법인hashcode 방법만 바꾸면 기본적으로 네 개의 매개 변수의 해시 연산을 하고 계산된 두 대상의 id와name가 같으면 author나price가 다르면 다른hashcode를 계산합니다.이렇게 하면 우리가 정의한 두 개의 같은 대상이hashset에 성공적으로 가입할 수 있어 원칙에 어긋나기 때문에 이 두 가지 방법을 동시에 덮어써야 한다.
     Book1 b1 = new Book1(1, "hh", "zs", 122.0);
     Book1 b2 = new Book1(1, "hh", "zh", 112.0);
    

    이 두 대상은 하나만HashSet에 추가할 수 있습니다

    좋은 웹페이지 즐겨찾기