-
[JAVA] Map 관련 내용JAVA 2022. 8. 19. 15:42728x90반응형
HashMap과 Hashtable은 Map 인터페이스를 구현한 대표 클래스이고 데이터를 키와 값 쌍으로 저장한다.
- HashMap(신버전)은 동기화 x, Hashtable(구버전)은 동기화 o
- Map은 데이터의 순서가 없으며, 키의 중복은 허용하지 않고 값의 중복은 허용한다.
HashMap
순서가 없는 Map에서 순서를 유지하려면 LinkedHashMap 클래스를 사용하면 된다.
- 해싱(hashing) 기법으로 데이터를 저장(put)하며 데이터가 많아도 검색 속도가 빠르다.
- hashing이란? 해시 함수를 이용해서 해시 테이블에 데이터를 저장하고 읽어온다.
- 해시 테이블은 배열(접근성)과 LinkedList(변경 유리)가 조합된 상태이다.
- hashing이란? 해시 함수를 이용해서 해시 테이블에 데이터를 저장하고 읽어온다.
더보기TreeMap
범위 검색과 정렬에 유리한 컬렉션 클래스이며 HashMap보다 데이터 추가, 삭제의 효율성이 떨어진다.
- TreeSet처럼 데이터를 정렬해서 저장하기 때문에 저장시간이 길다.
- TreeSet은 TreeMap을 이용해서 구현되어 있다.
- 다수의 데이터에서 개별적인 검색은 TreeMap보다 HashMap이 빠르다.
- Map이 필요할때 주로 HashMap을 사용하고, 정렬이나 범위검색이 필요한 경우 TreeMap을 사용한다.
Hashtable에 저장된 데이터를 가져오는 과정
- 키로 해시함수를 호출해서 HashCode를 얻는다.
- HashCode에 대응하는 LinkedList를 배열에서 찾는다.
- LinkedList에서 키(key)와 일치하는 데이터를 찾는다.
- 해시 함수는 같은 키(key)에 대해 항상 같은 hashcode를 반환해야 한다.
- 서로 다른 키(key)일지라도 같은 값의 hashcode가 반환될 수 있다.
HashMap map = new HashMap(); // 생성자 map.put("Myid", "1234"); map.put("asdf", "1111"); map.put("asdf", "1234"); // key가 중복 되면 같은 key에서 무조건 마지막값(value)으로 저장된다. // 결과 // key value // Myid 1234 // asdf 1234
HashMap의 주요 메서드
생성자
- HashMap() : 기본 생성자
- HashMap(int initialCapacity) : 생성자(초기 용량)
- HashMap(int initialCapacity, float loadFactor) : 초기 용량을 지정하고 언제 용량을 늘릴지 loadFactor로 지정한다.
- HashMap(Map m) : 지정된 Collection(m)을 저장하는 생성자
추가, 삭제, 변경
- Object put(Object key, Object value) : 추가
- Object putAll(Map m) : 추가
- Object remove(Object key) : 삭제
- Object replace(Object key, Object value) : 변경
- boolean replace(Object key, Object oldValue, Object newValue) : 변경
읽기
- Set entrySet() : key와 value를 쌍으로 가져온다.
- Set keySet() : key만 가져온다.
- Collection values() : value만 가져온다.
- Object get(Object key) : 지정된 키(key)에 해당하는 value를 반환한다.
- Object getOrDefault(Object key, Object defaultValue) : 지정된 키(key)가 없을 때 고정된 값(defaultValue)을 반환한다.
- boolean containsKey(Object key) : 키(key)가 현재 HashMap에 존재하는지 확인한다.
- boolean containsValue(Object value) : 값(value)이 현재 HashMap에 존재하는지 확인한다.
예제로 알아보기
import java.util.*; public class MyClass { public static void main(String args[]) { HashMap map = new HashMap(); map.put("myid", "1234"); map.put("asdf", "1111"); map.put("myid", "1234"); map.put("zxcv", 90); Scanner s = new Scanner(System.in); while(true){ System.out.println("id, pw input >>"); System.out.print("id : "); String id = s.nextLine().trim(); System.out.print("pw : "); String pw = s.nextLine().trim(); System.out.println(); if(!map.containsKey(id)){ System.out.println("The id entered does not exist."); } if(!(map.get(id).equals(pw))){ System.out.println("Passwords do not match."); }else{ System.out.println("Success!"); break; } } HashMap map2 = new HashMap(); map2.put("jang",90); map2.put("jang",new Integer(100)); map2.put("choi",new Integer(100)); map2.put("hong",new Integer(80)); map2.put("wuri",new Integer(90)); // Map은 iterator를 그냥 사용할 수 없다. Set set = map2.entrySet(); Iterator it = set.iterator(); while(it.hasNext()){ Map.Entry e = (Map.Entry)it.next(); // e를 출력하면 어떤 형태일까? jang=100 System.out.println("name = " + e.getKey() + " score = " + e.getValue()); } /* 결과 ( Map은 순서가 없다. ) name = hong score = 80 name = jang score = 100 name = choi score = 100 name = wuri score = 90 */ set = map2.keySet(); // 키(key)만 가져온다 System.out.println("list of participants = " + set); Collection values = map2.values(); // 값(value)만 가져온다 it = values.iterator(); int total = 0; while (it.hasNext()){ int i = (int)it.next(); total = total + i; } System.out.println("total score = " + total); System.out.println("average score = " + (float)total/set.size()); System.out.println("max score = " + Collections.max(values)); System.out.println("min score = " + Collections.min(values)); String[] data = {"A","k","A","W","D","A","k","k","Z","D"}; HashMap map3 = new HashMap(); for (int j = 0; j < data.length; j++){ if(map3.containsKey(data[j])){ int value = (int)map3.get(data[j]); map3.put(data[j], value + 1); }else{ map3.put(data[j], 1); } } Set set2 = map3.entrySet(); Iterator it2 = set2.iterator(); while(it2.hasNext()){ Map.Entry e = (Map.Entry)it2.next(); // e의 형태는 A=3 이런식으로 나온다. int value = (int)e.getValue(); System.out.println(e.getKey() + " : " + printBar('#',value) + " " + value); } } static String printBar(char c, int a){ char[] cArr = new char[a]; for (int k = 0 ; k < a; k ++){ cArr[k] = c; } return new String(cArr); } }
728x90반응형'JAVA' 카테고리의 다른 글
[JAVA] Generics 정의 및 타입변수, 다형성 (0) 2022.08.23 Java 객체지향 공부 다형성, interface, 상속, 포함 등 (0) 2022.08.22 [JAVA] TreeSet (0) 2022.08.19 [JAVA] HashSet (0) 2022.08.18 [JAVA] Iterator Method 관련 내용 (0) 2022.08.18