मुझे पता है LinkedHashMapकि एक पूर्वानुमेय चलना आदेश (प्रविष्टि क्रम) है। क्या इसके Setद्वारा लौटाया गया LinkedHashMap.keySet()और Collectionलौटाया गया LinkedHashMap.values()ऑर्डर भी बरकरार है?
मुझे पता है LinkedHashMapकि एक पूर्वानुमेय चलना आदेश (प्रविष्टि क्रम) है। क्या इसके Setद्वारा लौटाया गया LinkedHashMap.keySet()और Collectionलौटाया गया LinkedHashMap.values()ऑर्डर भी बरकरार है?
जवाबों:
मैप इंटरफ़ेस तीन संग्रह दृश्य प्रदान करता है , जो मानचित्र की सामग्री को कुंजी, मानों के संग्रह, या कुंजी-मूल्य मैपिंग के सेट के रूप में देखा जा सकता है। आदेश एक मानचित्र की जिस क्रम में नक्शे के संग्रह विचारों पर iterators उनके तत्वों वापसी के रूप में परिभाषित किया गया है। कुछ मानचित्र कार्यान्वयन,
TreeMapवर्ग की तरह , उनके आदेश के अनुसार विशिष्ट गारंटी देते हैं; अन्य,HashMapवर्ग की तरह , नहीं।
- मानचित्र
यह लिंक की गई सूची पुनरावृति क्रम को परिभाषित करती है, जो सामान्य रूप से वह क्रम है जिसमें कुंजियों को मानचित्र ( प्रविष्टि-क्रम ) में डाला गया था ।
तो, हाँ, keySet(), values(), और entrySet()क्रम में (तीन संग्रह विचारों का उल्लेख) वापसी मान आंतरिक लिंक्ड सूची का उपयोग करता है। और हाँ, इसके लिए जावाडॉक Mapऔर LinkedHashMapगारंटी।
इस वर्ग की बात है, सब के बाद।
Collectionक्या मान देता है () रिटर्न के लिए बस बेस क्लास है। इसके द्वारा संग्रहित संग्रह का कार्यान्वयन अभी भी नियंत्रित है LinkedHashMap। एक LinkedHashMapमामले में, यह एक LinkedValuesउदाहरण लौट रहा है , लिंक्डहाशपेज़.जावा के अंदर एक निजी वर्ग।
Map) से लिंक करने के लिए धन्यवाद जो मानचित्र के संग्रह के विचारों पर चलने वालों के लिए मानचित्र के आदेश को स्पष्ट रूप से रखता है (और उन संग्रह विचारों को स्पष्ट कर रहा है)। वह मेरे लिए गायब टुकड़ा था।
स्रोत को देखते हुए, ऐसा लगता है कि यह करता है। keySet(), values()और entrySet()सभी आंतरिक रूप से एक ही प्रविष्टि पुनरावृत्ति का उपयोग करते हैं।
सेट के साथ भ्रमित न हों 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।
आप ऐसा मान सकते हैं। जावाडोक कहते हैं, 'उम्मीद के मुताबिक यात्रा के क्रम', और केवल iterators एक मानचित्र में उपलब्ध हैं () कीसेट (), entrySet (), और मूल्यों के लिए उन।
इसलिए किसी और योग्यता के अभाव में यह स्पष्ट रूप से उन सभी पुनरावृत्तियों पर लागू होता है।
AFAIK यह प्रलेखित नहीं है, इसलिए आप "औपचारिक रूप से" ऐसा नहीं मान सकते। हालाँकि, यह संभव नहीं है कि वर्तमान कार्यान्वयन बदल जाएगा।
यदि आप आदेश सुनिश्चित करना चाहते हैं, तो आप नक्शे में प्रवेश करने से अधिक पुनरावृत्त करना चाहते हैं और उन्हें अपनी पसंद के ऑर्डर फ़ंक्शन के साथ सॉर्ट किए गए सेट में सम्मिलित कर सकते हैं, हालांकि आप स्वाभाविक रूप से एक प्रदर्शन लागत का भुगतान करेंगे।
इंटरफ़ेस को देखते हुए यह एक सादा रिटर्न देता है Setन कि एक SortedSet। इसलिए कोई गारंटी नहीं है।
कार्यान्वयन (हमेशा एक बुरा विचार) को देखते हुए एक अंतर्निहित गारंटी लेने से पहले अन्य सभी जावा कार्यान्वयन में कार्यान्वयन को भी देखें :)
आप बेहतर तरीके से कंस्ट्रक्टर में कीसेट के साथ ट्रीसेट का निर्माण कर सकते हैं।
मुझे नहीं लगता कि आप कीसेट () और मूल्यों () के आदेश को मान सकते हैं।
जब तक मैं मैप में परिभाषित इन दो तरीकों के अनुबंध से जुड़ा रहता हूं, और हैशपैड में ओवरराइड किया जाता है, तब तक मैं आसानी से लिंक्डहैश मैप का कार्यान्वयन लिख सकता हूं जो आपको बिना चाबी केसेट () और मान () देता है।
LinkedHashMapकक्षा का पूरा उद्देश्य नक्शे को पुनरावृत्त करते समय तत्वों के क्रम को बनाए रखना है और यह व्यवहार अच्छी तरह से निर्दिष्ट है। यदि आप आधार वर्ग विनिर्देश के अनुपालन के बिना एक उपवर्ग लिखते हैं, तो आप कुछ गलत कर रहे हैं।
values()साथ ही साथkeySet(), मैंने इस प्रश्न को शामिल करने के लिए विस्तार किया है। इसका मतलब यह है कि इस के डुप्लिकेट के रूप में अधिक प्रश्न बंद किए जा सकते हैं।