जावा नौकरी के लिए साक्षात्कार। संग्रह बनाम शून्य

सभी को नमस्कार!

जावा साक्षात्कार के विषय में संग्रह जावा में सेट एंड मैप के साथ काम करने के मुद्दे को विस्तार से बताते हैं। लेकिन मेरे पास अभी भी इस क्षेत्र के कुछ पसंदीदा प्रश्न हैं:

  1. नल को मानचित्र में एक कुंजी के रूप में इस्तेमाल किया जा सकता है?
  2. सेट शून्य हो सकता है?

टूलटिप (HashMap.java)
public V get(Object key) { if (key == null) return getForNullKey(); int hash = hash(key.hashCode()); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; } return null; } /** * Offloaded version of get() to look up null keys. Null keys map * to index 0. This null case is split out into separate methods * for the sake of performance in the two most commonly used * operations (get and put), but incorporated with conditionals in * others. */ private V getForNullKey() { for (Entry<K,V> e = table[0]; e != null; e = e.next) { if (e.key == null) return e.value; } return null; } 


यह माना जाता है कि एक जिज्ञासु पाठक स्वतंत्र रूप से उत्तरों पर प्रतिबिंबित करेगा और फिर उनकी तुलना मेरी से करेगा। सबसे अधीर तुरंत बिल्ली के लिए आगे बढ़ सकता है।

1. क्या मानचित्र में एक कुंजी के रूप में नल का उपयोग किया जा सकता है?

HashMap

 Map map = new HashMap(); map.put(null, "test"); //   ...  ! 

हम अंदर देखते हैं
 System.out.println(map.size()); // : 1 System.out.println(map.get(null)); // : test 

क्या चल रहा है? स्रोत से उद्धरण:
जब एक नया कुंजी-मूल्य जोड़ा जाता है, तो यह कुंजी के हैश कोड की गणना करता है, जिसके आधार पर टोकरी संख्या (सरणी का सेल नंबर), जिसमें नया तत्व प्राप्त होता है, की गणना की जाती है।

यही है, यह पता चला है कि हैश-कोड की गणना नल ... हम्मम से की जाती है। लेकिन बिना हैशकोड () के बिना किसी वस्तु की गणना कैसे की जाती है? मेरा जवाब है मैं नहीं जानता, लेकिन डिबगर से पता चलता है कि null हैश = 0 के लिए। जाहिरा तौर पर कहीं न कहीं एक अलग जाँच है।

फिर सभी आश्चर्य के बिना, हैश = 0 के साथ एक और वस्तु उसी "टोकरी" में गिर जाती है।
 map.put(0, "0"); System.out.println(map.size()); // : 2 

उत्तर नंबर 1: हैशपॉप बिना किसी समस्या के अशक्त कुंजी से संचालित होता है। इसका हैश हमेशा 0 होता है
एक विशेष रूप से विदेशी मामले के लिए map.put (अशक्त, अशक्त)
 Map map = new HashMap(); map.put(null, null); map.get(null); //  null  ,      ,       map.containsKey(null); //  true:      ,     

धन्यवाद Vanger13


ट्री-मैप

 Map map = new TreeMap(); map.put(null, "null"); //  ! 

लेकिन यह होना चाहिए!

हम अंदर देखते हैं
 System.out.println(map.size()); // : 1 System.out.println(map.get(null)); // !! Exception in thread "main" java.lang.NullPointerException 

लेकिन यह सब इतनी अच्छी तरह से शुरू हुआ! पुट लगाओ, यह वहाँ है (आकार = 1), लेकिन हम इसे वापस नहीं ला सकते। अच्छा, ठीक है, मान लें कि हमें कुछ भी हासिल नहीं करना है। और हम केवल डालना चाहते हैं, ये अजीब हैं। हम कोशिश करते हैं।
 Map map = new TreeMap(); map.put(null, "null"); //   System.out.println(map.size()); // : 1 map.put(0, "0"); // !! Exception in thread "main" java.lang.NullPointerException 

सिंगल मेपा, किसी तरह। या नहीं? नाटक जोड़ें, प्रविष्टि क्रम बदलें
 Map map = new TreeMap(); map.put(0, "0"); //   map.put(1, 1); //   System.out.println(map.size()); // : 2 map.put(null, "null"); // !! Exception in thread "main" java.lang.NullPointerException 

यह किस प्रकार की डेज़ी है? शून्य काम करता है, तो यह काम नहीं करता है! लेकिन यह पता चला है। जब हम शून्य कुंजी को एक खाली पेड़ में जोड़ते हैं - तो यह जड़ में गिर जाता है। और जड़, कामरेड, वह भी अफ्रीका में जड़ है, वह अन्य सभी की तुलना में अधिक समान है, तुलना () उसके लिए नहीं कहा जाता है और नल शांति से पेड़ की जड़ में अपना स्थान लेता है। और अगर पेड़ खाली नहीं है, तो मौजूदा सामग्री के साथ तुलना करने का प्रयास शुरू होता है, और हमें एक "वैध" एनपीई मिलता है। नल के लिए कोई विशेष शर्तें यहां प्रदान नहीं की गई हैं।

उत्तर संख्या 2: आप एक रिक्त ट्री-मैप में एक ही कुंजी-नल रख सकते हैं, अन्य सभी ऑपरेशन (आकार () और स्पष्ट) (वैसे,) उसके बाद काम नहीं करते हैं। आप किसी भी रिक्त ट्रीप में एक नल कुंजी को तुल नहीं सकते हैं क्योंकि तुलनित्र () के लिए अनिवार्य कॉल के कारण।

2. सेट शून्य हो सकता है?

इस सवाल का जवाब पिछले वाले को दोहराता है, यह देखते हुए कि सेट, वास्तव में, मैप के आधार पर लागू किया जाता है। हैशसेट एक धमाके के साथ काम करता है, ट्रीसेट - केवल पहले तत्व के लिए।

आपका ध्यान देने के लिए धन्यवाद।

उपयोगी लिंक:
जावा नौकरी के लिए साक्षात्कार। Sphinks द्वारा संग्रह
डेटा संरचनाएं: द्विआधारी पेड़। भाग 1 अदरक द्वारा
डेटा संरचनाएं: द्विआधारी पेड़। भाग 2: विंगर द्वारा संतुलित पेड़ों की समीक्षा
चित्रों में डेटा संरचनाएं। टार्ज़न 82 द्वारा हैशपॉप

Source: https://habr.com/ru/post/In164027/


All Articles