HashMap cho phép một khóa null và bất kỳ số giá trị null nào. Công dụng của nó là gì?
ConcurrentHashMap
nó không hỗ trợ phím null, trong khi HashMap
đó.
HashMap cho phép một khóa null và bất kỳ số giá trị null nào. Công dụng của nó là gì?
ConcurrentHashMap
nó không hỗ trợ phím null, trong khi HashMap
đó.
Câu trả lời:
Tôi không khẳng định những gì bạn đang hỏi, nhưng nếu bạn đang tìm kiếm một ví dụ về thời điểm một người muốn sử dụng khóa null, tôi thường sử dụng chúng trong bản đồ để thể hiện trường hợp mặc định (tức là giá trị nên được sử dụng nếu không có khóa nhất định):
Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
HashMap
xử lý đặc biệt các khóa null (vì nó không thể gọi .hashCode()
trên một đối tượng null), nhưng các giá trị null không phải là bất kỳ điều gì đặc biệt, chúng được lưu trữ trong bản đồ giống như bất kỳ thứ gì khác
HashMap
( putForNullKey
) xử lý nó; nó sẽ lưu nó trong bảng 0
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
Tôi nghĩ chúng ta có thể đơn giản gọi phương thức get trên phím tìm kiếm sẽ có cùng kết quả. B val = foo.get(search);
bạn có thể vui lòng sửa cho tôi nếu tôi đang làm gì đó sai?
val
thành null
nếu khóa không tồn tại; của tôi đặt nó thành bất kỳ null
bản đồ nào trong bản đồ. Đó là vấn đề, tôi lưu trữ một giá trị không null mặc định tại null
quan trọng trong bản đồ và sử dụng nó nếu phím thực tế không tồn tại
Một ví dụ về việc sử dụng cho null
các giá trị là khi sử dụng HashMap
làm bộ nhớ cache cho các kết quả của một hoạt động tốn kém (chẳng hạn như cuộc gọi đến một dịch vụ web bên ngoài) có thể trả về null
.
Việc đưa một null
giá trị vào bản đồ sau đó cho phép bạn phân biệt giữa trường hợp thao tác không được thực hiện cho một khóa nhất định ( cache.containsKey(someKey)
trả về false
) và trường hợp hoạt động đã được thực hiện nhưng trả về null
giá trị ( cache.containsKey(someKey)
trả về true
, cache.get(someKey)
trả về null
).
Nếu không có null
giá trị, bạn sẽ phải đặt một số giá trị đặc biệt vào bộ nhớ cache để chỉ ra null
phản hồi hoặc đơn giản là không lưu vào bộ nhớ cache phản hồi đó và thực hiện thao tác mọi lúc.
Các câu trả lời cho đến nay chỉ xem xét giá trị của có một null
chìa khóa, nhưng câu hỏi cũng hỏi về any number of null values
.
Lợi ích của việc lưu trữ giá trị null
so với một khóa trong HashMap cũng giống như trong cơ sở dữ liệu, v.v. - bạn có thể ghi lại sự khác biệt giữa việc có giá trị trống (ví dụ: chuỗi "") và không có giá trị nào (null) .
Đây là ví dụ duy nhất của tôi về trường hợp null
khóa có thể hữu ích:
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
nó. Bên cạnh đó, việc cố gắng dừng một bộ đếm thời gian không tồn tại hoặc đã dừng là điều mà người gọi thường có thể khôi phục.