왜 다시 쓰는 equals 방법 꼭 다시 쓰는 hashcode 방법
왜 다시 쓰는 equals 방법 꼭 다시 쓰는 hashcode 방법
HashSet,hashcoede(), equals() 간의 관계
왜 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에 추가할 수 있습니다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.