2010-05-27 19 views
108

मुझे पता है LinkedHashMap में एक अनुमानित पुनरावृत्ति आदेश (सम्मिलन आदेश) है। SetLinkedHashMap.keySet() द्वारा लौटाया गया है और CollectionLinkedHashMap.values() द्वारा लौटाया गया यह आदेश भी इस आदेश को बनाए रखता है?क्या एक LinkedHashMap ऑब्जेक्ट से कुंजी और मानों की वापसी के लिए ऑर्डर की गारंटी है?

+1

चूंकि सभी उत्तरों 'मान()' के साथ-साथ 'keySet()' के मुद्दे को संबोधित करते हैं, इसलिए मैंने इसे शामिल करने के लिए प्रश्न का विस्तार किया है। इसका मतलब है कि इसके अधिक डुप्लिकेट के रूप में अधिक प्रश्न बंद किए जा सकते हैं। –

उत्तर

153

मानचित्र इंटरफ़ेस तीन संग्रह विचारों है, जो एक मानचित्र की सामग्री को कुंजियों का सेट , मूल्यों के संग्रह के रूप में देखा जा सकता है, या कुंजी-मान मैपिंग की सेट की अनुमति देते हैं प्रदान करता है। का नक्शा उस मानचित्र के रूप में परिभाषित किया गया है जिसमें मानचित्र के संग्रह पर पुनरावृत्त विचार उनके तत्व लौटाते हैं। कुछ मानचित्र कार्यान्वयन, जैसे TreeMap कक्षा, उनके आदेश के अनुसार विशिष्ट गारंटीएं प्रदान करते हैं; अन्य, HashMap कक्षा की तरह, नहीं।

- Map

यह लिंक्ड सूची यात्रा आदेश, जो आम तौर पर आदेश जिसमें कुंजी नक्शा (प्रविष्टि-आदेश) में डाला गया है परिभाषित करता है।

- LinkedHashMap

तो, हाँ, keySet(), values(), और entrySet() (तीन संग्रह विचारों का उल्लेख) आंतरिक लिंक्ड सूची का उपयोग करता है में वापसी मान। और हां, Map और LinkedHashMap के लिए JavaDoc इसकी गारंटी देता है।

यह सब के बाद, इस वर्ग का बिंदु है।

+7

मानचित्र पर पुनरावृत्ति को हैश मैप की तुलना में LinkedHashMap का उपयोग करके तेज़ी से भी किया जाता है। – Thierry

+0

@ थिएरी: हाँ, मुझे इसका उल्लेख करना चाहिए था। ओह। – Powerlord

+1

मान() एक संग्रह देता है। एक सूची नहीं यह क्रम में कैसे रखता है? – Dejell

-1

इंटरफ़ेस को देखते हुए यह एक सादा Set देता है और SortedSet नहीं। तो कोई गारंटी नहीं है।

कार्यान्वयन (हमेशा एक बुरा विचार) को देखकर एक अंतर्निहित गारंटी संभालने से पहले भी अन्य सभी जावा कार्यान्वयन :)

बेहतर होगा कि तुम उदाहरण के लिए बना सकते हैं एक निर्माता में कीसेट साथ TreeSet में कार्यान्वयन को देखो ।

+2

प्रलेखन के करीब देख रहे हैं, वास्तव में गारंटी है। जैसा कि किसी ने पहले ही लिखा है, यह इस वर्ग का बहुत ही बिंदु है। – glglgl

10

स्रोत को देखते हुए, ऐसा लगता है कि ऐसा करता है। keySet(), values(), और entrySet() सभी आंतरिक रूप से एक ही प्रविष्टि इटरेटर का उपयोग करते हैं।

+1

रिपो के लिए एक लिंक होना अच्छा होगा, लेकिन मैं आलसी हूं :-) और निश्चित रूप से, यह आगे संगतता की गारंटी नहीं है। –

0

AFAIK इसे दस्तावेज नहीं किया गया है ताकि आप "औपचारिक रूप से" ऐसा नहीं मान सकें। हालांकि, यह असंभव है कि वर्तमान कार्यान्वयन बदल जाएगा।

यदि आप ऑर्डर सुनिश्चित करना चाहते हैं, तो आप मानचित्र पर फिर से शुरू करना चाहते हैं और उन्हें अपनी पसंद के ऑर्डर फ़ंक्शन के साथ सॉर्ट किए गए सेट में डालना चाहते हैं, हालांकि आप एक प्रदर्शन लागत का भुगतान करेंगे, स्वाभाविक रूप से।

+0

क्या आपका मतलब एंट्रीसेट() कुंजी की गारंटी देता है, keySet() द्वारा नहीं? – user256239

+0

@kknight: मुझे यकीन नहीं है। जावाडोक कहता है: "यह जुड़ा हुआ सूची पुनरावृत्ति क्रम को परिभाषित करती है, जो आमतौर पर वह क्रम होता है जिसमें कुंजी को मानचित्र में सम्मिलित किया गया था (सम्मिलन-आदेश)।" हालांकि, जेडीके के लिए जावाडॉक्स सामान्य रूप से बहुत संदिग्ध हैं। – Uri

+3

अगर एंट्रीसेट() भी पुनरावृत्ति आदेश की गारंटी नहीं देता है, तो LinkedHashMap और हैश मैप के बीच क्या अंतर है? हम LinkedHashMap इंस्टेंस में पूर्वानुमानित पुनरावृत्ति आदेश का लाभ कैसे उठा सकते हैं? – user256239

4

आप ऐसा मान सकते हैं। जावाडोक कहते हैं कि 'अनुमानित पुनरावृत्ति आदेश', और मानचित्र में उपलब्ध एकमात्र इटरेटर हैं जो कुंजीसेट(), एंट्रीसेट(), और मान() के लिए हैं।

तो किसी और योग्यता की अनुपस्थिति में यह स्पष्ट रूप से उन सभी यात्रियों को लागू करना है।

-3

मुझे नहीं लगता कि आप keySet() और मानों() के क्रम को मान सकते हैं।

मैं आसानी से लिंक्ड हैशैप का कार्यान्वयन लिख सकता हूं जो आपको अनॉर्डर्ड कीसेट() और मान() देता है, जब तक कि मैं मानचित्र में परिभाषित इन दो विधियों के अनुबंध से चिपक जाता हूं और हैश मैप में ओवरराइड करता हूं।

+5

'लिंक्ड हैश मैप' वर्ग का पूरा उद्देश्य नक्शा को फिर से चालू करते समय तत्वों के क्रम को रखना है और यह व्यवहार अच्छी तरह से निर्दिष्ट है। यदि आप बेस क्लास विनिर्देश के अनुपालन के बिना सबक्लास लिखते हैं, तो आप कुछ गलत कर रहे हैं। – zakinster

4

LinkedHashMap.keySet() और LinkedHashMap.entrySet() के साथ भ्रमित न हों सेट करें और इसलिए इसे आदेश की गारंटी नहीं देनी चाहिए!

SetHashSet, TreeSet आदि के साथ एक इंटरफ़ेस है जो इसके क्रियान्वयन करता है। HashSetSet इंटरफ़ेस का कार्यान्वयन आदेश की गारंटी नहीं देता है। लेकिन TreeSet करता है। LinkedHashSet करता है।

इसलिए यह Set पर LinkedHashMap में लागू किया गया है यह जानने के लिए कि रिटर्निंग सेट संदर्भ ऑर्डरिंग की गारंटी देगा या नहीं। मैं LinkedHashMap के स्रोत कोड के माध्यम से चला गया, यह इस तरह दिखता है:

private final class KeySet extends AbstractSet<K> {...} 
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...} 

इस प्रकार LinkedHashMap/HashMap Set अर्थात KeySet के अपने स्वयं के कार्यान्वयन है। इस प्रकार HashSet के साथ इसे भ्रमित न करें।

इसके अलावा, आदेश को बनाए रखा जाता है कि बाल्टी में तत्व कैसे डाले जाते हैं। LinkedHashMap की विधि देखें और HashMap के साथ इसकी तुलना करें जो HashMap और LinkedHashMap के बीच मुख्य अंतर को हाइलाइट करता है।

+1

हालांकि यह उत्तर निश्चित रूप से उपयोगी जानकारी प्रस्तुत करता है, लेकिन यह वास्तव में प्रश्न का उत्तर नहीं देता है। यह मूल रूप से कह रहा है कि वे अनुमानित पुनरावृत्ति आदेश कर सकते हैं। – Tuupertunut

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

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