자바 맵 사용

5623 단어 자바기술.
Map 은 키 - value 대 집합 을 포함 하 는 데이터 구조 이 며 키 가 유일 합 니 다.다음은 맵 의 일반적인 방식 입 니 다.
1. 지도 가 List 로 바 뀌 었 습 니 다.
Map 인 터 페 이 스 는 세 개의 집합 보 기 를 제공 합 니 다: key 집합, value 집합, key - value 집합.그것들 은 모두 구조 함수 나 addAll () 방법 을 통 해 List 로 변환 할 수 있다.
// ksy List
List keyList = new ArrayList(map.keySet());
// value List
List valueList = new ArrayList(map.valueSet());
// key-value List
List entryList = new ArrayList(map.entrySet());

2. 맵 의 Entry 를 옮 겨 다 니 기
Map 을 옮 겨 다 니 는 것 은 kye - value 를 옮 겨 다 니 는 것 입 니 다. 이 pairs 는 Map. Entry 에 저장 되 어 있 습 니 다. Map. entry set () 는 key - value 집합 을 되 돌려 줍 니 다. 다음은 entry 를 옮 겨 다 니 는 가장 효과 적 인 방식 입 니 다.
for(Entry entry : map.entrySet()){
  // get key
  K key = entry.getKey();
  // get value
  V value = entry.getValue();
}

교체 기, 특히 JDK 1.5 이전 버 전도 사용 할 수 있 습 니 다.
Iterator itr = map.entrySet().iterator();
while(itr.hasNext()){
  Entry entry = itr.next();
  // get key
  K key = entry.getKey();
  // get value
  V value = netry.getValue();
}

3. key 값 으로 정렬 맵
일반적인 방법 은 Map. Entry 를 List 에 넣 고 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 을 사용 하여 keys 의 전체 정렬 을 제공 하기 때문에 모든 keys 가 Comparable 을 실현 하거나 comparator 로 받 아들 일 수 있 습 니 다.
TreeMap 은 SortedMap 의 실현 클래스 로 그의 구조 함 수 는 comparator 를 받 아들 일 수 있다.
아래 코드 는 일반 맵 에서 Sorted 맵 으로 전환 되 었 습 니 다.
SortedMap sortedMap  = new TreeMap(new Comparator()) {

  // @Override
  public int compare(K k1, K k2) {
    return k1.compareTo(k2);
  }
}

4. values 에 따라 맵 정렬
맵 을 List 에 넣 고 정렬 합 니 다. 하지만 이번 에는 Entry. getValue () 를 비교 합 니 다.
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());
  }
}

우 리 는 sorted map 를 사용 하여 이 문 제 를 해결 할 수 있 습 니 다. 전 제 는 values 도 유일한 것 입 니 다.이 조건 을 만족 시 키 면 key = value 를 value = key 로 바 꿀 수 있 습 니 다. 이 방법 은 한계 가 있 기 때문에 사용 하 는 것 을 권장 하지 않 습 니 다.
5. static/immutable 맵 의 초기 화
Map 이 constant 이 기 를 원한 다 면, 가장 좋 은 방법 은 immutable map 에 static/immutable map 를 초기 화 하 는 것 입 니 다. static 의 initializer (다음 코드) 를 사용 할 수 있 습 니 다.그러나 이 코드 는 문제 가 있 습 니 다. 맵 이 static final 로 밝 혀 졌 음 에 도 불구 하고 이 를 조작 할 수 있 기 때문에 immutable 을 진정 으로 실현 하지 못 한 것 은 아 닙 니 다.static 의 initializer 를 사용 하여 immutable map 를 만 듭 니 다. 우 리 는 추가 적 인 anonymous class 가 필요 합 니 다. 초기 화 된 마지막 단계 에서 unmodifieble map 에 복사 해 야 합 니 다.이렇게 하면 m 이 ap 를 조작 하면 Unsupported Operation Exception 오류 가 발생 합 니 다.
// wrong code
public class Test {
  private static final Map map;
  static {
    map = new HashMap();
    map.put(1, "one");
    map.put(2, "two");
  }
}  

// right code
public class Test {
  private static final Map map;
  static {
    Map aMap = new HashMap();
    aMap.put(1, "one");
    aMap.put(2, "two");
    map = collections.unmodifiableMap(aMap);
  }
}

6. HashMap, TreeMap, HashTable 의 비교
1. 교체 순서: HashMap 과 HashTable 은 원래 map 의 순 서 를 보장 할 수 없습니다. TreeMap 은 key 의 자연 순서 나 comparator 에 따라 전체 entry 를 옮 겨 다 닙 니 다.
2. key - value 권한: HashMap 은 key 와 value 를 모두 null 로 허용 합 니 다 (key 만 null 로 도 가능 합 니 다).HashTable 에서 key 나 value 를 null 로 허용 하지 않 습 니 다.HashTable 이 자연 서 순 이나 comparator 를 사용 할 때 key 를 null 로 허용 하지 않 으 면 이상 을 던 집 니 다.
3. 동기 화: HashTable 만 동기 화 되 고 다른 것 은 동기 화 되 지 않 습 니 다.따라서 스 레 드 안전 을 고려 할 필요 가 없다 면 HashMap 을 사용 하여 HashTable 대신 사용 하 는 것 을 추천 합 니 다.
 
HashMap
HashTable
TreeMap
Iterator order
no
no
yes
null key-value
yes-yes
no-no
no-yes
synchronized
no
yes
no
time performance
o(1)
o(1)
o(log n)
implementation
buckets
buckets
red-black tree        
7. 역방향 지도
가끔 은 맵 이 필요 한 value 가 유일한 것 입 니 다. 즉, one - to - one Map 은 value 를 통 해 key 를 찾 을 수 있 습 니 다. 이런 데이터 구 조 는 bidirectional map 라 고 하지만 JDK 는 아직 이런 데이터 구 조 를 지원 하지 않 습 니 다.
Apache Common Collection 과 Guava 는 이러한 데이터 구 조 를 제공 하 는데 각각 BidiMap 과 BiMap 이 라 고 한다.
8. 지도의 얕 은 복사
자바 에서 대부분의 맵 의 실현 은 복사 구조 함 수 를 제공 합 니 다. 그러나 이 복사 과정 은 동기 화 되 지 않 습 니 다. 이러한 동기 화 복사 가 되 지 않도록 Collections. synchronized Map () 을 사용 할 수 있 습 니 다.
Map copiedMap = Collections.synchronizedMap(map);

또 다른 재 미 있 는 방법 은 clone () 방법 을 사용 하 는 것 이지 만 추천 하지 않 습 니 다. Josh Bloch (Java Collection 프레임 워 크 의 디자이너) 가 'Copy construct versus cloning' 에서 한 마디 로:
     I often provide a public clone method on concrete classes because people expect it....It's a shame that Cloneable is broken,but it happens....Cloneable is a weak spot, and I think people should be aware of its limitations.
큰 소 가 건의 하지 않 는 이상 여기 도 말 하지 않 겠 다.허허...
9. 빈 맵 만 들 기
맵 이 정적 이면 사용:
map = Collections.emptyMap();

그렇지 않 으 면 모든 실현 을 사용 할 수 있 습 니 다. 예 를 들 어:
map = new HashMap();

좋은 웹페이지 즐겨찾기