자바 맵에 대한 9대 문제 분석
0, Map을 List 유형으로 변환
자바에서 맵 인터페이스는 세 가지 집합 획득 방식을 제공합니다: 키 set,value set, and key-value set.그것들은 모두 구조 방법이나addAll () 방법을 통해 List 형식으로 변환할 수 있다.다음 코드에서는 맵에서 ArrayList를 구성하는 방법에 대해 설명합니다.
// key list
List keyList = new ArrayList(map.keySet());
// value list
List valueList = new ArrayList(map.valueSet());
// key-value list
List entryList = new ArrayList(map.entrySet());
1、Entry를 통해 맵 이동java에서 키 값으로 존재하는 방식을 맵이라고 합니다.Entry.Map.entrySet () 는 key-value 집합을 되돌려줍니다. 이것은 매우 효율적인 역행 방식입니다.
for(Entry entry: map.entrySet()) {
// get key
K key = entry.getKey();
// get value
V value = entry.getValue();
}
Iterator는 특히 JDK1.5 이전에도 자주 사용되었습니다.
Iterator itr = map.entrySet().iterator();
while(itr.hasNext()) {
Entry entry = itr.next();
// get key
K key = entry.getKey();
// get value
V value = entry.getValue();
}
2、키를 통해 맵 정렬정렬은 맵의 ke에 대해 빈번한 조작을 해야 한다. 한 가지 방법은 비교기(comparator)를 통해 이루어진다.
List list = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator() {
@Override
public int compare(Entry e1, Entry e2) {
return e1.getKey().compareTo(e2.getKey());
}
});
또 다른 방법은 SortedMap을 통해 하지만 Comparable 인터페이스를 구현해야 합니다.
SortedMap sortedMap = new TreeMap(new Comparator() {
@Override
public int compare(K k1, K k2) {
return k1.compareTo(k2);
}
});
sortedMap.putAll(map);
3. value 대 맵 정렬이것은 이전과 약간 유사합니다. 코드는 다음과 같습니다.
List list = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator() {
@Override
public int compare(Entry e1, Entry e2) {
return e1.getValue().compareTo(e2.getValue());
}
});
4. static 상수 맵 초기화전역 정적 맵을 만들고 싶을 때, 우리는 다음과 같은 두 가지 방식이 있고, 라인이 안전하다.
Test1에서 우리는 맵이 정적이라고 성명했지만 초기화할 때 Test1과 같이 값을 바꿀 수 있습니다.map.put(3,"three");
Test2에서 내부 클래스를 통해 수정할 수 없도록 설정합니다. 그러면 Test2를 실행합니다.map.put(3, "three") 때 하나를 던집니다.
UnsupportedOperationException 。
public class Test1 {
private static final Map map;
static {
map = new HashMap();
map.put(1, "one");
map.put(2, "two");
}
}
public class Test2 {
private static final Map map;
static {
Map aMap = new HashMap();
aMap.put(1, "one");
aMap.put(2, "two");
map = Collections.unmodifiableMap(aMap);
}
}
5, HashMap, TreeMap, and Hashtable 사이의 차이지도 인터페이스에서 모두 세 가지 실현이 있는데 그것이 바로 HashMap, TreeMap, Hashtable이다.
그것들 사이에는 각기 다른 것이 있으니 상세한 내용은 《HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap》이라는 문장을 참고하십시오.
6. 맵의 역방향 조회
우리가 맵에 키 값 쌍을 추가한 후에 이것은 맵에서 키와 값이 하나하나 대응하는 것을 의미한다. 한 키는 하나의 값에 대응하는 것이다.그러나 때때로 우리는 어떤 값을 통해 키를 찾아야 한다. 이런 데이터 구조는bidirectionalmap이라고 불리는데 유감스럽게도 JDK가 지원하지 않는다.
Apache와 Guava는 공동으로 이런bidirectional 맵 구현을 제공했다. 이 실현에서 키와 값은 모두 1:1의 관계여야 한다고 규정했다.
7, Map 복제
자바에서는 하나의 맵을 복제할 수 있는 많은 방법을 제공하지만, 그 방법은 시시각각 동기화되지 않는다.간단히 말하면, 맵이 변한 것이고, 복제된 것은 여전히 원형을 유지한다.다음은 비교적 효율적인 실현 방법입니다.
Map copiedMap = Collections.synchronizedMap(map);
물론 또 다른 방법이 있다. 그것은 복제다.그러나 우리 자바의 원조 조쉬 블락은 이런 방식을 추천하지 않는다. 그는 한 인터뷰에서 맵 복제에 관한 문제를 말한 적이 있다. 여러 가지 중에서 복제 방법을 제공했다. 왜냐하면 사람들이 확실히 필요로 하기 때문이다.그러나 복제는 한계가 있고 불필요한 영향을 끼치는 경우가 많다.(Copy constructor versus cloning)
8, 빈 맵 만들기
만약 이 맵이 사용할 수 없는 것으로 설정된다면, 아래를 통해 실현할 수 있습니다
map = Collections.emptyMap();
반대로 우리가 쓸 때 직접
map = new HashMap();
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.