Java의 HashMap에 널 키 또는 값을 추가하는 용도는 무엇입니까?
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을 사용하여 키가 부모이고 값이 자식 목록 인 트리 구조를 나타내는 경우 키 값은 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
.
null
HashMap에 키에 대한 값을 저장하는 이점은 데이터베이스 등에서와 동일합니다. 값이 비어있는 것과 (예 : 문자열 "") 값이 전혀없는 것 (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 선택에서 "(선택해주세요)"로 표시됩니다.
'developer tip' 카테고리의 다른 글
버튼을 누를 때 UITableView 셀 행 가져 오기 (0) | 2020.09.17 |
---|---|
프로젝트 파일을 버전 관리하에 유지해야합니까? (0) | 2020.09.16 |
장고에서 여러 개체 삭제 (0) | 2020.09.16 |
ES6에서 super를 사용하지 않고 클래스를 확장하는 방법은 무엇입니까? (0) | 2020.09.16 |
Windows 용 Git Bash에서 별칭을 설정하는 방법은 무엇입니까? (0) | 2020.09.16 |