일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- AuthenticationPrincipal
- 정적 리소스
- application.properties
- HATEOAS
- 백기선
- EnableAutoConfiguration
- 스프링부트
- 백준
- Spring Security
- 브루트포스
- HttpMessageConverters
- 리소스 서버
- 다익스트라
- cors
- 백트래킹
- @ConfigurationProperties
- Application Event
- rest api
- 알고리즘
- Application Argument
- 외부설정
- @Profile
- JPA
- WebApplication Type
- 리소스핸들러
- Application Runner
- OAuth2
- JsonSerializer
- 스프링 부트
- webjar
- Today
- Total
아카이브
equals()메소드와 hashCode()메소드 본문
equals() : 내용이 같은지, 동등성(equality)
hashCode() : 같은 객체인지, 동일성(identity)
equals()메소드를 오버라이딩 시 hashCode()도 오버라이딩 해야한다
- Integer, String 클래스의 경우 같은 멤버 값에 대해서 같은 hashcode가 나올 수 있도록 오버라이딩 되어 있음
- Object 클래스의 경우 hashCode()는 쓰레기 값을 반환
- 즉, 사용자 정의 클래스의 경우 hashCode()를 오버라이딩 하지 않으면 같은 객체라도 hashcode가 다를 수 있음
☞ 사용자가 hascode를 오버라이딩 해야 함
☞ hashCode() 규약을 지키기 위함
1. equals() 로 비교시 두개의 오브젝트가 같다면, hashCode() 값도 같아야 한다.
2. equals() 로 비교시 false 라면, hashCode() 값은 다를수도, 같을수도 있다.
그러나 성능을 위해서는 hashCode() 값이 다른것이 낫다.
그래야 해싱 알고리즘으로 Set 에 해당 오브젝트가 존재하는지 아닌지 빠르게 검색할 수 있다.
(HashMap, HashSet, HashTable은 내부적으로 hashCode를 호출하여 비교함)
3. hashCode() 값이 같다고 해서, eqauls() 가 true 를 리턴하는 것은 아니다.
해싱 알고리즘 자체의 문제로, 같은 해시값이 나올 수 있다.
즉, if ( 사용자 정의 클래스의 경우 )
equals()를 오버라이딩 해야 객체 간의 동등성 비교를 할 수 있다
if ( HashMap, HashSet, HashTable을 사용하는 경우 )
hasCode()를 오버라이딩 해야 객체 간의 동일성 비교를 할 수 있다
// 하지 않으면 ?
☞ Hashmap<Object, Integer>에 put(o1, 1), put(o2, 1)
System.out.println(hm.size()) // 2가 출력될 수 있음 (1이 나와야 하는데)
☞ hashCode()를 오버라이딩 하지 않아서, 같은 객체지만 hashcode가 다르기 때문에 다른 것으로 인식
'Java' 카테고리의 다른 글
HashMap과 HashTable (0) | 2021.01.06 |
---|---|
final 키워드 (0) | 2018.06.27 |
Interface와 abstract class (0) | 2018.06.18 |
String 과 StringBuffer/StringBuilder (0) | 2018.06.18 |