Skip to content

Commit

Permalink
자바 언어의 성능 향상 기법(자료구조 최적화) (#27)
Browse files Browse the repository at this point in the history
  • Loading branch information
choihuk authored Feb 28, 2024
1 parent 05b3f6b commit fa47a9c
Showing 1 changed file with 57 additions and 0 deletions.
57 changes: 57 additions & 0 deletions ch11/최혁.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
---
marp: true
---

# 자바 언어의 성능 향상 기법(자료구조 최적화)

## 최 혁

---

# ArrayList

- 고정 크기 배열이기에 배열이 꽉 차면 더 큰 배열을 새로 할당한 다음 기존 값을 복사한다.
- 기본으로 용량이 10인 배열이 할당되며, 생성자를 통해 크기 조정을 할 수 있다.
- 크기를 할당하는게 성능적으로 더 낫다.

# LinkedList

- 조회보다 삽입이 많을 때 유용하다.

---

# HashMap

- Key-Value가 1:1로 Mapping 되는 자료구조
- 내부구조는 배열(버킷이라 부름)로 이루어져 있음
- 인덱스를 구하기 위해서 해시 함수를 사용하는데 해시 함수는 hashcode() % M 으로 구함
- hashcode: 객체를 식별하는 하나의 정수값
- 다만, hasocode는 int 값으로, 2^32 이 최대 key 개수이므로 hash collision이 발생

---

# hash collision을 막기 위한 방법

- 선형 탐사, 2차 탐사, 이중해싱등 여러 방식이 있지만, 자바는 Seperate Chaining 방식 채택
- Seperate Chaning: hash 값이 중복되면 node들을 pointer로 연결
- 참고로 동일한 object가 insert되는 경우도 있기에 index(hash) 값이 동일한 경우에는 해당 index bucket을 순회하며, equals() method로 이미 존재하는 object인지 확인하고, 이미 존재한다면 해당 object의 value를 새로 들어온 value로 교체함
- Java8에서는 8개 이상이면 Tree로 변경해서 관리하게 되고 다시 6개 이하가 되면 LinkedList로 변경하여 관리함
- Tree는 Red-Balck Tree를 사용
- Tree는 메모리를 많이 사용하기 때문에 6개 이하이면 LinkedList로 관리
- threshole 값이 2가 차이나는 이유는 특정 data가 반복되어 삽입/삭제 되는 경우 불필요하게 계속해서 자료구조가 바뀌는 현상이 생기는 것을 방지하기 위함

```java
static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6;
```

---

# HashMap 최적화 방법

- HashMap은 생성자로 initailCapacity와 loadFactor를 갖고 있다.
- initialCapacity: 버킷 용량(default 16)
- loadFactor: 버킷 용량을 2배 증가시키는 한계치
- loadFactor값이 0.75(defalut 값)이고 initalCapacity값이 100이라면, 버킷이 75개 이상 찰 시 용량을 2배 늘리고 저장된 데이터를 다시 배치한 다음, 해시를 다시 계산하는 `재해시` 과정을 거친다.
- 보통 기본값을 사용하는 것이 좋다.
- HashMap은 결국 key object의 hashCode()를 이용해 버킷 index를 결정하기에 equals를 override하면 hashCode도 함께 override해주어야 한다.

0 comments on commit fa47a9c

Please sign in to comment.