HashMap memungkinkan satu kunci nol dan sejumlah nilai nol. Apa gunanya itu?
ConcurrentHashMap
tidak mendukung kunci-null, sedangkan HashMap
tidak.
HashMap memungkinkan satu kunci nol dan sejumlah nilai nol. Apa gunanya itu?
ConcurrentHashMap
tidak mendukung kunci-null, sedangkan HashMap
tidak.
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);
HashMap
menangani 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?
val
ke null
jika kuncinya tidak ada; milik saya mengaturnya ke null
peta apa pun di peta. Itulah intinya, saya menyimpan nilai default non-null pada null
kunci di peta dan menggunakannya jika kunci sebenarnya tidak ada
Salah satu contoh penggunaan null
nilai adalah saat menggunakan HashMap
sebagai cache untuk hasil operasi yang mahal (seperti panggilan ke layanan web eksternal) yang mungkin kembali null
.
Menempatkan null
nilai 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 null
nilai ( cache.containsKey(someKey)
kembali true
, cache.get(someKey)
kembali null
).
Tanpa null
nilai, Anda harus meletakkan beberapa nilai khusus di cache untuk menunjukkan null
respons, atau tidak menyimpan respons itu sama sekali dan melakukan operasi setiap saat.
Jawabannya selama ini hanya mempertimbangkan nilai dari sebuah null
kunci, tetapi pertanyaan juga menanyakan tentang any number of null values
.
Manfaat menyimpan nilai null
terhadap 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 null
kuncinya 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 Exception
berkeliling. Selain itu, tidak seperti mencoba menghentikan timer yang tidak ada atau sudah berhenti adalah sesuatu yang biasanya dapat dipulihkan oleh penelepon.