java_day 10: Map 상해 - 용법, 옮 겨 다 니 기, 정렬, 상용 API 등

맵 상세 - 용법, 옮 겨 다 니 기, 정렬, 상용 API 등
1. 지도의 개요
java. util 의 집합 류 는 자바 에서 가장 많이 사용 되 는 클래스 를 포함 합 니 다.가장 많이 사용 되 는 집합 유형 은 List 와 Map 이다.Map 은 더욱 통용 되 는 요소 저장 방법 을 제공 합 니 다.Map 집합 류 는 요소 쌍 ('키' 와 '값' 이 라 고 함) 을 저장 하 는 데 사용 되 며, 키 마다 값 을 표시 합 니 다.
2. 지도의 사용법
2.1 유형 소개
자바 는 각종 맵 류 를 가지 고 있 습 니 다.이러한 맵 류 는 세 가지 유형 으로 나 눌 수 있 습 니 다. 1) 유 니 버 설 맵 은 응용 프로그램 에서 맵 을 관리 하 는 데 사 용 됩 니 다. 보통 자바 util 패키지 에서 HashMap, Hashtable, Properties, LinkedHashMap, Identity HashMap, TreeMap, Weak HashMap, ConcurrentHashMap 2) 전용 맵 을 실현 합 니 다. 보통 우리 가 직접 이런 맵 을 만 들 필요 가 없습니다.다른 종 류 를 통 해 java. util. jar. Attributes, javax. print. attribute. standard. PrinterStateReasons, java. security. Provider, java. awt. RenderingHints, javax. swing. UIDefaults 3) 를 방문 합 니 다.
2.2 유형 별
HashMap 에서 가장 자주 사용 하 는 Map 은 키 의 HashCode 값 에 따라 데 이 터 를 저장 하고 키 에 따라 값 을 직접 얻 을 수 있 으 며 빠 른 접근 속 도 를 가지 고 있 습 니 다.HashMap 은 최대 한 개의 기록 키 만 Null (여러 개의 겹 쳐 쓰기) 로 허용 합 니 다.여러 개의 기록 값 을 Null 로 허용 합 니 다.비동기 적.TreeMap 은 저 장 된 기록 을 키 (key) 에 따라 정렬 할 수 있 습 니 다. 기본 값 은 오름차 순 으로 정렬 할 수도 있 고 정렬 된 비교 기 를 지정 할 수도 있 습 니 다. Iterator 로 TreeMap 을 옮 겨 다 닐 때 얻 은 기록 은 정렬 된 것 입 니 다.TreeMap 에 서 는 key 의 값 을 null 로 허용 하지 않 습 니 다.비동기 적.Hashtable 은 HashMap 과 유사 합 니 다. 다른 것 은 key 와 value 의 값 은 모두 null 로 허용 되 지 않 습 니 다.이 는 스 레 드 의 동기 화 를 지원 합 니 다. 즉, 어느 순간 하나의 스 레 드 만 Hashtable 을 쓸 수 있 기 때문에 Hashtale 는 기록 할 때 느 립 니 다.링크 드 하 쉬 맵 은 기록 의 삽입 순 서 를 저장 합 니 다. Iterator 로 링크 드 하 쉬 맵 을 옮 겨 다 닐 때 먼저 받 은 기록 은 반드시 먼저 삽 입 됩 니 다. 옮 겨 다 닐 때 하 쉬 맵 보다 느 립 니 다.key 와 value 는 모두 비어 있 고 동기 화 되 지 않 습 니 다.
3. Map 기본 용법
3.1 맵 초기 화
Map map = new HashMap();

3.2 요소 삽입
map.put("key1", "value1");

3.3 원소 획득
map.get("key1")

3.4 원소 제거
map.remove("key1");

3.5 지도 비우 기
map.clear();

3.6 네 가지 자주 사용 하 는 맵 삽입 과 읽 기 성능 비교
테스트 환경: jdk 1.8
테스트 코드
import java.util.HashMap;
import java.util.Hashtable;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;
import java.util.UUID;

public class Test {
    static int hashMapW = 0;
    static int hashMapR = 0;
    static int linkMapW = 0;
    static int linkMapR = 0;
    static int treeMapW = 0;
    static int treeMapR = 0;
    static int hashTableW = 0;
    static int hashTableR = 0;
 
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Test test = new Test();
            test.test(100 * 10000);
            System.out.println();
        }
 
        System.out.println("hashMapW = " + hashMapW / 10);
        System.out.println("hashMapR = " + hashMapR / 10);
        System.out.println("linkMapW = " + linkMapW / 10);
        System.out.println("linkMapR = " + linkMapR / 10);
        System.out.println("treeMapW = " + treeMapW / 10);
        System.out.println("treeMapR = " + treeMapR / 10);
        System.out.println("hashTableW = " + hashTableW / 10);
        System.out.println("hashTableR = " + hashTableR / 10);
    }
 
    public void test(int size) {
        int index;
        Random random = new Random();
        String[] key = new String[size];
 
        // HashMap   
        Map<String, String> map = new HashMap<String, String>();
        long start = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            key[i] = UUID.randomUUID().toString();
            map.put(key[i], UUID.randomUUID().toString());
        }
        long end = System.currentTimeMillis();
        hashMapW += (end - start);
        System.out.println("HashMap     = " + (end - start) + " ms");
 
        // HashMap   
        start = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            index = random.nextInt(size);
            map.get(key[index]);
        }
        end = System.currentTimeMillis();
        hashMapR += (end - start);
        System.out.println("HashMap     = " + (end - start) + " ms");
 
        // LinkedHashMap   
        map = new LinkedHashMap<String, String>();
        start = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            key[i] = UUID.randomUUID().toString();
            map.put(key[i], UUID.randomUUID().toString());
        }
        end = System.currentTimeMillis();
        linkMapW += (end - start);
        System.out.println("LinkedHashMap     = " + (end - start) + " ms");
 
        // LinkedHashMap   
        start = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            index = random.nextInt(size);
            map.get(key[index]);
        }
        end = System.currentTimeMillis();
        linkMapR += (end - start);
        System.out.println("LinkedHashMap     = " + (end - start) + " ms");
 
        // TreeMap   
        key = new String[size];
        map = new TreeMap<String, String>();
        start = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            key[i] = UUID.randomUUID().toString();
            map.put(key[i], UUID.randomUUID().toString());
        }
        end = System.currentTimeMillis();
        treeMapW += (end - start);
        System.out.println("TreeMap     = " + (end - start) + " ms");
 
        // TreeMap   
        start = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            index = random.nextInt(size);
            map.get(key[index]);
        }
        end = System.currentTimeMillis();
        treeMapR += (end - start);
        System.out.println("TreeMap     = " + (end - start) + " ms");
 
        // Hashtable   
        key = new String[size];
        map = new Hashtable<String, String>();
        start = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            key[i] = UUID.randomUUID().toString();
            map.put(key[i], UUID.randomUUID().toString());
        }
        end = System.currentTimeMillis();
        hashTableW += (end - start);
        System.out.println("Hashtable     = " + (end - start) + " ms");
 
        // Hashtable   
        start = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            index = random.nextInt(size);
            map.get(key[index]);
        }
        end = System.currentTimeMillis();
        hashTableR += (end - start);
        System.out.println("Hashtable     = " + (end - start) + " ms");
    }
}

테스트 결과
w/ms
10 회 평균 삽입 (ms)
읽 기 10 회 평균 (ms)
테스트 할당
1w
10w
100w
1w
10w
100w
HashMap
94
230
2246
2
15
214
LinkedHashMap
40
193
2208
3
15
203
TreeMap
52
266
3170
8
90
1057
Hashtable
41
191
2077
2
17
232
4. 맵 옮 겨 다 니 기 (4 가지 방법)
4.1 데이터 초기 화
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");

4.2 순환 키 세트 강화 ()
keyset () 으로 옮 겨 다 니 기
for (String key : map.keySet()) {
    System.out.println(key + " :" + map.get(key));
}

4.3 순환 entrySet 강화 ()
entry Set () 로 옮 겨 다 니 기
for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " :" + entry.getValue());
}

4.4 교체 기 키 세트 옮 겨 다 니 기 ()
keyset () 으로 옮 겨 다 니 기
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
    String key = iterator.next();
    System.out.println(key + " :" + map.get(key));
}

4.5 교체 기 옮 겨 다 니 기 entry Set ()
entry Set () 로 옮 겨 다 니 기
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
    Map.Entry<String, String> entry = iterator.next();
    System.out.println(entry.getKey() + " :" + entry.getValue());
}

5 지도 정렬
HashMap, Hashtable, LinkedHashMap 정렬
Map<String, String> map = new HashMap<String, String>();
map.put("a", "c");
map.put("b", "b");
map.put("c", "a");
 
//   ArrayList     map.entrySet()   list
List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(map.entrySet());
//            
Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
    public int compare(Map.Entry<String, String> mapping1, Map.Entry<String, String> mapping2) {
        return mapping1.getKey().compareTo(mapping2.getKey());
    }
});
 
for (Map.Entry<String, String> mapping : list) {
    System.out.println(mapping.getKey() + " :" + mapping.getValue());
}

TreeMap 정렬
TreeMap 은 기본적으로 key 에 따라 오름차 순 으로 정렬 합 니 다. 기본 순 서 를 바 꾸 려 면 비교 기 를 사용 할 수 있 습 니 다.
Map<String, String> map = new TreeMap<String, String>(new Comparator<String>() {
    public int compare(String obj1, String obj2) {
        return obj2.compareTo(obj1);//     
    }
});
map.put("a", "c");
map.put("b", "b");
map.put("c", "a");
 
for (String key : map.keySet()) {
    System.out.println(key + " :" + map.get(key));
}

value 로 정렬 (일반)
Map<String, String> map = new TreeMap<String, String>();
        map.put("a", "c");
        map.put("b", "b");
        map.put("c", "a");
 
        //   ArrayList     map.entrySet()   list
        List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(map.entrySet());
        //            
        Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
            public int compare(Map.Entry<String, String> mapping1, Map.Entry<String, String> mapping2) {
                return mapping1.getValue().compareTo(mapping2.getValue());
            }
        });
 
        for (String key : map.keySet()) {
            System.out.println(key + " :" + map.get(key));
        }

5.1 HashMap 네 가지 스 트 리밍 방식 성능 테스트
비교 방법:
각각 네 가지 옮 겨 다 니 는 방식 에 대해 50W 번 교체 하고 비교 할 때 사용한다.
코드:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.junit.Test;

public class TestMap {
	private final static int SIZE = 500000;
	public static void main(String[] args) {
		
		//     50w  
		Map<Integer, Integer> map = new HashMap<>();
		for (int i = 0; i < SIZE; i++) {
			map.put(i, i);
		}
		/** 
		 *   for  ,keySet  
		 * 1)21ms
		 * 2)15ms
		 * 3)15ms
		 *     :17ms
		*/long start = System.currentTimeMillis();
		for (Integer key : map.keySet()) {
			map.get(key);
		}
		long end = System.currentTimeMillis();
		System.out.println("  for  ,keySet   -> " + (end - start) + " ms");
	
		/**
		 *   for  ,entrySet  
		 * 1)14ms
		 * 2)17ms
		 * 3)14ms
		 *    :15ms
		 */
		start = System.currentTimeMillis();
        for (Entry<Integer, Integer> entry : map.entrySet()) {
            entry.getKey();
            entry.getValue();
        }
        end = System.currentTimeMillis();
        System.out.println("  for  ,entrySet   -> " + (end - start) + " ms");
        
        /**
         *    ,keySet 
         * 1)14ms
         * 2)11ms
         * 3)13ms
         *    :12.6ms
         */
        start = System.currentTimeMillis();
        Iterator<Integer> iterator = map.keySet().iterator();
        Integer key;
        while (iterator.hasNext()) {
            key = iterator.next();
            map.get(key);
        }
        end = System.currentTimeMillis();
        System.out.println("   ,keySet   -> " + (end - start) + " ms");
        
        /**
         *    ,entrySet  
         * 1)13ms
         * 2)11ms
         * 3)9ms
         *    :11ms
         */
        start = System.currentTimeMillis();
        Iterator<Map.Entry<Integer, Integer>> iterator1 = map.entrySet().iterator();
        Map.Entry<Integer, Integer> entry;
        while (iterator1.hasNext()) {
            entry = iterator1.next();
            entry.getKey();
            entry.getValue();
        }
        end = System.currentTimeMillis();
 
        System.out.println("   ,entrySet   -> " + (end - start) + " ms");
        
	}
}

증강 for 순환, keyset 교체 3 차 압력 테스트 결과
		/** 
		 *   for  ,keySet  
		 * 1)21ms
		 * 2)15ms
		 * 3)15ms
		 *     :17ms
		 */

증강 for 순환, entry Set 교체 3 차 압력 테스트 결과
/**
		 *   for  ,entrySet  
		 * 1)14ms
		 * 2)17ms
		 * 3)14ms
		 *    :15ms
		 */

교체 기, keyset 교체 세 번 의 테스트 결과
        /**
         *    ,keySet 
         * 1)14ms
         * 2)11ms
         * 3)13ms
         *    :12.6ms
         */

교체 기, entry Set 교체 3 차 테스트 결과 * *
        /**
         *    ,entrySet  
         * 1)13ms
         * 2)11ms
         * 3)9ms
         *    :11ms
         */

요약:
1) 증강 for 순환 사용 이 편리 하지만 성능 이 떨 어 지 므 로 초 대량 데이터 처리 에 적합 하지 않 음
2) 교체 기의 이동 속 도 는 증강 for 순환 보다 훨씬 빠 르 고 증강 for 순환 의 1 배 정도 이다
3) entry Set 을 사용 하면 keyset 보다 빨리 옮 겨 다 닙 니 다.
6 상용 API
방법.
주해
clear()
맵 에서 모든 맵 삭제
remove(Object key)
맵 에서 키 와 연 결 된 값 을 삭제 합 니 다.
put(Object key, Object value)
지정 한 값 을 지정 한 키 와 연결 합 니 다.
putAll(Map t)
지정 한 맵 의 모든 맵 을 이 맵 으로 복사 합 니 다.
entrySet()
맵 에 포 함 된 Set 보 기 를 되 돌려 줍 니 다.Set 의 모든 요 소 는 Map. Entry 대상 입 니 다. getKey () 와 getValue () 방법 (그리고 setValue () 방법) 을 사용 하여 후자 의 키 요소 와 값 요 소 를 방문 할 수 있 습 니 다.
keySet()
맵 에 포 함 된 키 의 Set 보 기 를 되 돌려 줍 니 다.Set 의 요 소 를 삭제 하고 맵 에 해당 하 는 맵 (키 와 값) 도 삭제 합 니 다.
values()
맵 에 포 함 된 값 의 Collection 보 기 를 되 돌려 줍 니 다.Collection 의 요 소 를 삭제 하고 맵 에 해당 하 는 맵 (키 와 값) 도 삭제 합 니 다.
get(Object key)
지정 한 키 와 연 결 된 값 을 되 돌려 줍 니 다.
containsKey(Object key)
맵 에 지정 한 키 의 맵 이 포함 되 어 있 으 면 true 로 돌아 갑 니 다.
containsValue(Object value)
이 맵 이 지정 한 값 에 하나 이상 의 키 를 비 추 면 true 로 돌아 갑 니 다.
isEmpty()
맵 에 키 - 값 맵 이 포함 되 어 있 지 않 으 면 true 로 돌아 갑 니 다.
size()
맵 의 키 - 값 맵 의 수 를 되 돌려 줍 니 다.

좋은 웹페이지 즐겨찾기