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ì?
ConcurrentHashMapnó 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ì?
ConcurrentHashMapnó 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);
HashMapxử 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?
valthành nullnếu khóa không tồn tại; của tôi đặt nó thành bất kỳ nullbả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 nullquan 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 HashMaplà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 nullgiá 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ề nullgiá trị ( cache.containsKey(someKey)trả về true, cache.get(someKey)trả về null).
Nếu không có nullgiá trị, bạn sẽ phải đặt một số giá trị đặc biệt vào bộ nhớ cache để chỉ ra nullphả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 nullchì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ị nullso 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 nullkhó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 Exceptionnó. 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.