HashMap은 하나의 널 키와 임의의 수의 널 값을 허용합니다. 그것의 용도는 무엇입니까?
HashMap은 하나의 널 키와 임의의 수의 널 값을 허용합니다. 그것의 용도는 무엇입니까?
ConcurrentHashMap
null 키를 지원하지 않지만 지원 한다는 것입니다 HashMap
.
답변:
나는 당신이 무엇을 요구하고 있는지 확실하지 않지만, 만약 당신이 null 키를 사용하기를 원할 때의 예를 찾고 있다면, 나는 그것들을지도에서 자주 사용하여 기본 케이스 (즉, 사용해야하는 값)를 나타냅니다. 주어진 키가없는 경우) :
Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
HashMap
null 키를 특별히 처리 .hashCode()
하지만 (null 개체를 호출 할 수 없기 때문에 ) null 값은 특별한 것이 아니므로 다른 것과 마찬가지로지도에 저장됩니다.
HashMap
( putForNullKey
)에는이를 처리 하는 특별한 방법 이 있습니다. 테이블 0에 저장
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
나는 우리가 단순히 동일한 결과를 가질 검색 키에서 get 메소드를 호출 할 수 있다고 생각합니다. B val = foo.get(search);
내가 뭔가 잘못되면 나를 바로 잡을 수 있습니까?
val
됩니다 null
. 광산은 null
지도 에서 어떤 지도 로든 설정합니다 . 포인트는 것을, 나는에서 기본 null 이외의 값을 저장 null
맵의 키와 실제 키가 존재하지 않는 경우에 사용
에 대한 사용의 일례 null
값 사용 a 언제 HashMap
복귀있다 (예컨대, 외부 웹 서비스를 호출하는 등의) 고가의 작업의 결과를 캐시로 null
.
퍼팅 null
맵에 값하는 것은 다음 작업이 주어진 키 (수행되지 않은 경우를 구별 할 수 있습니다 cache.containsKey(someKey)
반환 false
), 작업을 수행하지만 반환 된 경우 null
값 ( cache.containsKey(someKey)
반환 true
, cache.get(someKey)
반환 null
).
null
값이 없으면 캐시에 특별한 값을 넣어 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;
}
}
throw Exception
. 게다가 존재하지 않거나 이미 중지 된 타이머를 중지하려는 시도가 호출자가 일반적으로 복구 할 수있는 것과는 다릅니다.