>  기사  >  Java  >  Java Map의 9가지 주요 문제 분석

Java Map의 9가지 주요 문제 분석

高洛峰
高洛峰원래의
2017-01-19 10:38:471109검색

일반적으로 Map은 키-값 쌍으로 구성된 데이터 구조이며 각 키는 컬렉션에서 고유합니다. Java에서 Map에 관한 9가지 주요 이슈를 설명하기 위해 K와 V를 사용하여 키와 값을 표현해 보겠습니다.
0. Map을 List 유형으로 변환
Java에서 Map 인터페이스는 키 세트, 값 세트, 키-값 세트의 세 가지 컬렉션 획득 방법을 제공합니다. 이들은 모두 생성자 또는 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. 항목을 통해 맵 탐색
Java에서 이러한 키-값 쌍으로 존재하는 방식을 지도. Map.entrySet()은 매우 효율적인 순회 방법인 키-값 세트를 반환합니다.

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. 정렬은 자주 필요합니다. 한 가지 방법은 비교기를 통해 구현하는 것입니다:

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. 값을 기준으로 지도 정렬

코드는 다음과 같습니다.

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. 초기화 정적 상수 Map

전역 정적 Map을 생성하려는 경우 다음 두 가지 방법이 있으며 이는 스레드로부터 안전합니다.

Test1에서는 map이 정적이라고 선언했지만 Test1.map.put(3,"3")처럼 초기화 중에 해당 값을 변경할 수 있습니다.
Test2에서는 내부 클래스를 전달하고 수정할 수 없도록 설정한 다음 Test2.map.put(3, "3")을 실행하면

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 및 Hashtable의 차이점

Map 인터페이스에는 HashMap, TreeMap 및 Hashtable의 세 가지 구현이 있습니다.
자세한 내용은 "HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap" 기사를 참조하세요.

6. Map의 역방향 쿼리

Map에 키-값 쌍을 추가하면 키와 값 사이에 일대일 대응이 있음을 의미합니다. Map이며 하나의 키는 하나의 값에 해당합니다. 그러나 때로는 특정 값을 통해 키를 찾는 등의 역방향 쿼리가 필요할 때도 있습니다. 이러한 데이터 구조를 양방향 맵이라고 합니다. 안타깝게도 JDK에서는 이를 지원하지 않습니다.
Apache와 Guava는 이러한 양방향 맵 구현을 공동으로 제공합니다. 구현에서는 키와 값이 모두 1:1 관계를 가져야 한다고 규정합니다.

7. 맵 복사

Java는 맵을 복사하는 다양한 방법을 제공하지만 이러한 방법이 항상 동기화되는 것은 아닙니다. 간단히 말해서, 지도가 변경되더라도 복사된 지도는 그대로 유지됩니다. 다음은 보다 효율적인 구현 방법입니다.
Map CopyMap = Collections.synchronizedMap(map)
물론 복제라는 또 다른 방법도 있습니다. 그러나 Java 창시자인 Josh Bloch는 맵 복제 문제에 대한 인터뷰에서 다음과 같이 말한 적이 있습니다. 복제 방법은 사람들이 실제로 필요하기 때문에 많은 클래스에서 제공됩니다. 그러나 복제는 매우 제한적이며 많은 경우 불필요한 효과를 초래합니다.
8. 빈 지도 만들기
이 지도를 사용할 수 없도록 설정한 경우 다음
map = Collections.emptyMap();
을 통해 얻을 수 있습니다. , 직접
map = new HashMap();

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바라며, 또한 모두가 그러하길 바랍니다. PHP 중국어 웹사이트를 지원합니다.

Java에서 Map의 9가지 주요 문제 분석에 대한 더 많은 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.