2010-02-16 4 views
9

나는 아래와 같은 keySet() 방법으로 HashMap을 통해 루프를 시도하고있다 :키 집합 필드가 null

for (String key : bundle.keySet()) { 
    String value = bundle.get(key); 
    ... 
} 

내가 많이 사용에 대한-각 내 코드의 다른 부분에서 HashMaps을에 루프하지만, 이 이상한 행동으로 : 크기가 7 (정상적인)이지만 keySet, entrySetvaluesnull (Eclipse 디버거에 따라)입니다!

은 "번들"변수는 인스턴스화 (원래 아무것도 ...) 다음 없기 때문에 채워집니다 : 당신이 keySet, entrySetvalues 무엇을

Map <String, String> privVar; 
Constructor(){ 
    privVar = new HashMap<String, String>(); 
} 
public void add(String key, String value) { 
    this.privVar.put(key, value); 
} 
+2

HashMaps에서 for-each 루프를 많이 수행하는 경우 구조 변경이 필요할 수 있습니다. – Macarse

+0

@Macarse에 동의합니다. 또한 : * Map *을 반복하고 키와 값이 필요하다면 각 키에 대한 불필요한 검색을 피하기 위해 'entrySet()'을 반복하는 것이 훨씬 낫습니다. –

+0

당신의 제안에 감사드립니다. 요아킴, 나는 그렇게 할 것입니다. @Macarse : 새로운 스프레드 시트를 만들기 전에 구문 분석 규칙 집합 (regExp 검사)을 적용하기 위해 파일 (Excel 스프레드 시트)에서 추출한 값을 내지도 키 값 쌍에 넣습니다. 지도를 저장하는 것이 좋지 않다고 생각하십니까? –

답변

18

뜻을? HashMap의 내부 필드를 의미하는 경우 해당 필드를 보지 않아도되며 해당 필드에 대해 신경 쓸 필요가 없습니다. 캐싱에 사용됩니다.

내가 keySet()는 다음과 같이 구현 사용하는 자바 6 VM의 예를 들면 다음과 같습니다

public Set<K> keySet() { 
    Set<K> ks = keySet; 
    return (ks != null ? ks : (keySet = new KeySet())); 
} 

그래서 사실은 keySet 것을 null는 무관하다. keySet() (메서드)은 null을 반환하지 않습니다.

entrySet()values()에 대해서도 마찬가지입니다.

+1

Eclipse 디버거가 'table'필드에 원하는 정보를 표시하는 것처럼 보입니다. – Personman

+0

Java 7에서 data.keySet(). toArray();를 사용하여 null을 리턴합니다. 데이터가 HashMap 이고 null이 아닌 경우 – tricknology

+0

@tricknology :이 경우 새로운 질문으로 게시하는 것이 좋습니다 (이상적으로 [SSCCE] (http://sscce.org /)). –

관련 문제