HashMap, bir boş anahtara ve herhangi bir sayıda boş değere izin verir. Bunun ne faydası var?
ConcurrentHashMap
boş anahtarları desteklemezken desteklemiyor HashMap
.
HashMap, bir boş anahtara ve herhangi bir sayıda boş değere izin verir. Bunun ne faydası var?
ConcurrentHashMap
boş anahtarları desteklemezken desteklemiyor HashMap
.
Yanıtlar:
İstediğinizden emin değilim, ancak boş anahtar kullanmak isteyeceğiniz zaman bir örnek arıyorsanız, bunları genellikle haritalarda varsayılan durumu temsil etmek için kullanırım (yani kullanılması gereken değer belirli bir anahtar yoksa):
Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
HashMap
null anahtarları özel olarak işler ( .hashCode()
boş bir nesnede çağrı yapamayacağı için ), ancak boş değerler özel bir şey değildir, haritada başka herhangi bir şey gibi saklanırlar
HashMap
( putForNullKey
) 'de onu işleyen özel bir yöntem var; onu tablo 0'da saklar
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
Aynı sonuca sahip olan arama tuşu üzerinde basitçe get yöntemini çağırabileceğimizi düşünüyorum. B val = foo.get(search);
Bir şeyi yanlış anlarsam lütfen beni düzeltebilir misin?
val
için null
anahtar yoksa; benimki onu null
haritadaki haritalara göre ayarlar . Noktasıydı Yani, ben bir varsayılan boş olmayan değeri saklamak null
haritası anahtar ve gerçek anahtar mevcut değilse kullanmak
null
Değerlerin kullanımına bir örnek, HashMap
pahalı bir işlemin (harici bir web hizmetine yapılan çağrı gibi) sonuçları için bir önbellek olarak kullanılmasıdır null
.
null
Haritaya bir değer koymak , daha sonra belirli bir anahtar için işlemin gerçekleştirilmediği durumu ( cache.containsKey(someKey)
dönüşler false
) ve işlemin gerçekleştirildiği ancak bir null
değer döndürdüğü ( cache.containsKey(someKey)
geri dönüşler true
, cache.get(someKey)
dönüşler null
) durumu ayırt etmenize olanak tanır .
null
Değerler olmadan , bir null
yanıtı belirtmek için önbelleğe bazı özel değerler koymanız veya bu yanıtı hiç önbelleğe almamalı ve işlemi her seferinde gerçekleştirmeniz gerekir.
Şimdiye kadar verilen cevaplar sadece bir null
anahtara sahip olmanın değerini dikkate alıyor , ancak soru aynı zamanda soruyor any number of null values
.
Değeri null
bir HashMap'te bir anahtara karşı depolamanın yararı, veritabanlarında olduğu gibi aynıdır - boş bir değere sahip olma (örneğin, dize "") ile hiçbir değere sahip olmama (boş) arasındaki farkı kaydedebilirsiniz. .
İşte null
anahtarın yararlı olabileceği bir vakaya dair bir şekilde uydurulmuş tek örneğim :
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 etrafında. Ayrıca, var olmayan veya zaten durdurulmuş bir zamanlayıcıyı durdurmaya çalışmak, arayanın genel olarak düzelebileceği bir şey değildir.