2009-03-11 12 views
6

मेरे पास मेरे आवेदन में दो प्रकार की वस्तुएं हैं जहां एक प्रकार की प्रत्येक वस्तु के दूसरे प्रकार की एक समान वस्तु है।जावा में मैप कुंजी के रूप में मनमानी वस्तुओं का उपयोग करने के लिए कोई नुकसान?

इस रिश्ते का ट्रैक रखने के स्वाभाविक पसंद एक HashMap की तरह एक Map<type1, type2> है। लेकिन किसी भी तरह, मैं संदिग्ध हूँ। क्या मैं किसी ऑब्जेक्ट को मानचित्र में एक कुंजी के रूप में उपयोग कर सकता हूं, इसे पास कर सकता हूं, इसे किसी अन्य संग्रह में भी बैठ सकता हूं, और किसी भी समय मानचित्र से अपने साथी को पुनर्प्राप्त कर सकता हूं?

के बाद एक वस्तु बन जाता है, सब मैं चारों ओर गुजर रहा हूँ में पहचान करने की सही है? तो शायद वहाँ कोई समस्या नहीं है। क्या होगा यदि मैं कुंजी को क्रमबद्ध और deserialize?

कोई अन्य चेतावनी? क्या मुझे ऑब्जेक्ट जोड़े को सहसंबंधित करने के लिए कुछ और उपयोग करना चाहिए, जैसे कि मैं खुद को उत्पन्न करता हूं?

उत्तर

22
  1. कुंजी जरूरतों को लागू करने के .equals() और .hashCode() सही ढंग से
  2. कुंजी किसी भी तरह से है कि बदलता है यह .hashCode() मूल्य है, जबकि यह कुंजी
  3. आदर्श रूप में
  4. किसी भी वस्तु एक प्रमुख के रूप में इस्तेमाल के रूप में प्रयोग किया जाता है में नहीं बदला किया जाना चाहिए HashMap में अपरिवर्तनीय होना चाहिए। यह स्वचालित रूप से सुनिश्चित करेगा कि 2. हमेशा सत्य होता है।
  5. ऑब्जेक्ट जो अन्यथा जीसीड हो सकते हैं उन्हें चारों ओर रखा जा सकता है जब उन्हें कुंजी और/या मूल्य के रूप में उपयोग किया जाता है।
0

किसी भी वस्तु मानचित्र कुंजी हो सकता है। यहां महत्वपूर्ण बात यह सुनिश्चित करने के लिए है कि आप किसी भी ऑब्जेक्ट के लिए .equals() और .hashCode() को ओवरराइड करें जो मानचित्र कुंजी के रूप में उपयोग किया जाएगा।

ऐसा करने का कारण यह है कि यदि आप नहीं करते हैं, तो बराबर वस्तु वस्तु समानता के रूप में समझा जाएगा, और एकमात्र तरीका आपको "बराबर" नक्शा कुंजी खोजने में सक्षम होगा मूल ऑब्जेक्ट को संभालना अपने आप।

आप ओवरराइड hashCode क्योंकि यह बराबरी के अनुरूप होना चाहिए। ऐसा इसलिए है कि ऑब्जेक्ट्स जिन्हें आपने समान रूप से बराबर परिभाषित किया है।

0

विफलता बिंदु हैशकोड और कार्यों के बराबर हैं। यदि वे लगातार और उचित वापसी मूल्य नहीं बनाते हैं, तो नक्शा अजीब तरीके से व्यवहार करेगा। Effective Java पर उनका पूरा अनुभाग है और अत्यधिक, अत्यधिक अनुशंसित है।

7

मैं अपने आवेदन जहां एक तरह का हर वस्तु ठीक एक इसी अन्य प्रकार के वस्तु है में वस्तुओं के दो प्रकार की है।

यह वास्तव में एक रिश्ते की तरह लगता है और इस प्रकार एक साधारण विशेषता का उपयोग करके लागू किया जा सकता है।

+0

मैं सहमत हूं। शेष प्रश्न अभी भी दूसरों के लिए उपयोगी हो सकता है, हालांकि। (या यहां तक ​​कि @OP के लिए यदि यह किसी कारण से कोई विकल्प नहीं है) –

+0

@ सोआ मैं आपके साथ सहमत हूं। हालांकि मैं इस विशेष संदर्भ में विशेषताओं की प्रयोज्यता को इंगित करता हूं। –

1

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

और जब तक आप बराबर के रूप में एक वस्तु के कई उदाहरण पर विचार करने के लिए है BTW आप बराबरी और hashCode ओवरराइड करने के लिए नहीं है ...

1

क्या मैं किसी ऑब्जेक्ट को मानचित्र में एक कुंजी के रूप में उपयोग कर सकता हूं, इसे पास कर सकता हूं, इसे किसी अन्य संग्रह में भी बैठ सकता हूं, और किसी भी समय मानचित्र से अपने साथी को पुनर्प्राप्त कर सकता हूं?

हां, यहां कोई समस्या नहीं है।

किसी ऑब्जेक्ट के निर्माण के बाद, मैं चारों ओर गुजर रहा हूं, एक पहचानकर्ता है, है ना? तो शायद वहाँ कोई समस्या नहीं है। क्या होगा यदि मैं कुंजी को क्रमबद्ध और deserialize?

यह सही है, आप केवल एक संदर्भ पास कर रहे हैं - वे सभी एक ही वास्तविक वस्तु को इंगित करेंगे। यदि आप ऑब्जेक्ट को क्रमबद्ध या deserialize, तो एक नई वस्तु पैदा करेगा। हालांकि, यदि आपका ऑब्जेक्ट बराबर है और हैशकोड ठीक से लागू करता है, तो आपको मानचित्र से आइटम पुनर्प्राप्त करने के लिए अभी भी नई deserialized ऑब्जेक्ट का उपयोग करने में सक्षम होना चाहिए।

कोई अन्य चेतावनी? क्या मुझे ऑब्जेक्ट जोड़े को सहसंबंधित करने के लिए कुछ और उपयोग करना चाहिए, जैसे कि मैं खुद को उत्पन्न करता हूं?

गुफाओं के लिए, हाँ, आप किसी भी चीज को नहीं बदल सकते हैं जिससे ऑब्जेक्ट के हैशकोड को मानचित्र में बदलते समय ऑब्जेक्ट का बदलना होगा।

3

यह नक्शा आप चुनते के कार्यान्वयन पर निर्भर करती है:

  • HashMapबराबर() और hashCode() उपयोग करता है। डिफ़ॉल्ट रूप से (ऑब्जेक्ट में) ये ऑब्जेक्ट पहचान पर आधारित होते हैं, जो तब तक ठीक काम करेंगे जब तक आप serialize/deserialize नहीं करते। ऑब्जेक्ट की सामग्री के आधार पर बराबर() और हैशकोड() के उचित कार्यान्वयन के साथ आपको कोई समस्या नहीं होगी, जब तक कि आप इसे संशोधित नहीं करते हैं, जबकि यह हैश मानचित्र में एक कुंजी है।

  • ट्रीमैपतुलना करने के लिए उपयोग करता है()। कोई डिफ़ॉल्ट कार्यान्वयन नहीं है, इसलिए आपको एक प्रदान करने की आवश्यकता है। उपरोक्त हैशकोड() और बराबर() को लागू करने के लिए समान सीमाएं लागू होती हैं।

0

आप Google संग्रह के BiMap पर विचार कर सकते हैं।

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