HashSet 탈 중 원리
5239 단어 자바 집합
우선 HashSet 의 특징 을 말씀 드 리 겠 습 니 다.
그것 은 어떻게 원소 의 유일 성 을 보증 합 니까?
정 답 은 두 가지 방법 에 의존 하 는 것 이다. 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 에 저장 하여 무 게 를 줄 입 니까?
저 는 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 () 에 의 해 보장 되 며 둘 중 하나 가 없어 서 는 안 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Spring 자동 조립 이해현재 이 클래스 는 @ Repository 표지 가 있 고 내부 에 @ Autowired 가 있 습 니 다. 이 클래스 가 구성 요소 에 스 캔 되면 spring 은 자동 으로 bean 을 생 성하 고 dbAcess...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.