क्या LinkedHashMap वस्तु से कुंजियों और मूल्यों की वापसी के लिए आदेश की गारंटी है?


162

मुझे पता है LinkedHashMapकि एक पूर्वानुमेय चलना आदेश (प्रविष्टि क्रम) है। क्या इसके Setद्वारा लौटाया गया LinkedHashMap.keySet()और Collectionलौटाया गया LinkedHashMap.values()ऑर्डर भी बरकरार है?


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

जवाबों:


226

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

- मानचित्र

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

- लिंक्डहाशपैप

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

इस वर्ग की बात है, सब के बाद।


8
मानचित्र पर पुनरावृति भी एक HashMap की तुलना में LinkedHashMap का उपयोग करके तेजी से किया जाता है।
थियरी

2
मान () एक संग्रह लौटाता है। सूची नहीं है। यह कैसे क्रम में रखता है?
देजेल

7
@Dejel Collectionक्या मान देता है () रिटर्न के लिए बस बेस क्लास है। इसके द्वारा संग्रहित संग्रह का कार्यान्वयन अभी भी नियंत्रित है LinkedHashMap। एक LinkedHashMapमामले में, यह एक LinkedValuesउदाहरण लौट रहा है , लिंक्डहाशपेज़.जावा के अंदर एक निजी वर्ग।
पॉवरलॉर्ड

2
मेरे मामले में लिंक्डहाशपैप की कीसेट नक्शे में प्रस्तुत क्रम में नहीं है। इससे बहुत हैरान हुए।
अमलगोविनस

2
प्रलेखन (लिंक Map) से लिंक करने के लिए धन्यवाद जो मानचित्र के संग्रह के विचारों पर चलने वालों के लिए मानचित्र के आदेश को स्पष्ट रूप से रखता है (और उन संग्रह विचारों को स्पष्ट कर रहा है)। वह मेरे लिए गायब टुकड़ा था।
लार्स

11

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


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

6

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

Setके साथ एक अंतरफलक है HashSet, TreeSetआदि इसके कार्यान्वयन को बनाता है। इंटरफ़ेस का HashSetकार्यान्वयन Setआदेश की गारंटी नहीं देता है। लेकिन 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

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


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

5

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

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


0

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

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


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

1
@kknight: मुझे यकीन नहीं है। javadoc में कहा गया है: "यह लिंक की गई सूची पुनरावृति क्रम को परिभाषित करती है, जो सामान्य रूप से वह क्रम है जिसमें कुंजियों को मानचित्र (प्रविष्टि-क्रम) में डाला गया था।" हालाँकि, JDK के लिए JavaDocs सामान्य रूप से बहुत अस्पष्ट हैं।
उड़ी

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

1
यह निश्चित रूप से प्रलेखित है। उत्तर पूरी तरह से गलत है।
लोरेन

-3

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

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

आप बेहतर तरीके से कंस्ट्रक्टर में कीसेट के साथ ट्रीसेट का निर्माण कर सकते हैं।


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

-4

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

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


6
LinkedHashMapकक्षा का पूरा उद्देश्य नक्शे को पुनरावृत्त करते समय तत्वों के क्रम को बनाए रखना है और यह व्यवहार अच्छी तरह से निर्दिष्ट है। यदि आप आधार वर्ग विनिर्देश के अनुपालन के बिना एक उपवर्ग लिखते हैं, तो आप कुछ गलत कर रहे हैं।
जेकिनस्टर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.