2015-10-21 11 views
5

मुझे कुछ व्यवहार दिखाई दे रहा है कि मैं काफी समझ नहीं पा रहा हूं और सोच रहा था कि अगर कोई यहां पर क्या हो रहा है, यह समझाने के लिए पर्याप्त दयालु होगा। यह वर्तमान में मेरे पास कोड है।मैं गलत ArrayList से तत्व को क्यों हटा रहा हूं?

public class MyClass { 

    ArrayList<String> myList = new ArrayList<String>(); 

    public MyClass() { 
     populate(); 
     removeData(myList); 
    } 

    private void populate() { 
     myList.add("Some data"); 
     myList.add("Some more data"); 
     myList.add("Even more data"); 
    } 

    private void removeData(ArrayList<String> list) { 
     ArrayList<String> temp = new ArrayList<String>(); 
     temp = list; 
     temp.remove("Some data"); 
    } 
} 

अब किसी कारण से, के बाद मैं इस कोड को चलाने के लिए, डेटा ArrayList "MyList" से हटाया जा रहा है। यह क्यों हो रहा है, भले ही मुझे केवल "removeData" विधि के अंदर एक चर से डेटा निकालना है और "myList" फ़ील्ड से नहीं?

+1

लेकिन आप सौंपा 'अस्थायी = list' तो मूल रूप से एक ही वस्तु के संदर्भ – ochi

+0

ओर इशारा करते हैं जावा आवंटित वस्तु का जिक्र किया जाएगा जिक्र कर रहे थे संदर्भ, आपको जावा और ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग मूल बातें –

+0

के बारे में और अधिक पढ़ने की आवश्यकता है क्योंकि templist = mylist templist पर मेरी सूची का संदर्भ दे रहा है। इसलिए जो कुछ भी आप टेम्पलिस्ट पर करते हैं वह मेरी सूची को प्रभावित करेगा। –

उत्तर

6
temp = list; 

हालांकि आप विधि के अंदर निकाल रहे हैं, आप अभी भी एक उदाहरण सदस्य ओर इशारा करते हैं, इसलिए यह परिवर्तन देख सकते हैं।

यदि आप इंस्टेंस सदस्य को प्रभावित नहीं करना चाहते हैं तो आपको उन मानों के साथ एक नई सूची बनाने की आवश्यकता है।

3

करने के लिए अपने कोड में परिवर्तित करें:

private void removeData(ArrayList<String> list) { 
    ArrayList<String> temp = new ArrayList<String>(list); 
    temp.remove("Some data"); 
} 

और आप अपने वांछित व्यवहार मिलेगा (हालांकि यह वास्तव में बहुत मतलब नहीं है)। list को temp असाइन करना सूची में आइटम कॉपी नहीं करता है, लेकिन स्मृति के उसी क्षेत्र के लिए केवल एक संदर्भ निर्दिष्ट करता है।

1

जावा संदर्भों के साथ काम करता है, इसलिए जब आपने temp = list असाइन किया, तो दोनों चर एक ही ऑब्जेक्ट की ओर इशारा करते थे। इसके बजाय, आप list की एक प्रति बनाना चाहते:

private void removeData(ArrayList<String> list) { 
    ArrayList<String> temp = new ArrayList<String>(list); // Make a copy 
    temp.remove("Some data"); 
} 
1
ArrayList<String> temp = new ArrayList<String>(); 
    temp = list; 

पहली पंक्ति में आप नई सूची बना रहे हैं। उस बिंदु तक ठीक है। लेकिन अगली पंक्ति में आप list से temp का जिक्र कर रहे हैं। तो पहले वस्तु जो करने के लिए temp कचरा एकत्र temp एक ही वस्तु बनाया गया था जो Myclass निर्माता

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