일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 비트마스크
- 포트앤어댑터 아키텍처
- Redis
- 알고리즘
- ddd
- UML
- BFS
- 데이터 flow
- docker
- springboot
- 파이썬
- 자바
- JPA
- series
- 백준
- 스프링
- 세그먼트 트리
- disjoint set
- pandas
- 위상정렬
- dataframe
- 이펙티브 자바
- spring security
- java
- dfs
- 헥사고날 아키텍처
- 다익스트라
- equals
- DP
- 문자열
- Today
- Total
코딩못하는사람
hashCode()와 equals() - Collection(2) 본문
HashSet,HashMap,Hashtable 자료구조를 이해하려면 hashCode를 이해하고 있어야 해서 정리했다.
객체를 비교할 때
동일성 비교 == 연산자: ==연산자는 두 객체의 주소가 같은지를 비교해서 같으면 true
다르다면 false를 반환한다(primitive타입은 값을 통해서 비교한다).
동등성 비교 equals() 메서드: equals는 Object의 기본 메서드로 객체 내부의 값을 비교해준다.
우리가 자주 사용하는 클래스들은 equals를 따로 override해서
동등성 비교를 각 데이터들에 맞게 설정해주었다.
예를 들어 String은 리터럴 방식으로 선언하나 new String 객체로 생성하나 문자열 값만 같으면
equals를 true로 반환하게 만들어 주었고, Integer은 int값만 같으면 true로 반환하게 해주었다.
이렇게 다른 객체지만 값의 동등을 비교하기 위해서는 equals()메서드를 사용한다.
따라서 우리도 class를 만들 때 동등성 비교를 위해서 equals()메서드를 override해 줄 필요가 있다는 것이다.
예를 들어 이해해보자. Student 클래스가 있다.
a라는 객체가 new Student("준식",25)를 통해 인스턴스로 생성되고
b라는 객체가 new Student("준식",25) 를 통해 인스턴스로 생성되었다고 가정해보자.
당연히 a==b는 false이다. 서로 다른 객체이기 때문에 동일하지 않다.
하지만 필드의 값들은 동등하기 때문에 equals()메서드를 썻을 때 true가 나오길 바라지만 false가 나온다.
왜? 내가 만든 Student객체에 equals()메서드를 override 해주지 않았기 때문이다.
다음과 같이 나는 메서드를 사용하는 인스턴스와 비교하는 인스턴의 name과 num이 동시에 같을 때 true를 반환하게 equals 메서들 override했다.
이렇게 재정의하면 equals값은 원하는 대로 출력된다.
Hash관련 프레임워크 (HashSet,HashMap,Hashtable )
Collection프레임워크의 Hash관련 프레임 워크들은 데이터의 동등을 확인하기 위해
먼저 hashCode를 확인하고 두번째로 equals를 확인한다.
hashCode란?
hashCode는 자바에서 객체를 식별하기 위해 메모리 번지를 hash값으로 만들어서 주는 정수값이다.
hashCode와 equals의 관계
-
equals가 true라면 hashCode는 같아야 한다.
-
hashCode가 같다고 꼭 equals가 true는 아니다.(hash collision이 있기 때문,성능이 떨어진다)
HashSet을 만든다고 가정해보자.
HashSet에 내가 위에서 equals까지 오버라이드 했던 객체 a와 b를 넣으면 어떻게 될까?
우리가 원하는 HashSet의 목표는 중복된 자료를 걸러내주어서 저장해야 한다.
동등한 자료이고 equals까지 true이니 한개만 저장될 것 같지만 틀렸다.
Hash관련 프레임워크는 hashCode까지 확인해주기 때문이다.
그렇다면 당연히 hashCode도 override 해주어야 한다는 생각이 든다.
다음과 같이 Object 객체의 hashCode()까지 override 해주면 HashSet에 한개의 객체만 들어가게 된다.
모든 Hash관련 프레임워크에서 Hash값은 중복이 있을 수 있지만
Hash Collision이 되면 성능이 떨어진다는 것을 인지하자.
HashSet : set의 특징이 들어가 있다.중복된 요소를 허용하지 않고 저장 순서를 저장하지 않는다.
위의 순서(hashcode확인 후 같으면 equals확인)를 통해서 중복을 걸러준다.
set 자료형에 순서가 필요하다면 LinkedHashSet을 사용한다
'자바 메모장 > 개념 및 문법' 카테고리의 다른 글
java HashMap의 해시충돌 및 전략 (0) | 2022.01.19 |
---|---|
Java Enum이란? (0) | 2021.02.27 |
배열과 Collections 프레임 워크(1)List (0) | 2021.02.11 |
Cloneable 인터페이스 deepcopy (0) | 2021.02.10 |
Immutable,mutable 객체 (0) | 2021.02.10 |