Map 사용법, HashMap과 HashTable의 차이?

최혜원·2023년 6월 7일
2

JAVA

목록 보기
4/5
post-thumbnail

📍map 사용법, HashMap과 HashTable의 차이?

Map 사용법

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;


 //Map : Key Value 로 되어있는 자료구조(키를 사용하여 값을 얻는 일)
public class UseMap {
    public UseMap() {
        // JDK1.5이하인 경우 Generic을 사용할 수 없고, 객체만 저장 가능하다.
        
        // 1. 생성
        Map<String, String> map = new HashMap<>();
        
        // 2. 값 할당 - 키는 유일 , 값은 중복 가능, 입력되는 순서대로 값이 추가되지 않는다.
        map.put("Oracle", "대용량 데이터베이스");
        map.put("Java", "프로그래밍 언어");
        map.put("Python", "프로그래밍 언어");// 값은 중복 가능
        map.put("Java", "완벽한 객체지향 언어");// 키가 존재한다면 해당 키에 덮어 쓴다.
        map.put("HTML", "Markup Language");// 키가 존재한다면 해당 키에 덮어 쓴다.
        System.out.println(map.size() + " " + map);
        
        // 3. 값 얻기) 키를 사용하여 값을 얻는다.
        // 키에 해당하는 값이 없다면 null을 반환
        String val = map.get("Java");// Java,HTML
        System.out.println(val);
        // 4. 키가 존재하는지?
        String key = "Java";
        boolean flag = map.containsKey("Java");
        System.out.println(key + "키가 존재 " + flag);

        // 5. 값 삭제
        map.remove("Java");
        System.out.println("삭제 후 : " + map);

        /// 6. 모든 키 얻기
        Set<String> allkeys = map.keySet();
        System.out.println("맵이 가진 모든 키 : " + allkeys);

        // 7. 모든 값 얻기
        Iterator<String> ita = allkeys.iterator();// 모든 키가 iterator에들어감
        String value = "";
        while (ita.hasNext()) {// 키가 존재한다면
            value = map.get(ita.next());// 얻어낸 키를 가지고 맵의 값을 얻는다.
            System.out.println(value);

        }
        // 8. 모두 삭제
        map.clear();
        System.out.println("모두 삭제 : " + map.size() + "/" + map);
    }

HashMap 사용법

 /**
     * 기본생성자를 사용하면 11개의 행이 자동 생성
     * MultiThread에서 동시접근 가능.
     * 데이터가 전체 행 갯수의 약 75%채워있을 때 가장 빠른 검색을 한다.
     */
    public void useHashtable(String key) {
        //1. 생성
        Map<String, String> bloodmap = new HashMap<>(100);
        //2. 값 할당
        bloodmap.put("A","세심하다");
        bloodmap.put("B","성질드럽다");
        bloodmap.put("AB","싸이코");
        bloodmap.put("O","우유부단하다");
        bloodmap.put("A","소심하다");

        //값 얻기
        String value=bloodmap.get(key.toUpperCase());

        if(!bloodmap.containsKey(key.toUpperCase())) {//키가 존재하는지?
            System.out.println(key+"혈액형은 사람의 것이 아닙니다.");
        }else {
            System.out.println(key+"형 의 특징은 : "+ value);
        }
    }

HashTable 사용법

    /**
     * 기본생성자를 사용하면 16개의 행이 자동 생성
     * MultiThread에서 동시접근 불가능.
     * 데이터가 전체 행 갯수의 약 75%채워있을 때 가장 빠른 검색을 한다.
     */
    public void useHashMap(String key) {
        //1. 생성
        Map<String,String> map = new HashMap<>();
        //2. 값 할당
        map.put("INFP", "항상 선을 행할 준비가 되어 있는 부드럽고 친절한 이타주의자입니다.");
        map.put("INFJ", "차분하고 신비한 분위기를 풍기는 성격으로, 다른 사람에게 의욕을 불어넣는 이상주의자입니다.");
        map.put("ISTJ", "사실을 중시하는 믿음직한 현실주의자입니다.");
        map.put("ISFJ", "주변 사람을 보호할 준비가 되어 있는 헌신적이고 따뜻한 수호자입니다.");
        map.put("ISTP", "대담하면서도 현실적인 성격으로, 모든 종류의 도구를 자유자재로 다루는 장인입니다.");
        map.put("ISFP", "항상 새로운 경험을 추구하는 유연하고 매력 넘치는 예술가입니다.");

        //3. 값 얻기
        if (map.containsKey(key)) {//맵에 키가 존재한다면
            String value=map.get(key);//값 얻기
            System.out.println(key+"의 뜻은 "+value);
        }else {
            System.out.println(key+"MBTI는 준비되지 않았습니다.");
        }
    }

HashMap과 HashTable의 차이?

자바에서 Hashmap과 HashTable의 가장 큰 차이는 Thread-safe이다.
Hashtable의 모든 Data 변경 메소드는 syncronized로 선언되어 있다.
즉 메소드 호출 전 스레드간 동기화 락을 통해 멀티 쓰레드 환경에서 data의 무결성을 보장해준다.
하지만 HashMap의 경우 Thread-safe하지 않기 때문에 멀티 스레드 환경에서 동시에 객체의 data를 조작하는 경우 data가 깨질 수 있다.
이외의 차이로 HashMap은 key에 null을 허용하지만 HashTable의 경우 key에 null을 허용하지 않는다.

profile
어제보다 나은 오늘

0개의 댓글