| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- letterspacing
- http
- MariaDB
- API
- Tomcat
- 스레드 덤프
- 프로세스
- Linux
- ibatis
- HTML
- 티스토리챌린지
- 키보드
- integer
- 오블완
- MySQL
- cmd
- JDBC
- Database
- Docker
- equals
- 컨트롤러
- wsdl
- 스레드
- 삼성증권
- java
- oracle
- 안드로이드 스튜디오
- 영상편집
- 톰캣
- START WITH
- Today
- Total
블로그 이름
[Java] 배열 내 존재여부 확인 시 List와 Set 동작방식 및 성능 차이 본문
Java에서 배열 내 특정 값 존재 여부 확인 시 List와 Set의 성능 차이를 비교하고자 한다.
(10개 정도 검사하는 경우 크게 차이는 안나는데 몇만개 를 넘어 자주 사용하는 경우 성능 차이가 나기 때문에)
| 자료구조 | 대표 구현체 | contains() 시간복잡도 | 탐색방식 |
| List | ArrayList | O(n) | 순차 탐색 |
| Set | HashSet | O(1) 평균 / O(n) 최악 | 해시 기반 |
| Set | TreeSet | O(log n) | 이진 탐색 트리 |
List(ArrayList) 는 내부적으로 앞에서부터 끝까지 하나씩 비교하며 equals() 를 사용하여 값을 비교한다. 때문에 데이터가 많아질수록 시간이 선형적으로 증가한다.
Set(HashSet) 은 hashCode()로 해시 버킷 위치를 계산하며 동일 버킷 내에서 equals() 로 비교한다. 평균적으로 한번에 접근하며 데이터 수가 커질수록 List대비 압도적으로 빠르다.
Set(TreeSet) 은 이진 탐색 트리 기반 Set 구현체로 HashSet에 비해 느리지만 정렬이 유지된다는 장점이 있다.
List는 전체 순회, Set은 해시 순회로 알고 있었는데 TreeSet이란 선택지가 있다는걸 알게 되었다. TreeSet는 잘 못 본 것 같은데 안쓰는 이유가 있지 않을까 싶어 알아보았다.
HashSet은 주소 비교이고, TreeSet은 비교를 반복하는 이진 탐색이기 때문에 Treeset이 느려져 존재여부 확인만이 목적이라면 TreeSet을 사용할 이유가 없는 것이었다. TreeSet은 hashCode()도, equals() 도 거의 사용하지 않는다고 한다. 그리고 비교 비용이 높고 메모리/캐시 효율이 나쁘다고 한다. 그리고 Set을 쓰는 이유는 대부분 중복 제거 / 존재 여부 체크 인데, Hashset을 두고 효율 안좋은 TreeSet을 쓸 이유가 없다... (정렬은 보통 DB에서 하니)
최종 정리
존재여부 검사할때에는 HashSet 쓰자.
'개발 > Java' 카테고리의 다른 글
| [JAVA] JMX 인증 설정 정리 (0) | 2026.02.11 |
|---|---|
| [JAVA] 스레드 덤프 출력 및 분석 (데드락, 무한루프) (0) | 2025.11.16 |
| [JAVA] Integer 비교 시 ==가 아닌 equals() 를 사용하는 이유 (0) | 2025.08.31 |
| [JAVA] 객체의 메모리 크기 확인 방법 (1) | 2025.08.03 |
| [Java] Java 임시파일 경로 설정하기 (1) | 2025.06.09 |