2010-07-30 7 views
4

다음 코드가 제공됩니까?목록의지도를 최적화 할 수있는 방법이 있습니까?

final Map<String, List<E>> map = new HashMap<String, List<E>>(); 

List<E> list = map.get(mapKey); 
if (list == null) { 
    list = new ArrayList<E>(); 
    map.put(mapKey, list); 
} 
list.add(value); 

null 체크를 피할 수있는 방법이 있다면? 그러나 처음지도를 삽입 할 때 자동으로지도가 자동 생성됩니다.

나는 이것을 할 수있는 특수화 된지도를 한 번 보았습니다. 내가 본 곳 그러나, 나는 이미

답변

7

당신은 구아바의를 찾고 있습니다 * MultiMap. 이전에 "Google Collections"라고 불렸을 때 그 이야기를 들었을 것입니다.

This 블로그 게시물은 MultiMap에 대해 조금 이야기합니다.

+0

OK. 나는 그것을 지금 기억하고있다 :) 그러나 기다려라! 라이브러리 자체는 912KB ~ 1MB이며, 필자가 필요로하는 바로이 "좋은 기능"입니다. 괜찮습니다. 사용자가 내 소프트웨어 다운로드 크기가 너무 커도 불평하기 시작합니다. :) –

+0

@Yan - 필요한 인터페이스/클래스를 복사하지 않는 이유는 무엇입니까? http://code.google.com/p/guava-libraries/source/browse/trunk/src/com/google/common/collect/Multimap.java – Greg

+1

@Yan : 전화. 1MB는 그다지 큰 것이 아니며 구아바에는 어쨌든 * 할 수있는/쓸모있는 * 유용한 정보가 많이 있습니다. 따라서 단지 1Mb와 같지 않습니다. 어쨌든, 적어도 당신은 당신의 선택을 압니다. 1) 귀하의 질문과 같이 수동 실행을하지 마십시오. 2) 다운로드에 1Mb를 추가하고 Guava를 사용하십시오. 3) Guava 구현을 기반으로 자신 만의 버전을 작성하십시오. 찬반 양론을 비교하고 가장 매력적인 옵션을 전체적으로 선택하십시오. –

4

당신은 Guava에서 Multimap을 사용할 수 :(잊지 ... 그게 내가 할 :) (그리고 특히, ArrayListMultimap.) 것 무엇

+0

나는 ArrayListMultimap이라 불려야한다고 생각한다. –

+0

@Yan : 성능에 민감한 * map * 부분은 해시 테이블에 의해 뒷받침된다. –

+0

@JonSkeet - OP는'ArrayListMultimap', * HashMultimap이 아닌 *를 사용해야합니다. ('HashMultimap'은 키를'HashSet's에 매핑합니다.) –

1

가능한 경우 나노초를 절약 할 수 있으며 많은 시간을 소비 할 가치가 없을 것입니다. 그러나 성능 최적화를 위해 노력 중이며 성능상의 문제를 일으키는 크고 작은지도가 있다면 Javolution을 고려해보십시오. 그들은 Java의 기본 맵 및 목록보다 훨씬 빠른 성능과 빠른 맵을 제공합니다.

+1

이 코드가 성능 문제를 일으키더라도 nullcheck으로 인한 것이 아니라 할당/생성, 찾기 및 삽입 작업으로 인한 것입니다. – Grizzly

0

는 항목의 수가 적은 경우에는 배열이 실제로 더 빠를 수 있습니다 아파치의 commons-collections

0

에 MultiValueMap있다. 몇 가지 항목이 있고 선형 검색을 사용하면 JVM이 항목을 더 빠르게로드 할 때 더 복잡한 데이터 유형의 오버 헤드가 필요하지 않습니다.

관련 문제