HashSet 탈 중 원리

5239 단어 자바 집합
HashSet 탈 중 원리
우선 HashSet 의 특징 을 말씀 드 리 겠 습 니 다.
  • 그것 은 무질서 하 다. 즉, 추 가 된 순서 와 옮 겨 다 니 는 순서 가 다르다
  • .
  • 그 안에 중복 요소 가 허용 되 지 않 는 것 은 HashMap 을 바탕 으로 이 루어 진 것 이기 때문이다
  • Set 인 터 페 이 스 를 실 현 했 고 해시 표 (실제 HashMap 인 스 턴 스) 가 지원 합 니 다
  • 바 텀 데이터 구 조 는 해시 표
  • 이다.
    그것 은 어떻게 원소 의 유일 성 을 보증 합 니까?
    정 답 은 두 가지 방법 에 의존 하 는 것 이다. hashCode () 와 equals () 방법 이다.
    만약 에 우리 가 집합 이 중복 되 는 기능 이 있 기 를 원한 다 면 그의 add 방법 에서 추가 할 대상 이 집합 에 존재 하 는 지 확인 할 수 있 습 니 다. 교체 집합 에서 모든 요 소 는 추가 할 것 과 비교 할 수 있 습 니 다. 만약 에 같 으 면 존재 하지 않 습 니 다. 그래서 우 리 는 add () 방법의 부분 소스 코드 해석 을 살 펴 보 겠 습 니 다. 소스 코드 가 너무 길 기 때문에 저 는 작은 부분 을 캡 처 해서 중요 한 것 을 나 오 겠 습 니 다!
    private static final Object PRESENT = new Object();
    private transient HashMap map;    
    public boolean add(E e) { 
                return map.put(e, PRESENT)==null;
    }    
    ......
    if (e.hash == hash && ((k = e.key) == key || key.equals(k))){
    ......//e.hash   hashCode()     e   hash 
    }

    원본 코드 에서 알 수 있 듯 이 add () 방법 은 실제 적 으로 HashMap 의 put () 방법 을 호출 하여 HashSet 에 추가 할 요 소 를 key 로 저장 하고 value 는 고정 값: Object 클래스 대상 입 니 다.먼저 hashCode () 방법 으로 들 어 오 는 요소 의 해시 값 을 얻 고 집합 에서 해시 값 이 같은 요 소 를 포함 하 는 지 찾 습 니 다. 같 으 면 주소 값 을 계속 비교 합 니 다. 일반 주소 값 은 다 르 기 때문에 마지막 으로 equals () 방법 으로 대상 내의 속성 값 을 비교 합 니 다.비교 결 과 는 모두 false 로 저장 되 며, 비교 결과 에 true 가 있 으 면 저장 되 지 않 습 니 다.
    어떻게 사용자 정의 클래스 대상 을 HashSet 에 저장 하여 무 게 를 줄 입 니까?
  • 클래스 에 hashCode () 방법 과 equals () 방법
  • 을 다시 써 야 합 니 다.
  • equals () 방법 중 모든 속성 비교
  • hashCode () 방법 은 속성 이 같은 대상 의 반환 값 이 같 고 속성 이 다른 대상 은 가능 한 한 다 르 며 대상 의 구성원 변수 값 이 같 으 면 같은 요소
  • 이다.
    저 는 Student 류 를 사용 하여 설명 을 했 습 니 다. 클래스 에 name 과 age 속성 이 있 습 니 다. > 재 작성 후의 hashCode () 방법: @Override
    public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + age;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
    }
    가능 한 한 서로 다른 대상 의 해시 값 을 다 르 게 해 야 합 니 다. equals () 방법 으로 일련의 판단 을 하 는 전 제 는 해시 값 이 같은 토대 에서 이 루어 져 야 하기 때 문 입 니 다. 해시 값 이 다 르 면 이 요 소 를 직접 추가 해 야 합 니 다.후속 적 인 판단 을 하지 않 아 도 된다. 그러면 많은 자원 을 절약 할 수 있다.그럼 어떻게 hash 값 이 가능 한 한 다 르 게 보장 합 니까?재 작성 후의 hashCode () 방법 을 통 해 알 수 있 듯 이 구성원 변수의 값 은 해시 값 에 영향 을 주 었 기 때문에 우 리 는 구성원 변수의 값 과 해시 값 을 일련의 연산 을 하고 변경 한 후에 추가 하면 된다. 예 를 들 어 우 리 는 그것들 을 정수 재 작성 후의 equals () 방법 을 곱 할 수 있다.
    @Override
        public boolean equals(Object obj) {
            if (this == obj)     //                   
              return true;     //      ,       ,    true
            if (obj == null)       //           
              return false; //     false,      ,  Set   null 
            if (getClass() != obj.getClass())//            
              return false;//               ,     false
            Student other = (Student) obj;    //           
            if (age != other.age)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }

    HashSet 제거 원리 요약:
    A: HashSet 바 텀 데이터 구 조 는 해시 표 (하나의 요소 가 링크 인 배열) B: 해시 표 바 텀 의존 두 가지 방법: hashCode () 와 equals ()
        :
                   
              :    equals()  
                     true:     ,   
                     false:          
              :           

    C: 요소 의 유일 성 은 hashCode () 와 equals () 에 의 해 보장 되 며 둘 중 하나 가 없어 서 는 안 됩 니 다.

    좋은 웹페이지 즐겨찾기