java_day 10: Map 상해 - 용법, 옮 겨 다 니 기, 정렬, 상용 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()
맵 의 키 - 값 맵 의 수 를 되 돌려 줍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
셸 에서 expect 명령 을 사용 하여 원 격 명령 스 크 립 트 를 실행 합 니 다.1. 스 크 립 트 의 실행 방법 은 bash 셸 과 다 릅 니 다. 2. 한 스 크 립 트 에 파 라 메 터 를 전달 할 때 bash 셸 은 $1, 2... 파 라 메 터 를 받 습 니 다.한편, e x p e c...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.