[java] HashMap의 키 존재 확인

HashMap에 키가 있는지 항상 확인해야합니까?

1000 개의 항목이있는 HashMap이 있고 효율성을 개선하려고합니다. HashMap에 매우 자주 액세스하는 경우 모든 액세스에서 키가 있는지 확인하면 오버 헤드가 커집니다. 대신 키가 존재하지 않아 예외가 발생하면 예외를 잡을 수 있습니다. (이것이 드물게 일어날 것이라는 것을 알 때). 이렇게하면 HashMap에 대한 액세스가 절반으로 줄어 듭니다.

이것은 좋은 프로그래밍 관행은 아니지만 액세스 횟수를 줄이는 데 도움이됩니다. 아니면 여기에 뭔가 빠졌습니까?

[ Update ] HashMap에 null 값이 없습니다.



답변

널값을 저장 한 적이 있습니까? 그렇지 않은 경우 다음을 수행 할 수 있습니다.

Foo value = map.get(key);
if (value != null) {
    ...
} else {
    // No such key
}

그렇지 않으면, 당신은 할 수 당신이 반환에 null 값을 얻는 경우에 단지 존재를 확인 :

Foo value = map.get(key);
if (value != null) {
    ...
} else {
    // Key might be present...
    if (map.containsKey(key)) {
       // Okay, there's a key but the value is null
    } else {
       // Definitely no such key
    }
}


답변

키가 있는지 확인하여 아무것도 얻지 못합니다. 이것은 코드입니다 HashMap:

@Override
public boolean containsKey(Object key) {
    Entry<K, V> m = getEntry(key);
    return m != null;
}

@Override
public V get(Object key) {
    Entry<K, V> m = getEntry(key);
    if (m != null) {
        return m.value;
    }
    return null;
}

의 반환 값이과 get()다른지 확인하십시오 null.

이것은 HashMap 소스 코드입니다.


자료 :


답변

더 좋은 방법은의 방법을 사용 containsKey하는 것입니다 HashMap. 내일 누군가는지도에 null을 추가 할 것입니다. 키 유무와 키에 null 값이 있는지 구분해야합니다.


답변

당신은 같은 코드를 가지고 있다는 것을 의미합니까?

if(map.containsKey(key)) doSomethingWith(map.get(key))

여기 저기 ? 그런 다음 map.get(key)null을 반환 했는지 확인해야 합니다. 그런데 HashMap은 누락 된 키에 대한 예외를 throw하지 않고 대신 null을 반환합니다. containsKey널값과 결 측값을 구별하기 위해 널값을 저장하는 경우가 유일한 경우 이지만, 이는 일반적으로 나쁜 습관으로 간주됩니다.


답변

containsKey()명확성을 위해 사용하십시오 . 빠르고 코드를 깨끗하고 읽을 수있게 유지합니다. 의 전체 지점 HashMap의 키 조회가 빠른 것을 단지 확인을 할 것입니다 hashCode()equals()제대로 구현됩니다.


답변

if(map.get(key) != null || (map.get(key) == null && map.containsKey(key)))


답변

에서 computeIfAbsent()방법을 사용할 수도 있습니다HashMap클래스 .

다음 예에서는 map키에 적용되는 트랜잭션 (정수) 목록 (은행 계좌 이름)을 저장합니다. 2 개 거래 추가 100200checking_account당신이 쓸 수 있습니다 :

HashMap<String, ArrayList<Integer>> map = new HashMap<>();
map.computeIfAbsent("checking_account", key -> new ArrayList<>())
   .add(100)
   .add(200);

이 방법으로 키의 checking_account존재 여부를 확인할 필요 가 없습니다.

  • 존재하지 않으면 람다 식에 의해 생성되고 반환됩니다.
  • 존재하는 경우 키 값이로 반환됩니다 computeIfAbsent().

정말 우아합니다! ?