일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 리사이클러뷰풀
- 자이고트
- recyclerview
- 플로이드워셜
- 운영체제
- Android
- 물리 메모리
- Kotlin
- AsyncListDiffer
- 뷰홀더
- http발전과정
- AAC
- GetX
- 프로세스
- 데코레이터 패턴
- 리사이클러뷰
- NestedScrollView
- http 역사
- flutter
- 절대 주소
- viewModelScope
- appcompatactivity
- apk 빌드 과정
- 상태관리
- 디자인 패턴
- DiffUtil
- 내부 단편화
- 안드로이드
- Dispatchers
- appcompatacitivity
- Today
- Total
hong's android
[자바] object 클래스와 String 클래스 본문
Object 클래스
// Object
// equals 메서드
public boolean equals(Object obj) {
return (this == obj);
}
Object 클래스의 대표적인 메소드들
1. equals() : 참조 값을 비교한다.
2. hashcode() : 객체의 주소값을 해시값으로 변환하여 반환한다.
3. toString()
String 클래스
String 클래스의 equals는 문자열의 값을 비교한다. Object 클래스를 상속받아서 위와 같이 equals를 오버라이딩 했기 때문이다.
두 객체가 같은 경우 값 비교를 하지않고 동일하다고 판단한다. 다른 경우 서로의 string값을 비교한다.
// String.java
// 자바 8
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
- 위의 경우는 자바8이다. 자바 11부터는 라틴어인지에 따라 분기해서 hashCode()메소드를 호출한다.
* 31을 곱해주는 이유
짝수를 곱해주면 비트를 한칸씩 왼쪽으로 이동시키는 쉬프트 연산이 실행되기 때문에 오버플로우 오류가 생길 확률이 높아진다.
31은 시프트연산과 뺄셈을 해주면서 오버플로우 확률을 낮춘다.
Collection 프레임워크 (HashMap(), HashSet() 등)
Collection 프레임워크 중 HashMap(),HashSet(), HashTable() 는 객체의 동등성을 판단하기위해 hashcode(),equals() 메소드를 사용한다. HashMap()은 key와 value로 구성된다.
키의 식별값을 결정할때 hashCode() % m 연산을 해주게되는데 해시값이 아무리 분포가 고르다고해도 해시값 충돌이 일어날 위험이 있다.
해시값 충돌이 발생하면 LinkedList 형태로 객체들을 저장한다. (자바 8부터 아이템 갯수가 8이상이면 treemap에 저장)
value값이 같은객체인지 판별하기 위해선 객체의 hashcode()와 equals()메소드를 실행하게되는데 두 메소드가 true이면 같은객체로 판단한다.
* 논리적 동등성을 판단하는 객체인 경우 hashCode()와 equals()를 함께 정의해야하는 이유
- hashCode()만 정의하게되면 해당 키 식별값을 찾을수 있지만 같은 객체인지 판단할 수 없다.
- equals()만 정의하게되면 해당 키 식별값이 저장된 버킷을 찾을 수 없다.
Reference.
https://jisooo.tistory.com/m/entry/java-hashcode와-equals-메서드는-언제-사용하고-왜-사용할까
'Develop > Java' 카테고리의 다른 글
[자바] 오브젝트풀링 / Executors 클래스 (0) | 2023.02.28 |
---|---|
[Java] java.lang.Object (0) | 2023.02.11 |
[Java] Collection Framework (0) | 2023.02.11 |
[Java] 동시성 문제와 synchronized의 성능 (0) | 2023.02.11 |
[Java] 제네릭, 래퍼 클래스 (0) | 2023.02.11 |