int i = 1;
String s = new String("a");
i ⇒ 1
s ⇒ vo.HashCode_Vo@5b46881
String s1 = new String("a");
String s2 = new String("a");
s1 != s2
s1 과 s2는 각각 별개의 객체로 생성되어 주소값이 다르기 때문에 == 비교가 불가능하다.
하지만
String s1 = "a"
String s2 = "a"
s1 == s2
이렇게 객체를 생성하는 경우 객체를 생성 시 JAVA 내부에서 같은 값이 있는지 확인 후
동일한 주소를 참조하게 만든다 그러니 같은 주소값을 비교하는 형태라 True가 나오게 된다.
System.out.println("객체를 == 비교 " +(s1 == s2));
System.out.println("객체를 equals 비교 " +(s1.equals(s2)));
현재 For_Equals_And_HashCode_Vo
객체 내부에 equals 가 오버라이딩 안되어있어 생기는 문제.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
For_Equals_And_HashCode_Vo that = (For_Equals_And_HashCode_Vo) o;
return
Objects.equals(str1, that.str1)
&& Objects.equals(str2, that.str2)
&& Objects.equals(str3, that.str3);
}
@Override
public int hashCode() {
return Objects.hash(str1, str2, str3);
}
-- Objects . class
public static int hash(Object... values) {
return Arrays.hashCode(values);
}
-- Arrays . class
public static int hashCode(Object a[]) {
if (a == null)
return 0;
int result = 1;
for (Object element : a)
result = 31 * result + (element == null ? 0 : element.hashCode());
return result;
}
오브젝트 배열이 null일때 0 반환 객체가 없다는 의미
배열을 반복하며
최종적으로 Object.class 안에 hashCode 를 호출한다.
@HotSpotIntrinsicCandidate
public native int hashCode();
static final boolean COMPACT_STRINGS;
byte coder() {
return COMPACT_STRINGS ? coder : UTF16;
}
COMPACT_STRINGS 가 false일 때는 UTF16으로 인코딩 된다
❕ Objects . class이 클래스는 객체에서 작동하거나 작동하기 전에
특정 조건을 확인하기 위한 정적 유틸리티 메서드로 구성됩니다.
이러한 유틸리티에는
개체의 해시 코드를 계산하고,
개체에 대한 문자열을 반환하고,
두 개체를 비교하고,
인덱스 또는 하위 범위 값이 범위를 벗어났는지 확인하는
널 세이프 또는 널 허용 방법이 포함됩니다.
equals()
!
isLatin1()
메서드를 호출한다@Native static final byte LATIN1 = 0;
private boolean isLatin1() {
return COMPACT_STRINGS && coder == LATIN1;
}
@HotSpotIntrinsicCandidate
public static boolean equals(byte[] value, byte[] other) {
if (value.length == other.length) {
int len = value.length >> 1;
for (int i = 0; i < len; i++) {
if (getChar(value, i) != getChar(other, i)) {
return false;
}
}
return true;
}
return false;
}
True
반환.equals(2번 매개변수)
를 비교한다hashCode()
를 호출해 해시 코드를 생성하고 반환한다글을 나눠 쓰는 연습을 좀 해봐야겟다
고기 뭉탱이같이 여기저기 글을 퍼트려 작성한 느낌….
결론 HashCode는 객체의 메모리주소를 기준으로 생성되며 해시테이블에 저장할 때 주로 사용된다.
해시 알고리즘을 통해 생성되고 해시로 접근하게 되면 O(n)의 시간 복잡도가 걸리게 된다.
해시코드는 프로그램이 실행되는 도중에는 항상 같은 해시코드를 보장한다
.hashCode()
는 탐색을 위해 사용된다.
.equlas()
는 객체 클래스에서 오버라이드에 필요에 맞게 값에 대한 검증을 할 수 있다
String 객체에서 비교하는 것처럼 객체의 메모리 주소값을 비교하다 답 없으면 바이트 코드까지 보내서 검증해버린다.