자바 맵 을 옮 겨 다 니 는 몇 가지 방법

3410 단어
자바 의 맵 은 여러 가지 방법 이 있 습 니 다. 최초의 Iterator 부터 자바 5 가 지원 하 는 foreach, 그리고 자바 8 Lambda 까지 구체 적 인 용법 과 각자 의 장단 점 을 살 펴 보 겠 습 니 다.
맵 을 초기 화 합 니 다.
public class TestMap {
  public static Map map = new HashMap();
}

keySet values
맵 의 키 나 value 만 필요 하 다 면 맵 의 키 세트 나 values 방법 을 사용 하 는 것 이 가장 편리 하 다
  // KeySet 获取key
  public void testKeySet() {
    for (Integer key : map.keySet()) {
      System.out.println(key);
    }
  }
  // values 获取value
  public void testValues() {
    for (Integer value : map.values()) {
      System.out.println(value);
    }
  }

keySet get(key)
key 와 value 를 동시에 가 져 올 필요 가 있다 면 key 를 가 져 온 다음 map 의 get (key) 을 통 해 value 를 가 져 올 수 있 습 니 다.
설명 이 필요 한 것 은 이 방법 이 가장 좋 은 선택 이 아니 라 일반적으로 추천 하지 않 는 다 는 것 이다.
  // keySet get(key) 获取key and value
  public void testKeySetAndGetKey() {
    for (Integer key : map.keySet()) {
      System.out.println(key + ":" + map.get(key));
    }
  }

entrySet
map entry Set 를 옮 겨 다 니 면서 key 와 value 를 동시에 얻 을 수 있 습 니 다. 일반적인 상황 에서 성능 이 이전 보다 좋 습 니 다. 이것 도 가장 자주 사용 하 는 옮 겨 다 니 는 방법 입 니 다.
  // entrySet 获取key and value
  public void testEntry() {
    for (Map.Entry entry : map.entrySet()) {
      System.out.println(entry.getKey() + ":" + entry.getValue());
    }
  }

Iterator
위의 몇 가지 foreach 는 Iterator 로 대체 할 수 있 습 니 다. 사실 foreach 는 자바 5 에서 만 지원 되 고 foreach 의 쓰기 가 더욱 간결 해 보 입 니 다.
그러나 Iterator 도 장점 이 있 습 니 다. foreach 로 map 를 옮 겨 다 닐 때 크기 를 바 꾸 면 오류 가 발생 하지만 요 소 를 삭제 하 는 경우 Iterator 의 reove 방법 으로 요 소 를 삭제 할 수 있 습 니 다.
  // Iterator entrySet 获取key and value
  public void testIterator() {
    Iterator> it = map.entrySet().iterator();
    while (it.hasNext()) {
      Map.Entry entry = it.next();
      System.out.println(entry.getKey() + ":" + entry.getValue());
      // it.remove(); 删除元素
    }
  }

Lambda
java 8 은 Lambda 표현 식 지원 을 제공 합 니 다. 문법 이 더욱 간결 해 보이 고 key 와 value 를 동시에 얻 을 수 있 습 니 다. 그러나 테스트 를 통 해 성능 이 entry Set 보다 낮 기 때문에 entry Set 방식 을 추천 합 니 다.
  // Lambda 获取key and value
  public void testLambda() {
    map.forEach((key, value) -> {
      System.out.println(key + ":" + value);
    });
  }

단순 성능 테스트
10 만 개의 데이터 로 간단 한 성능 테스트 를 했 는데 데이터 유형 은 Integer 이 고 map 는 HashMap 을 선택 합 니 다.
  static {
    for (int i = 0; i < 100000; i++) {
      map.put(i, 1);
    }
  }

테스트 결 과 는 다음 과 같다.
KeySet:           392
Values:           320
keySet get(key):  552
entrySet:         465
entrySet Iterator:508
Lambda:           536

설명 이 필요 한 것 은 map 에 저 장 된 데이터 형식, map 의 크기, 그리고 map 의 서로 다른 실현 방식 이 옮 겨 다 니 는 성능 에 영향 을 줄 수 있 기 때문에 이 테스트 결 과 는 참고 하 시기 바 랍 니 다.
총결산
key 나 value 만 가 져 오 면 keyset 이나 values 방식 을 추천 합 니 다.
key 와 value 가 동시에 필요 하 다 면 entry set 를 추천 합 니 다.
옮 겨 다 니 는 과정 에서 요 소 를 삭제 하려 면 Iterator 를 사용 하 는 것 을 추천 합 니 다.
옮 겨 다 니 는 과정 에서 요 소 를 추가 해 야 한다 면 임시 맵 을 새로 만 들 고 새로 추 가 된 요 소 를 저장 할 수 있 습 니 다. 옮 겨 다 니 는 과정 에서 임시 맵 을 원래 맵 에 넣 을 수 있 습 니 다.
저자: zhaoguhong (조 고 홍) 출처:http://www.cnblogs.com/zhaoguhong/본 논문 의 판권 은 작가 와 블 로그 가든 이 공유 하고 있 으 니, 전재 할 때 출처 를 밝 혀 주 십시오.

좋은 웹페이지 즐겨찾기