남궁성님의 자바의 정석 기초편을 보면서 혼자 공부하는 공간입니다. 참고 부탁드립니다.
hashCode()
- 객체의 해시코드(hash code)를 반환하는 메서드
- Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
public class Object {
...
public native int hashCode(); // 네이티브메서드 : os의 메서드(c언어) (내용이 없는 이유는 이미 작성되어 있는 메서드를 호출하기 때문)
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.hashCode()); // 96354
System.out.println(str2.hashCode()); // 96354
- equals()를 오버라이딩하면, hashCode()도 오버라이딩 해야한다. ( equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문)
- System.identityHashCode(Object obj)는 Object클래스의 hashCode()와 동일
System.out.println(System.identityHashCode(str1)); // 3526198
System.out.println(System.identityHashCode(str2)): // 7699183
toString() / toString()의 오버라이딩
- 객체를 문자열(String)으로 변환하기 위한 메서드
// Object클래스의 toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
import java.util.Objects;
class Card {
String kind;
int number;
Card(){
this("SPADE",1);
}
Card(String kind, int number){
this.kind = kind;
this.number = number;
}
//Object 클래스의 toString()을 오버라이딩
public String toString() {
return "kind : " + kind + ", number : " + number;
}
//equals()를 오버라이딩하면 hashCode()도 오버라이딩 해야한다.
public int hashCode() {
return Objects.hash(kind, number);
}
public boolean equals(Object obj) {
if(!(obj instanceof Card))
return false;
Card c = (Card)obj; //
return this.kind.equals(c.kind)&&this.number ==c.number;
// == 안쓰고 equals 사용 이유는 kind가 String 이기 때문
}
}
class Ex9_4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Card c1 = new Card();
Card c2 = new Card();
System.out.println(c1.equals(c2));
System.out.println(c1.toString());
System.out.println(c2.toString());
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
}
}
|
cs |
출력
true
kind : SPADE, number : 1
kind : SPADE, number : 1
-1842861219
-1842861219
댓글