📌 자바 컨테이너란 무엇인가?
자바 컨테이너는 객체를 저장하고 관리하는 클래스이다. 컨테이너는 객체를 추가, 제거, 검색 및 조작하는 기능을 제공하여 데이터 구조를 구성하고 관리하는데 사용된다. 자바에서는 다양한 종류의 컨테이너 클래스를 제공한다.
- ArrayList
- 크기가 가변적인 배열로 구현된 리스트 컨테이너이다
- 요소들을 순차적으로 저장하고 인덱스를 통해 접근할 수 있다
- LinkedList
- 이중 연결 리스트로 구현된 리스트 컨테이너이다
- 각 요소는 이전 요소와 다음 요소를 가리키는 링크로 연결되어 있다
- HashSet
- 중복을 허용하지 않는 요소들의 모임인 집합 컨테이너이다
- 해시 함수를 사용하여 요소를 저장하고 검색한다
- HashMap
- 키(Key) - 값(Value) 쌍으로 이루어진 요소들을 저장하는 맵 컨테이너이다
- 각 요소는 고유한 키와 연결되어 있으며, 키를 사용하여 값을 검색하고 조작할 수 있다
- Stack
- 후입선출(LIFO, Last In First Out) 방식으로 요소를 저장하고 접근하는 스택 컨테이너이다
- Queue
- 선입선출(FIFO, First In First Out) 방식으로 요소를 저장하고 접근하는 큐 컨테이너이다
자바 컨테이너는 객체를 추가, 제거, 검색 및 조작하는 기능을 제공하는 자바 클래스
📌 Collection과 Collections의 차이는 무엇인가?
- Collection
- 자바 컬렉션 프레임워크의 인터페이스이다
- java.util.Collection 인터페이스는 객체들의 그룹을 관리하기 위한 기본적인 동작을 정의한다
- Collection은 다양한 하위 인터페이스를 가지고 있으며, 대표적으로 List, Set, Queue 인터페이스 등이 있다.
- Collections
- 자바에서 제공하는 유틸리티 클래스이다
- java.util.Collections 클래스는 Collection 인터페이스를 구현한 클래스에 대한 유용한 메서드를 제공한다
- Collections 클래스는 정적 메서드로 구성되어 있으며, 컬렉션 객체를 조작하고 정렬하고 검색하는 데 사용한다
Collection은 인터페이스, Collections는 Collection 인터페이스를 구현한 클래스에 대한 유용한 메서드를 제공하는 유틸리티 클래스
📌 List, Set, Map의 차이점은 무엇인가?
- List
- 순서가 있는 컬렉션으로, 요소들을 순차적으로 저장하고 인덱스로 접근할 수 있다
- 중복된 요소를 허용한다
- Set
- 중복을 허용하지 않는 컬렉션으로, 고유한 요소들의 모임이다
- 순서가 보장되지 않기때문에 요소를 추가한 순서대로 접근할 수 없다
- Map
- 키(Key) - 값(Value) 쌍으로 데이터를 저장하는 컬렉션이다
- 각 키는 고유해야 하며, 키를 통해 해당 값을 검색할 수 있다
- 순서가 보장되지 않으며, 중복된 키를 허용하지 않는다. 동일한 키로 다른 값을 추가하면 이전 값을 대체한다.
List는 순서가 있는 중복을 허용하는 컬렉션, Set은 순서가 없고 중복을 허용하지 않는 컬렉션, Map은 키-값 쌍을 저장하는 컬렉션이다.
📌 HashMap과 Hashtable의 차이는 무엇인가?
HashMap과 Hashtable은 둘 다 키-값 쌍을 저장하기 위한 자료 구조이지만 둘 사이에는 몇 가지 중요한 차이점이 있다.
[ 동기화(synchronization) ]
Hashtable은 동기화된 메서드를 제공하여 여러 스레드가 동시에 접근할 때 안전하게 사용할 수 있도록 한다. 즉 Hashtable은 스레드 안전(thread-safe)한 자료 구조이다. 반면 HashMap은 동기화를 제공하지 않으므로 멀티 스레드 환경에서 동기화를 보장해주어야 한다.
[ Null 허용 ]
HashMap은 null 키와 null 값 모두를 허용하지만 Hashtable은 null 키 또는 null 값이 될 수 없다.
Hashtable에 null을 넣으려고 하면 NullPointerException(NPE)이 발생한다.
[ 속도 ]
HashMap이 동기화를 제공하지 않으므로 동기화 관련 오버헤드가 없기 때문에 일반적으로 HashMap이 Hashtable보다 더 빠르다.
[ 반복 순서 ]
HashMap은 요소의 순서를 보장하지 않는 반면에 Hashtable은 요소의 삽입 순서를 유지한다.
일반적으로 동기화가 필요하지 않고 null 허용이 필요한 경우를 제외하고는 HashMap을 더 권장한다.
📌 각각 어떤 상황에서 HashMap과 TreeMap을 선택하는가?
[ 데이터 정렬 ]
HashMap은 요소의 순서를 보장하지 않는다. 데이터가 삽입된 순서와는 관계없이 내부적으로 해시 함수를 사용하여 요소를 저장하므로 요소들의 순서는 예측할 수 없다. 반면에 TreeMap은 요소들을 정렬된 순서로 유지한다. 기본적으로 키에 대해 오름차순으로 정렬되며, Comparator를 사용하여 정렬할 수 있다.
[ 성능 ]
HashMap은 해시 함수를 사용하여 데이터를 저장하므로 검색, 삽입, 삭제 작업의 평균적인 시간 복잡도는 O(1) 이다. 반면에 TreeMap은 레드-블랙 트리 (Red-Black Tree)라는 균형 이진 탐색 트리를 사용하여 데이터를 저장하므로 검색, 삽입, 삭제 작업의 평균적인 시간 복잡도는 O(log n)이다. 따라서 TreeMap은 일반적으로 HashMap보다는 조금 더 느릴 수 있다.
[ 정렬 기능 ]
TreeMap은 정렬된 데이터를 유지하므로, 범위 검색이나 정렬된 순서로 요소에 접근해야 할 때 유용하다.
[ 동기화 ]
HashMap은 동기화를 제공하지 않으므로 여러 스레드가 동시에 접근할 때 외부에서 동기화를 보장해주어야 한다. TreeMap은 동기화를 NavigableMap 인터페이스의 구현체이므로 멀티 스레드 환경에서 안전하게 사용할 수 있다.
[ Null 허용 ]
HashMap은 null 키와 null 값을 허용한다. TreeMap은 null 키를 허용하지 않는다.
요소의 순서가 중요하지 않고 빠른 검색 및 삽입이 필요한 경우에는 HashMap, 요소의 정렬이 필요하거나 범위 검색이 필요한 경우에는 TreeMap을 선택한다.
📌 HashMap의 구현 원칙은 무엇인가?
HashMap은 Hashtable을 기반으로한 자료 구조로 효율적인 데이터 검색과 삽입을 위해 설계되었다.
[ 해시 함수 사용 ]
HashMap은 해시 함수를 사용하여 키(key)와 해시 코드(hash code)를 매핑한다. 해시 함수는 키를 해시 코드로 변환하는 역할을 한다.
[ 동등성 비교 ]
HashMap은 동일한 해시 코드를 가진 키를 처리하기 위해 동등성 비교를 수행한다. 동등한 키는 동일한 버킬에 저장될 수 있도록 해시 맵 내에서 동일한 해시 코드를 가진 다른 키들과 비교된다.
[ 충돌 해결 ]
해시 함수는 일반적으로 키 공간이 무한하지 않기 때문에, 서로 다른 키가 동일한 해시 코드를 가질 수 있다.(해시 충돌 : hash collision).
HashMap은 충돌을 해결하기 위해 개방 주소법(open addressing) 또는 연결리스트(chaining)을 사용한다.
- 개방 주소법
- 동일한 버킷에 새로운 키를 저장할 다른 위치를 찾는 방법
- 연결리스트
- 동일한 버킷에 속하는 모든 키들을 연결 리스트로 관리하여 충돌을 해결
[ 초기 용량과 로드 팩터 ]
HashMap은 초기 용량(initial capacity)와 로드 팩터(load factor)라는 두 가지 매개변수를 가진다.
- 초기 용량
- 해시 맵이 저장할 수 있는 최대 요소 수를 결정
- 기본 값은 16
- 로드 팩터
- 해시 맵이 자동으로 크기를 조정할 때 사용되는 임계값
- 기본 값은 0.75
HashMap을 그냥 생성했을 경우, 16 * 0.75 = 12, 즉 12개의 데이터가 있을 때 버킷의 수를 2배(32)로 늘린다.
주니어 자바 개발자를 위한 100가지 질문 (2. Container)_2
📌 HashSet의 구현 원칙은 무엇인가? HashSet은 자바의 Set 인터페이스를 구현한 자료 구조로, 중복을 허용하지 않는 요소들의 집합을 저장하는 데 사용한다. [ 해시 함수 사용 ] HashSet은 해시 함수를
dev-density.tistory.com
'Java' 카테고리의 다른 글
주니어 자바 개발자를 위한 100가지 질문 (3. Multi-Thread)_2 (0) | 2024.02.07 |
---|---|
주니어 자바 개발자를 위한 100가지 질문 (3. Multi-Thread)_1 (1) | 2024.02.06 |
주니어 자바 개발자를 위한 100가지 질문 (2. Container)_2 (0) | 2024.02.05 |
주니어 자바 개발자를 위한 100가지 질문 (1. 기초)_2 (0) | 2023.11.07 |
주니어 자바 개발자를 위한 100가지 질문 (1. 기초)_1 (0) | 2023.11.06 |