2015-10-23 10 views
7

यहाँ Hashtable#get है:हैशटेबल आंतरिक रूप से प्रविष्टि <?,?> का उपयोग क्यों करता है?

@SuppressWarnings("unchecked") 
public synchronized V get(Object key) { 
    Entry<?,?> tab[] = table; 
    int hash = key.hashCode(); 
    int index = (hash & 0x7FFFFFFF) % tab.length; 
    for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) { 
     if ((e.hash == hash) && e.key.equals(key)) { 
      return (V)e.value; 
     } 
    } 
    return null; 
} 

यह Entry<?,?> बजाय Entry<K,V> क्यों इस्तेमाल करता है?

+0

मेरे पास स्रोत कोड (1.8) कहता है कि आवृत्ति चर 'टेबल' भी वाइल्डकार्ड है - 'निजी क्षणिक प्रविष्टि [] तालिका;'। – rgettman

उत्तर

1

Hashtable की रचना जावा 1.5 में जेनेरिक के साथ किए गए किसी भी काम की भविष्यवाणी करती है, इसलिए यहां संभावित परिदृश्य यह था कि जेनेरिकों को फिर से लगाया गया था।

हालांकि एक बड़ा बयान इस तथ्य के कारण हो सकता है कि table एक सरणी है, और जेनेरिक और सरणी बस अच्छी तरह से नहीं मिलती हैं।

तो table (Hashtable में क्षेत्र) टाइप किया गया है, तो आप इन घोषणाओं का एक बहुत से निपटने के लिए चाहता हूँ ...

// Generic array creation! 
Entry<K, V>[] newMap = new Entry<K, V>[newCapacity]; 

... और संभावना डिजाइन/कार्यान्वयन निर्णय था जेनेरिकों के पूर्ण अनुग्रह के विरोध में अनुकूलता के लिए प्रयास करने के लिए।

भी ध्यान रखें कि किसी वाइल्ड कार्ड के साथ एक सरणी प्रकार बनाने तथ्य के कारण एक संकलन समय त्रुटि का कारण नहीं होगा, एक ठोस प्रकार होगा साथ एक सरणी बनाने जबकि, कि एक अबाध वाइल्डकार्ड is considered reifiable साथ एक सामान्य प्रकार:

List<?>[] foo = new ArrayList[10]; // perfectly legal but not encouraged 
List<String> bar = new ArrayList[10]; // not legal 

सम्मेलन आगे बढ़ते हुए, बजाय HashMap उपयोग करने के लिए किया जाएगा इस विशेष कार्यान्वयन दोनों सिंक्रनाइज़ है और अभी भी उस में पूर्व 1.5 सम्मेलनों का एक बहुत का उपयोग करता है के बाद से। (यदि आप सिंक्रनाइज़ेशन चाहते हैं, तो दस्तावेज़ भी ConcurrentHashMap की अनुशंसा करते हैं।)

संबंधित मुद्दे