2012-06-27 18 views
6

के साथ कॉपी कन्स्ट्रक्टर मैं किसी ऑब्जेक्ट के लिए एक प्रतिलिपि बनाने की कोशिश कर रहा हूं और पैरामीटर में से एक एक ArrayList है।ArrayList पैरामीटर

जब ऐरेलिस्ट ऑब्जेक्ट बनाते हैं, तो मुझे एरेलिस्ट कन्स्ट्रक्टर का उपयोग करने के लिए ध्यान में रखा गया था, जहां आप एक पैरामीटर के रूप में संग्रह पास कर सकते हैं, लेकिन मुझे यकीन नहीं है कि यह सरणी सूची में "पॉइंटर" के रूप में काम करेगा या नहीं एक पूरी नई ArrayList वस्तु

पैदा करेगा यह वह जगह है कोड मैं

public MyObject(MyObject other) 
{ 
    this.brands= other.brands; 
    this.count = other.count; 
    this.list = new ArrayList<Integer>(other.list); // will this create a new array list with no pointers to other.list's elements? 

} 
+0

यह तत्वों की प्रतियां नहीं बनाएगा। (और imho opionion कि अजीब होगा।) – esej

+2

आप अपने आप को ArrayList के स्रोत कोड की समीक्षा कर सकते हैं। यह आपके जेडीके के साथ शामिल है। –

उत्तर

17

मुझे यकीन है कि अगर यह ArrayList के लिए एक "सूचक" के रूप में काम करेंगे या यदि यह एक पैदा करेगा नहीं कर रहा हूँ पूरी नई सरणी वस्तु ऑब्जेक्ट

जब आप new का उपयोग करते हैं, तो ArrayList (यह वही है जो आपने पूछा है) का एक ब्रांड स्पैंकिंग नया उदाहरण बनाएं। लेकिन यह नहीं स्वचालित रूप से इसके तत्वों की प्रतियां भी बनायेगा (जो मुझे लगता है कि आप जो खोज रहे हैं)। इसका अर्थ यह है कि, यदि आप नई सूची में एक म्यूटेबल ऑब्जेक्ट बदलते हैं, तो यह मूल सूची में भी बदल जाएगा, अगर यह अभी भी आसपास है। ऐसा इसलिए है क्योंकि सूची में केवल Object एस में संदर्भ (थोड़े सॉर्टा लेकिन सटीक पॉइंटर्स नहीं) हैं, वास्तविक Object स्वयं नहीं।

उदाहरण के लिए:

Person person = new Person("Rob"); // create a new Object 

List<Person> myList = new ArrayList<Person>(); 
myList.add(person); 

// Create another list accepting the first one 
List<Person> myList2 = new ArrayList<Person>(myList); 

for(Person p : myList2) { 
    p.setName("John"); // Update mutable object in myList2 
} 

person = new Person("Mary"); // stick another object into myList2 
myList2.add(person); 

for(Person p : myList2) { 
    System.out.println(p.getName()); // prints John and Mary as expected 
} 

for(Person p : myList) { 
    System.out.println(p.getName()); // prints only one result, John. 
} 

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

+0

तो आप एक कॉपी कन्स्ट्रक्टर में एक ब्रांड नई सूची बनाने का सबसे अच्छा अभ्यास क्या कहेंगे? एक नई सूची को तत्काल करें, पुरानी सूची के माध्यम से पुनरावृत्त करें, और नई सूची में नई वस्तुएं जोड़ें? – ashishduh

+0

बहुत ज्यादा। इस लिंक को आजमाएं: http://stackoverflow.com/a/715660/473637 – Jeshurun