본문 바로가기

스터디/소연

자료형 - HashSet, HashMap

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 값으로 사용하기 때문에

해당 필드 객체의 해시 값 계산도 해야하기 때문