किसी ArrayList में एक ऑब्जेक्ट जोड़ें और इसे बाद में संशोधित करें


80

यदि मेरे पास एक ArrayList है, और मैंने इसमें एक ऑब्जेक्ट जोड़ा है, और बाद में मैंने इस ऑब्जेक्ट को संशोधित किया है, तो क्या यह परिवर्तन ArrayList में प्रतिबिंबित होगा? या जब मैं ऑब्जेक्ट को ArrayList में जोड़ता हूं, तो Java एक प्रति बनाता है और उसे ArrayList में जोड़ता है?

क्या होगा अगर मैं इस ऑब्जेक्ट के संदर्भ को शून्य में बदल दूं? इसका मतलब यह है कि ArrayList में वस्तु अब भी शून्य है?


1
यह प्रश्न (और उत्तर) वास्तव में एक बुकमार्क के योग्य है!
टेरी

बस सभी प्रश्न मैं पूछने वाला था :)
navid

जवाबों:


84

क्या यह परिवर्तन ArrayList में प्रतिबिंबित होगा?

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


या जब मैं ऑब्जेक्ट को ArrayList में जोड़ता हूं, तो Java एक प्रति बनाता है और उसे ArrayList में जोड़ता है?

नहीं, यह ऑब्जेक्ट को कॉपी नहीं करेगा। (यह ऑब्जेक्ट के संदर्भ को कॉपी करेगा।)


क्या होगा अगर मैं इस ऑब्जेक्ट के संदर्भ को शून्य में बदल दूं? इसका मतलब यह है कि ArrayList में वस्तु अब भी शून्य है?

नहीं, क्योंकि सूची में जोड़े जाने पर मूल संदर्भ की सामग्री की प्रतिलिपि बनाई गई थी । (ध्यान रखें कि यह वह संदर्भ है जिसे कॉपी किया गया है, वस्तु नहीं।)

प्रदर्शन:

StringBuffer sb = new StringBuffer("foo");

List<StringBuffer> list = new ArrayList<StringBuffer>();
list.add(sb);

System.out.println(list);   // prints [foo]
sb.append("bar");

System.out.println(list);   // prints [foobar]

sb = null;

System.out.println(list);   // still prints [foobar]

इसके बारे में क्या: बटन एक नया बटन; बटन b = नया बटन; बटन वर्तमान = ए; List.add (वर्तमान); वर्तमान = बी; यदि मैं सूची सामग्री को प्रिंट करता हूं तो यह "ए" या "बी" होगा?
लोरेंजो साइकोटो

1
@aioobe आपका उत्तर आपकी पोस्ट के पहले बिंदु के साथ संघर्ष करने के लिए लगता है, जहाँ आप कहते हैं कि ऑब्जेक्ट का संदर्भ कॉपी किया गया है (इस मामले में, 'वर्तमान'), जिसे बाद में b से बदल दिया जाता है। मुझे उम्मीद है कि यह प्रिंट बी। क्या आप विस्तार से समझा सकते हैं?
Jan K.

2
बस ध्यान रखें कि जावा हमेशा मूल्य से गुजरता है (वस्तुओं के विशेष संदर्भ में मूल्य द्वारा पारित किया जाता है) और यह सभी स्पष्ट होना चाहिए।
aioobe

यह जोड़ने Stringऔर फिर इसे बदलने के लिए मामला नहीं लगता है। यानीString a = "first"; list.add(a); a = "second"; ...print(list.get(0)) // "first"
डॉन चेडल

मुझे लगता है कि आप स्पष्ट करना चाहते हैं कि इसका मतलब क्या है कि इसका मतलब pass by valueयह होगा कि आपको जो भेजा गया था उसे बदल नहीं दिया जा सकता क्योंकि मूल्य भेजा गया है, न कि किसी चीज का संदर्भ
डॉन चेडल

5

सूची में ऑब्जेक्ट में कोई भी परिवर्तन परिलक्षित होगा।

हालांकि, जब आप स्ट्रिंग्स जैसी वस्तुओं के साथ सौदा करते हैं जो अपरिवर्तनीय हैं, तो "परिवर्तन संचालन" पर एक नई वस्तु बनाई जाएगी। वास्तव में आपकी पुरानी वस्तु अभी भी सूची में है, जबकि आपको कहीं और नया मिला है।


यह एक बहुत ही महत्वपूर्ण अंतर है
डॉन चेडल

1

आप सभी लोगों को धन्यवाद। मैंने आपके पोस्ट पढ़कर इसे फिर से समझ लिया। यह शायद एक भ्रामक अवधारणा है, क्योंकि मैंने इसे बहुत पहले ही पचा लिया था, लेकिन हाल ही में मैं भूल गया कि यह फिर से कैसे काम करता है। इसलिए मैं उस समस्या को साझा करना चाहता हूं जो मेरे लिए समस्या का समाधान करती है। (ध्यान दें कि जावा में गैर-आदिम वस्तुएँ (प्राइमेटिव इंट, बूलियन, आदि हैं) तकनीकी रूप से इंगित हैं)। जब यू जोड़ने ओ वस्तु एक सूची, सूची और करने के लिए एक ही बात करने के लिए अंक इसलिए जब यू संशोधित सूची के मद बदल जाता है। यह तब तक है जब तक वे एक ही चीज की ओर इशारा करते हैं और तब टूट जाते हैं जब ओ = किसी और चीज की ओर इशारा करते हैं ।

o = null;   //o points to nothing and changes in o from now on doesn't effect the list's item

या

Object a = new Object();
o = a;    //o and the list's item don't point to same thing so changes in o doesn't effect the list's item (but it effects a)

आशा है कि यह किसी की मदद करता है


-1

एक और प्रदर्शन जोड़ना चाहते थे जहां ArrayList एक मानचित्र के मान के रूप में है। ArrayList को मैप में जोड़ने के बाद संशोधित किया गया है और मैप परिवर्तनों को दर्शाता है।

मानचित्र में मां के नाम के साथ एक तत्व होता है और मूल्य के रूप में बच्चे।

    String key = "adeleMom";
    Map<String, ArrayList<String>> myMap = new HashMap<String, ArrayList<String>>();
    ArrayList<String> firstList = new ArrayList<String>();
    firstList.add("adele");
    myMap.put(key, firstList);
    firstList = null;
    ArrayList secondList = myMap.get(key);
    System.out.println(secondList); // prints [adele]
    secondList.add("bonnie");
    System.out.println("Added bonnie");
    ArrayList thirdList = myMap.get(key);
    System.out.println(thirdList); // prints [adele, bonnie]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.