-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
해결됨
섹션 7. 직접 구현하는 Set3
24.05.15 15:04 작성 조회수 104
0
여기에서 hashCode의 값이 선생님과 다르게 출력되는데 잘못된 게 맞나요?
문자 고유의 값이니까 같은 문자라면 어느 컴퓨터나 같은 hashCode가 출력되야 하는 게 맞는거죠??
public class MyHashSetV2Main2 {
public static void main(String[] args) {
Member hi = new Member("hi");
Member jpa = new Member("JPA"); // 대문자 주의!
Member java = new Member("java");
Member spring = new Member("spring");
System.out.println("hi.hashCode() = " + hi.hashCode());
System.out.println("jpa.hashCode() = " + jpa.hashCode());
System.out.println("java.hashCode() = " + java.hashCode());
System.out.println("spring.hashCode() = " + spring.hashCode());
MyHashSetV2 set = new MyHashSetV2(10);
set.add(hi); // Member 타입의 인스턴스를 myHashSetV2에 넣음.
set.add(jpa);
set.add(java);
set.add(spring);
System.out.println("set = " + set);
//검색
Member searchValue = new Member("JPA");
boolean result = set.contains(searchValue);
System.out.println("hi.contains(" + searchValue + ") = " + result);
}
//출력 결과
hi.hashCode() = 3329
jpa.hashCode() = 73659
java.hashCode() = 3254818
spring.hashCode() = -895679987
답변을 작성해보세요.
1
권정익
질문자2024.05.16
import collection.set.member.Member;
public class MyHashSetV2Main2 {
public static void main(String[] args) {
MyHashSetV2 set = new MyHashSetV2(10);
Member hi = new Member("hi");
Member jpa = new Member("JPA"); // 대문자 주의!
Member java = new Member("java");
Member spring = new Member("spring");
System.out.println("hi.hashCode() = " + hi.hashCode());
System.out.println("jpa.hashCode() = " + jpa.hashCode());
System.out.println("java.hashCode() = " + java.hashCode());
System.out.println("spring.hashCode() = " + spring.hashCode());
set.add(hi); // Member 타입의 인스턴스를 myHashSetV2에 넣음.
set.add(jpa);
set.add(java);
set.add(spring);
System.out.println("set = " + set);
//검색
Member searchValue = new Member("JPA");
boolean result = set.contains(searchValue);
System.out.println("hi.contains(" + searchValue + ") = " + result);
}
}
import java.util.Objects;
public class Member {
private final String id;
public Member(String id) {
this.id = id;
}
public String getId() {
return id;
}
@Override
public boolean equals(Object object) {
if (this == object) return true;
if (object == null || getClass() != object.getClass()) return false;
Member member = (Member) object;
return Objects.equals(id, member.id);
}
@Override
public int hashCode() {
return Objects.hashCode(id);
}
}
import java.util.Arrays;
import java.util.LinkedList;
public class MyHashSetV2 {
static final int DEFAULT_INITIAL_CAPACITY = 16;
private LinkedList<Object>[] buckets;
private int size;
private int capacity = DEFAULT_INITIAL_CAPACITY;
public MyHashSetV2() {
initBuckets();
}
public MyHashSetV2(int capacity) {
this.capacity = capacity;
initBuckets();
}
private void initBuckets() {
buckets = new LinkedList[capacity];
for (int i = 0; i < capacity; i++) {
buckets[i] = new LinkedList<>();
}
}
public boolean add(Object value) {
LinkedList<Object> bucket = buckets[hashIndex(value)];
if (bucket.contains(value)) {
return false;
}
bucket.add(value);
size++;
return true;
}
public boolean remove(Object value) {
LinkedList<Object> bucket = buckets[hashIndex(value)];
boolean removeResult = bucket.remove(value);
if (removeResult) {
size--;
return true;
}
return false;
}
public boolean contains(Object value) {
int hashIndex = hashIndex(value);
LinkedList<Object> bucket = buckets[hashIndex];
return bucket.contains(value);
}
private int hashIndex(Object value) {
return Math.abs(value.hashCode()) % capacity;
}
public int getSize() {
return size;
}
@Override
public String toString() {
return "MyHashSetV2{" +
"buckets=" + Arrays.toString(buckets) +
", size=" + size +
", capacity=" + capacity +
'}';
}
}
Member 클래스에 hashCode 오버라이딩도 새로 해봤는데 다르게 나옵니다 ㅠㅠ
OMG
2024.05.16
Member클래스의 재정의한 hashCode() 의 구현 코드를 보면
@Override public int hashCode() { return Objects.hashCode(id); }
return Objects.hashCode
()로 되어있습니다.
return Objects.hash
()로(=강의코드) 확인해보시겠어요?
OMG
2024.05.16
답변 1