HashMap memungkinkan satu kunci nol dan sejumlah nilai nol. Apa gunanya itu?
ConcurrentHashMaptidak mendukung kunci-null, sedangkan HashMaptidak.
HashMap memungkinkan satu kunci nol dan sejumlah nilai nol. Apa gunanya itu?
ConcurrentHashMaptidak mendukung kunci-null, sedangkan HashMaptidak.
Jawaban:
Saya tidak yakin apa yang Anda tanyakan, tetapi jika Anda mencari contoh ketika seseorang ingin menggunakan kunci null, saya sering menggunakannya di peta untuk mewakili kasus default (yaitu nilai yang harus digunakan jika kunci yang diberikan tidak ada):
Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
HashMapmenangani kunci null secara khusus (karena tidak dapat memanggil .hashCode()objek null), tetapi nilai null bukanlah sesuatu yang istimewa, mereka disimpan di peta seperti yang lainnya
HashMap( putForNullKey) yang menanganinya; itu menyimpannya di tabel 0
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);Saya pikir kita cukup memanggil metode get pada kunci pencarian yang akan memiliki hasil yang sama. B val = foo.get(search);bisakah Anda mengoreksi saya jika saya mendapatkan sesuatu yang salah?
valke nulljika kuncinya tidak ada; milik saya mengaturnya ke nullpeta apa pun di peta. Itulah intinya, saya menyimpan nilai default non-null pada nullkunci di peta dan menggunakannya jika kunci sebenarnya tidak ada
Salah satu contoh penggunaan null nilai adalah saat menggunakan HashMapsebagai cache untuk hasil operasi yang mahal (seperti panggilan ke layanan web eksternal) yang mungkin kembali null.
Menempatkan nullnilai di peta kemudian memungkinkan Anda untuk membedakan antara kasus di mana operasi belum dilakukan untuk kunci tertentu ( cache.containsKey(someKey)kembali false), dan di mana operasi telah dilakukan tetapi mengembalikan nullnilai ( cache.containsKey(someKey)kembali true, cache.get(someKey)kembali null).
Tanpa nullnilai, Anda harus meletakkan beberapa nilai khusus di cache untuk menunjukkan nullrespons, atau tidak menyimpan respons itu sama sekali dan melakukan operasi setiap saat.
Jawabannya selama ini hanya mempertimbangkan nilai dari sebuah nullkunci, tetapi pertanyaan juga menanyakan tentang any number of null values.
Manfaat menyimpan nilai nullterhadap kunci di HashMap sama seperti di database, dll - Anda dapat merekam perbedaan antara memiliki nilai yang kosong (misalnya string ""), dan tidak memiliki nilai sama sekali (null) .
Inilah contoh kasus saya yang hanya dibuat-buat dimana nullkuncinya dapat berguna:
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 Exceptionberkeliling. Selain itu, tidak seperti mencoba menghentikan timer yang tidak ada atau sudah berhenti adalah sesuatu yang biasanya dapat dipulihkan oleh penelepon.