HashMap एक अशक्त कुंजी और किसी भी शून्य मान की अनुमति देता है। इसका क्या उपयोग है?
ConcurrentHashMapशून्य-कुंजियों का समर्थन नहीं करता है, जबकि HashMapकरता है।
HashMap एक अशक्त कुंजी और किसी भी शून्य मान की अनुमति देता है। इसका क्या उपयोग है?
ConcurrentHashMapशून्य-कुंजियों का समर्थन नहीं करता है, जबकि HashMapकरता है।
जवाबों:
मैं सकारात्मक नहीं हूं कि आप क्या पूछ रहे हैं, लेकिन अगर आप एक उदाहरण के लिए देख रहे हैं कि कोई कब एक अशक्त कुंजी का उपयोग करना चाहेगा, तो मैं डिफ़ॉल्ट मामले का प्रतिनिधित्व करने के लिए नक्शे में अक्सर उनका उपयोग करता हूं (अर्थात उस मूल्य का उपयोग किया जाना चाहिए यदि कोई दी गई कुंजी मौजूद नहीं है):
Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
HashMapनल कुंजियों को विशेष रूप से संभालता है (क्योंकि यह .hashCode()एक अशक्त वस्तु पर कॉल नहीं कर सकता है ), लेकिन शून्य मान कुछ विशेष नहीं हैं, वे मानचित्र में कहीं और संग्रहीत हैं
HashMap( putForNullKey) एक विशेष विधि है जो इसे संभालती है; यह इसे टेबल 0 में स्टोर करता है
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);मुझे लगता है कि हम बस खोज कुंजी पर विधि प्राप्त कर सकते हैं जिसका एक ही परिणाम होगा। B val = foo.get(search);अगर मुझे कुछ गलत हो रहा है तो क्या आप मुझे सही कर सकते हैं?
valहो जाएगा null; मेरा इसे nullनक्शे में जो भी नक्शे में सेट करता है । यह बिंदु था, मैं nullमानचित्र में कुंजी पर एक डिफ़ॉल्ट गैर-शून्य मान संग्रहीत करता हूं और इसका उपयोग करता हूं यदि वास्तविक कुंजी मौजूद नहीं है
null मूल्यों के लिए उपयोग का एक उदाहरण HashMapमहंगे ऑपरेशन के परिणामों के लिए कैश के रूप में उपयोग करना है (जैसे कि बाहरी वेब सेवा पर कॉल) जो वापस आ सकता है null।
nullमानचित्र में एक मूल्य डालकर आप उस मामले के बीच अंतर करने की अनुमति देते हैं जहां ऑपरेशन किसी दिए गए कुंजी ( cache.containsKey(someKey)रिटर्न false) के लिए नहीं किया गया है , और जहां ऑपरेशन किया गया है, लेकिन एक nullमान लौटा ( cache.containsKey(someKey)रिटर्न true, cache.get(someKey)रिटर्न null)।
nullमानों के बिना , आपको nullप्रतिक्रिया दर्शाने के लिए या तो कैश में कुछ विशेष मूल्य रखना होगा , या बस उस प्रतिक्रिया को कैश नहीं करना चाहिए और हर बार ऑपरेशन करना होगा।
अब तक के जवाब केवल एक nullकुंजी के लायक मानते हैं , लेकिन सवाल भी पूछता है any number of null values।
nullहाशप में कुंजी के विरुद्ध मान को संचय करने का लाभ डेटाबेस, आदि में समान है - आप एक मान होने के बीच एक अंतर रिकॉर्ड कर सकते हैं जो खाली है (जैसे स्ट्रिंग ""), और बिल्कुल मान नहीं है (अशक्त) ।
यहाँ एक मामले में मेरा एकमात्र-कुछ-वंचित उदाहरण है जहाँ nullकुंजी उपयोगी हो सकती है:
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। इसके अलावा, यह एक गैर-मौजूद या पहले से ही बंद टाइमर को रोकने का प्रयास करने जैसा नहीं है, ऐसा कुछ है जो कॉलर आमतौर पर से पुनर्प्राप्त कर सकता है।