2011-04-28 11 views
10

Map.putAll मानचित्र पर Map.put(k, v) पर कॉल करने के बराबर है जो एक बार निर्दिष्ट मानचित्र में कुंजी के से मूल्य v तक प्रत्येक मैपिंग के लिए होता है। तो कार्यात्मक पहलू के साथ, दोनों एक ही हैं।Map.put और Map.put सभी तरीकों के बीच अंतर?

तो, मुझे यह जानकर उत्सुकता है कि अन्य मतभेद क्या हैं और किस का उपयोग करना है?

उत्तर

4

putAll(Map) का उपयोग करें जब आपके पास अपने मानचित्र में कई मूल्यों का मानचित्र है, और put(K,V) का उपयोग करें जब आपके पास एक या दो मूल्य हैं जो आप अपने मानचित्र में जोड़ना चाहते हैं।

putAll(Map) अधिकांश कार्यान्वयन में बस put(K,V) को लूप में कॉल करता है, source पढ़ें।

+3

वह अंतिम पंक्ति थोड़ा भ्रामक है। यद्यपि आप वर्णन के रूप में AbstractMap _does_ काम करते हैं, अन्य ठोस नक्शा कार्यान्वयन नहीं करते हैं। –

+0

@ पॉल: +1, आप सही हैं। यह एक सरलीकरण का थोड़ा सा है, लेकिन मुझे विश्वास है कि अधिकांश मानचित्र इंटरफ़ेस अनुपालन कार्यान्वयन इस तरह से काम करते हैं, क्योंकि मानचित्र इंटरफ़ेस इतना अधिक छूट नहीं देता है। –

5

के रूप में किए गए दस्तावेज़ों में कहा गया है:

Map.put

इस मानचित्र में (वैकल्पिक ऑपरेशन) में निर्दिष्ट कुंजी के साथ निर्दिष्ट मान को संबद्ध करता है। यदि नक्शा में पहले कुंजी के लिए मैपिंग था, तो पुराना मान निर्दिष्ट मान द्वारा प्रतिस्थापित किया गया है। (एक नक्शा मीटर कहा जाता है कि एक प्रमुख कश्मीर के लिए एक मानचित्रण शामिल करता है, तो और केवल तभी m.containsKey (के) सच लौट आते हैं।)

आप नक्शे में एक भी कुंजी-मान पेयर डाल करने के लिए अनुमति देता है ।

Map.putAll

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

सभी डेटा एक मानचित्र से दूसरे मानचित्र पर डाल दें।


जब जो एक उपयोग कैसे करें?

आप दूसरे के नक्शे से पूरा डेटा कॉपी करना चाहते हैं तो आप map.putAll किसी और उपयोग कर सकते हैं तो आप बस एक कुंजी-मान map.put का उपयोग कर इस जोड़ी को जोड़ सकते हैं।


Map.putAll बुला Map.put की है कि के बराबर है (के, वी) निर्दिष्ट नक्शे में मूल्य v की कुंजी कश्मीर से प्रत्येक मानचित्रण के लिए नक्शा एक बार पर। तो कार्यात्मक पहलू दोनों समान हैं।

नहीं है जब आप hasmap में नक्शे को लागू फिर एक और का उपयोग कर डाल करने के लिए एक नक्शा कॉपी करने के लिए (के, वी) और अधिक प्रयास का समय लगेगा और आप और अधिक putAll (एम) का उपयोग करते हुए हम एक ही लाइन के साथ नक्शा कॉपी कर सकते हैं कोडिंग कह सकते हैं कोड।

0

Map.put(Object key, Object value) आपको Map.putAll(Map t) में एक ही प्रविष्टि जोड़ने की अनुमति देता है, निर्दिष्ट मानचित्र पर मानचित्र टी में मौजूद सभी प्रविष्टियों को जोड़ता है। putAll() दो मैप्स के संयोजन के दौरान उपयोगी है।

4

के बाद से मानचित्र सिर्फ एक इंटरफेस, किसी भी कार्यान्वयन के बिना है, वहाँ नहीं एक putAll और बार-बार के बीच कोई अंतर कार्यात्मक अंतर, जैसे कि, कोई भी अन्य की तुलना में डाल दिया हो सकता है। यदि आप मानचित्र (जैसे हैश मैप) के व्यक्तिगत कार्यान्वयन को देखते हैं तो एक प्रदर्शन समस्या हो सकती है। एक डाल दिया गया है कम से कम किसी भी उचित कार्यान्वयन के लिए बार-बार डालने के रूप में कुशल होना चाहिए, लेकिन यह बिल्कुल वही हो सकता है।

+3

+1 - आपने मुझे हराया ... और आपने केवल एपीआई विवरणों को पढ़ने के बजाय ओपी के प्रश्न का उत्तर दिया। –

9

यह .. निर्भर करता है।

put और putAll, इंटरफ़ेस तरीके हैं तो कि इंटरफ़ेस के हर वास्तविक कार्यान्वयन की गारंटी देगा, put विधि नक्शा whil putAll स्रोत से सभी कुंजी/मान जोड़े रखा जाएगा में एक भी मुख्य/मान जोड़े डालता है।

लेकिन यह लागू करने के लिए पर और इसके अलावा क्या करना है (आंतरिक रूप से)।

निश्चित रूप से, एक छोटा कार्यान्वयन स्रोत मानचित्र के प्रत्येक प्रविष्टि के लिए put पर कॉल करेगा, लेकिन शायद कोई लक्ष्य प्राप्त करने के लिए किसी अन्य विधि का आविष्कार करेगा। या जोड़े जोड़ने में प्रवेश करते समय putAll कुछ अन्य मानचित्र आंतरिक सामान पहले/बाद/करते समय करेंगे।

अंगूठे का मेरा नियम: यदि आपको सभी कुंजी/मूल्य जोड़े को एक मानचित्र से दूसरे में रखना है, तो कार्यान्वयन की चतुरता पर भरोसा करें और putAll विधि का उपयोग करें। हमेशा एक अच्छा मौका है कि यह मैन्युअल रूप से सभी जोड़े के लिए put पर कॉल करने से बेहतर प्रदर्शन प्रदान करता है।

2

सबसे स्पष्ट अंतर सिंक्रनाइज़ संग्रह है।

एक synchornized नक्शा के लिए, putAll एक भी आपरेशन के रूप में सभी प्रविष्टियों जोड़ देगा। यदि आपके पास दो मान हैं जो अलग-अलग मानों के साथ एक ही कुंजी को रखने का प्रयास कर रहे हैं, तो आपको केवल मूल्यों का एक पूरा सेट प्राप्त होगा। यानी पहले या दूसरे धागे से, लेकिन कुछ संयोजन नहीं।

आप दो धागे में डाल का उपयोग करते हैं() बार-बार, तो आप जो एक वैध संयोजन नहीं हो सकता है मूल्यों को बनाए रखा जा रहा है के किसी भी संयोजन मिल सकती है।


मैंने देखा है/पुट() और putAll के लिए लागू व्यवहार संचालन()। जब डाल दिया जाता है सभी लेनदेन होता है, तो सभी या कोई भी कुंजी/मान जोड़े नहीं जाएंगे। जैसे अगर किसी कारण से कोई कुंजी या मूल्य जोड़ा नहीं जा सकता है। यदि आप put() का उपयोग कर रहे हैं तो केवल अविभाज्य कुंजी/मान (और संभवतः कोई भी जोड़ा नहीं गया) बंद हो जाएगा, संभावित अपूर्ण अद्यतन कर रहा है।

1

डाल के बजाय putAll का उपयोग करते समय मुझे एक बड़ा प्रदर्शन लाभ दिखाई देता है। देखें नीचे दिए गए नमूना कार्यक्रम:

सार्वजनिक वर्ग SampleTest {

public static void main(final String[] args) { 

    final Map<String, String> testMap = new HashMap<>(); 
    final Map<String, String> testMap2 = new HashMap<>(); 

    final LocalDateTime startTestTime = LocalDateTime.now(); 
    for(int i=0; i < 1000000; i++) { 
     testMap.put(i+"", i+""); 
    } 
    final LocalDateTime endTestTime = LocalDateTime.now(); 
    System.out.println("<<<<<<<<<Time for put>>>>>>>>>>>"); 
    System.out.println(ChronoUnit.MILLIS.between(startTestTime, endTestTime)); 

    final LocalDateTime startTestTime1 = LocalDateTime.now(); 
    testMap2.putAll(testMap); 
    final LocalDateTime endTestTime1 = LocalDateTime.now(); 
    System.out.println("<<<<<<<<<Time for put all>>>>>>>>>>>"); 
    System.out.println(ChronoUnit.MILLIS.between(startTestTime1, endTestTime1)); 
} 

}

यह रिटर्न (मिलीसेकंड में):

<<<<<<<<<Time for put>>>>>>>>>>> 
1934 
<<<<<<<<<Time for put all>>>>>>>>>>> 
116 

निष्कर्ष: putAll() निश्चित रूप से अधिक है नीचे अस्वीकरण के साथ put() से प्रदर्शन करने वाला। 1. यह परिणाम मेरी मशीन पर है (यानी मशीन कॉन्फ़िगरेशन पर निर्भर करता है)। लेकिन आप अभी भी एक विस्तृत अंतर देखते हैं। 2. जैसा कि उपरोक्त मेटोन एक इंटरफ़ेस है, इसलिए प्रदर्शन कार्यान्वयन पर निर्भर करेगा, मैंने हैश मैप को माना है क्योंकि इसका व्यापक रूप से उपयोग किया जाता है। तो यदि प्रदर्शन एक बाधा है तो आप कम से कम हैश मैप के लिए putAll() को प्राथमिकता दे सकते हैं।

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