developer tip

Java의 HashMap에 널 키 또는 값을 추가하는 용도는 무엇입니까?

copycodes 2020. 9. 16. 07:51
반응형

Java의 HashMap에 널 키 또는 값을 추가하는 용도는 무엇입니까?


HashMap은 하나의 널 키와 임의의 수의 널 값을 허용합니다. 그것의 용도는 무엇입니까?


나는 당신이 무엇을 요구하고 있는지 확실하지 않지만 null 키를 사용하려는 경우의 예를 찾고 있다면지도에서 자주 사용하여 기본 사례 (즉, 사용해야하는 값)를 나타냅니다. 주어진 키가없는 경우) :

Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);

HashMapnull 키를 특별히 처리 .hashCode()하지만 (null 개체를 호출 할 수 없기 때문에 ) null 값은 특별한 것이 아니므로 다른 것과 마찬가지로지도에 저장됩니다.


한 가지 예는 나무를 모델링하는 것입니다. HashMap을 사용하여 키가 부모이고 값이 자식 목록 인 트리 구조를 나타내는 경우 키 값은 null루트 노드가됩니다.


에 대한 사용의 일례 null 사용 a 언제 HashMap복귀있다 (예컨대, 외부 웹 서비스를 호출하는 등의) 고가의 작업의 결과를 캐시로 null.

퍼팅 null맵에 값하는 것은 다음 작업이 주어진 키 (수행되지 않은 경우를 구별 할 수 있습니다 cache.containsKey(someKey)반환 false), 작업을 수행하지만 반환 된 경우 null값 ( cache.containsKey(someKey)반환 true, cache.get(someKey)반환 null).

null값이 없으면 캐시에 특별한 값을 넣어 null응답 을 나타내 거나 해당 응답을 전혀 캐시하지 않고 매번 작업을 수행해야합니다.


지금까지의 대답은 null열쇠 가있는 것의 가치 만 고려 했지만 질문은에 대해 묻습니다 any number of null values.

nullHashMap에 키에 대한 값을 저장하는 이점은 데이터베이스 등에서와 동일합니다. 값이 비어있는 것과 (예 : 문자열 "") 값이 전혀없는 것 (null) 사이의 차이를 기록 할 수 있습니다. .


다음은 null키가 유용 할 수 있는 경우에 대한 내 유일하게 해석 된 예입니다 .

public class Timer {
    private static final Logger LOG = Logger.getLogger(Timer.class);
    private static final Map<String, Long> START_TIMES = new HashMap<String, Long>();

    public static synchronized void start() {
        long now = System.currentTimeMillis();
        if (START_TIMES.containsKey(null)) {
            LOG.warn("Anonymous timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(null).longValue()) +"ms"); 
        }
        START_TIMES.put(null, now);
    }

    public static synchronized long stop() {
        if (! START_TIMES.containsKey(null)) {
            return 0;
        }

        return printTimer("Anonymous", START_TIMES.remove(null), System.currentTimeMillis());
    }

    public static synchronized void start(String name) {
        long now = System.currentTimeMillis();
        if (START_TIMES.containsKey(name)) {
            LOG.warn(name + " timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(name).longValue()) +"ms"); 
        }
        START_TIMES.put(name, now);
    }

    public static synchronized long stop(String name) {
        if (! START_TIMES.containsKey(name)) {
            return 0;
        }

        return printTimer(name, START_TIMES.remove(name), System.currentTimeMillis());
    }

    private static long printTimer(String name, long start, long end) {
        LOG.info(name + " timer ran for " + (end - start) + "ms");
        return end - start;
    }
}

또 다른 예 : 날짜별로 데이터를 그룹화하는 데 사용합니다. 그러나 일부 데이터에는 날짜가 없습니다. "NoDate"헤더로 그룹화 할 수 있습니다.


널 키는 맵 키가 빈 필드를 나타내는 UI 선택에 대한 데이터를 맵에 저장할 때도 유용 할 수 있습니다.

예를 들어 해당 null 필드 값은 UI 선택에서 "(선택해주세요)"로 표시됩니다.

참고URL : https://stackoverflow.com/questions/2945309/what-is-the-use-of-adding-a-null-key-or-value-to-a-hashmap-in-java

반응형