HashSet
hash table을 사용해 Set을 구현
객체 그 자체를 저장, null 요소도 허용, 중복 X, 순서 유지 X
*저장 순서를 유지하고 싶으면 LinkedHashSet을 사용
탐색에 특화된 자료구조로 평균 **O(1)**의 시간복잡도로 데이터를 탐색, 삽입, 삭제가 가능해, List보다 빠름
Set<Integer> set = new HashSet<>();
set.add(null); // 1개의 null만 등록 가능
set.add(1);
set.add(1); // 중복된 데이터는 등록 안됨
System.out.println("Set 사이즈: " + set.size()); // Set 사이즈: 2
System.out.println("1을 포함하나요? " + set.contains(1)); // true
System.out.println("2를 포함하나요? " + set.contains(2)); // false
set.remove(1); // 1 삭제
System.out.println("1을 포함하나요? " + set.contains(1)); // false
set.clear(); // 전체 삭제
set.add(1);
set.add(2);
set.add(3);
System.out.println(set.toString()); // [1, 2, 3]
Iterator iter = set.iterator();
while(iter.hasNext()){
System.out.print(iter.next() + " "); // 1 2 3
}
HashMap
데이터를 저장할 때 키(Key)와 밸류(Value)가 짝을 이루어 저장
특정 데이터의 저장위치를 해시함수를 통해 바로 알 수 있기 때문에 데이터의 추가, 삭제, 검색이 빠름
(*해시 함수를 통해 '키'와 '값'이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없음)
Key값을 통해서만 검색 가능
Key - 중복 불가 / Value - 중복 가능(키 값이 다를 경우)
//선언
HashMap<String,String> map1 = new HashMap<String,String>();//HashMap생성
HashMap<String,String> map2 = new HashMap<>();//new에서 타입 파라미터 생략가능
HashMap<String,String> map3 = new HashMap<>(map1);//map1의 모든 값을 가진 HashMap생성
HashMap<String,String> map4 = new HashMap<>(10);//초기 용량(capacity)지정
HashMap<String,String> map5 = new HashMap<>(10, 0.7f);//초기 capacity,load factor지정
HashMap<String,String> map6 = new HashMap<String,String>(){{//초기값 지정
put("a","b");}};
//값 추가
HashMap<Integer,String> map = new HashMap<>();//new에서 타입 파라미터 생략가능
map.put(1,"사과"); //값 추가
map.put(2,"바나나");
map.put(3,"포도");
//값 삭제
HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
put(1,"사과");
put(2,"바나나");
put(3,"포도");
}};
map.remove(1); //key값 1 제거
map.clear(); //모든 값 제거
HashMap vs HashSet
- HashMap : Map Interface의 구현체, HashTable과 유사한 자료구조로 데이터를 저장
- HashSet : Set Interface의 구현체, 내부적으로 HashMap을 사용해 데이터를 저장 > HashTable과 유사한 자료구조로 데이터를 저장
데이터 저장 형태
- HashMap: key & value 형태로 데이터를 저장
- HashSet: 객체 그 자체를 저장 / key 값으로 삽입되는 객체 자체를 value 값으로는 내부 구현 코드에서 필드로 선언한 객체를 사용
데이터 삽입 방법
- HashMap : put() 메서드를 사용해 데이터를 삽입
key-value 형태의 한 쌍의 데이터를 저장하기 때문에 삽입 연산동안 단 하나의 객체 생성 - HashSet : add() 메서드를 사용해 사용해 데이터를 삽입
객체 자체를 저장하고, 내부적으로 HashMap을 사용하기 때문에 삽입되는 객체(key 값)와 dummy 객체(value 값), 총 2개의 객체가 삽입 연산 동안 생성
중복 허용 여부
- HashMap : 중복 key는 허용하지 않지만, 중복 value는 허용
- ex) {'a': 1, 'b': 1, 'c': 2} : 가능 / {'a': 1, 'b': 1, 'a': 2} : 불가능
- HashSet : 객체 자체를 저장하는 형태이기 때문에 데이터 중복을 허용하지 않는다.
- ex) {'a', 'b', 'c'}
null 허용 여부
- HashMap : 중복 key 값을 허용하지 않기 때문에 단 하나의 null 값을 key 값으로 가질 수 있고
중복이 허용된 value의 경우 여러 null 값을 가질 수 있음 - HashSet : 단 하나의 null 값을 가질 수 있음
성능
HashMap > HashSet
HashMap은 삽입되는 데이터의 형태가 각 Value들이 Unique한 Key에 mapping 되어 있지만,
HashSet은 삽입되는 object를 Key 값으로, 내부 구현 코드에서 필드로 선언한 객체를 Value 값으로 사용하기 때문에
해당 필드 객체의 해시 값 계산도 해야하기 때문
'스터디 > 소연' 카테고리의 다른 글
POJO란 무엇인가요? Spring Framework에서 POJO는 무엇이 될 수 있을까요? (0) | 2024.04.22 |
---|---|
스프링 Bean의 Scope에 대해서 설명해주세요. (1) | 2024.04.18 |
자료형 - Array / ArrayList / LinkedList (0) | 2024.04.11 |
자료형 - String / StringBuffer (0) | 2024.04.11 |
이진 탐색 (0) | 2024.04.11 |