generated from Learning-Is-Vital-In-Development/study-template
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
57 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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해주어야 한다. |