2010-11-21 18 views
11

क्यों मैं के साथ अलग व्यवहार मिलता है:जावा addAll (संग्रह) नए बनाम ArrayList (संग्रह)

  1. Collection col2 = new ArrayList(col);

  2. Collection col2 = new ArrayList();
    col2.addAll(col)

मैं काम कर रहा हूँ दर्शकों के साथ, और कोड जटिल है, और मैं समस्या की "मूल" को समझाने की कोशिश कर रहा हूं । एक और दिलचस्प तथ्य यह है कि अगले एक है ...

//IF i use this code i have the correct behavior in my app: 
public void updateCollection(Collection<Object> col) { 
    this.objectCollection.clear(); 
    this.objectCollection.addAll(col); 
} 

//IF i use this code i have unexpected behavior in my app: 
public void updateCollection(Collection<Object> col) { 
    this.objectCollection=new ArrayList(col); 
} 
+7

कृपया स्पष्ट करें, कौन सा सटीक व्यवहार आपके लिए भ्रमित कर रहा है? –

+0

मेरे कोड में ए का उपयोग कर अलग-अलग व्यवहार हैं) या बी)। मेरे दिमाग में, दोनों परिचालन एक ही परिणाम के लिए नेतृत्व करेंगे, लेकिन स्पष्ट रूप से वे नहीं करते हैं। कुछ अलग है। – marcolopes

+2

आप अभी भी अस्पष्ट हैं। क्या होता है? क्या नहीं होता कृपया अपने पर्यावरण पर (अन) अपेक्षित परिणामों के साथ एक [एसएससीसीई] (http://sscce.org) पोस्ट करें। – BalusC

उत्तर

14

इस कोड काम करता है:

public void updateCollection(Collection<Object> col) { 
    this.objectCollection.clear(); 
    this.objectCollection.addAll(col); 
} 

लेकिन इस समस्याओं का परिचय:

public void updateCollection(Collection<Object> col) { 
    this.objectCollection=new ArrayList(col); 
} 

मुझे लगता है कि अपने पहले पद्धति पर इस बदलाव समान समस्याओं को पेश होगा:

public void updateCollection(Collection<Object> col) { 
    this.objectCollection = new ArrayList(); 
    this.objectCollection.clear(); 
    this.objectCollection.addAll(col); 
} 

क्यों? स्पष्ट रूप से आपके पास कहीं भी उपयोग में ऑब्जेक्ट चयन का एक और संदर्भ है। कहीं आपके कोड में, एक और ऑब्जेक्ट कह रहा है (उदाहरण के लिए):

myCopyOfObjectCollection = theOtherObject.objectCollection;

यदि आप गेटर का उपयोग कर रहे हैं, तो यह अंतर्निहित व्यवहार नहीं बदलता है - आप अभी भी एक और संदर्भ रखते हैं।

तो अगर प्रारंभिक काम पर, कहते हैं, संग्रह निहित {1, 2, 3}, तुम बाहर के साथ शुरू:

  • this.objectCollection: {1, 2, 3}
  • कि।copyOfObjectCollection: {1, 2, 3}

जब आप this.objectCollection करने के लिए एक नई ArrayList असाइन करें और साथ, कहते हैं पॉप्युलेट, {4, 5, 6}, तो आप इस मिल:

  • this.objectCollection: {4, 5, 6}
  • that.copyOfObjectCollection: {1, 2, 3}

"है कि" अभी भी मूल ArrayList की ओर इशारा करते है।

5
Collection col2 = new ArrayList(col); 

एक नया ArrayList आकार col.size() (+ 10%) के साथ पैदा करेगा और उस सरणी में col से सभी तत्वों को कॉपी।

Collection col2 = new ArrayList(); 

प्रारंभिक आकार 10 (कम से कम सूर्य कार्यान्वयन में) के साथ एक नया ऐरेलिस्ट बना देगा।

col2.addAll(col); 

col2ArrayList के अंत में col से सभी तत्वों को कॉपी,, समर्थन सरणी आकार के विस्तार अगर जरूरत होगी।

तो, आपके col संग्रह आकार के आधार पर, व्यवहार थोड़ा अलग होगा, लेकिन बहुत अधिक नहीं होगा।

पहले विकल्प का उपयोग करना बेहतर है - जो कम से कम एक अतिरिक्त बैकिंग सरणी विस्तार ऑपरेशन से बच जाएगा।

+0

पहला दृष्टिकोण का उपयोग करके मेरा कोड काम नहीं करता है ... – marcolopes

0
public List getAdminImIdsWithValidShortNames(){ 
    return adminImIdsWithValidShortNames; 
} 

public void setAdminImIdsWithValidShortNames(List adminImIdsWithValidShortNames){ 
    this.adminImIdsWithValidShortNames=adminImIdsWithValidShortNames; 
} 

मुझे लगता है, आसान सुंदर है, केवल जेनरेटर सेटर/गेटर विधि एक अच्छी आदत है। यदि आप पहले साफ़ करते हैं, तो जोड़ें, सूची को सूची के सभी तत्वों को साफ़ करने की आवश्यकता है, फिर जोड़ें अतिरिक्त अतिरिक्त सरणी विस्तार ऑपरेशन होगा, यह विज्ञान नहीं है।

बस प्रतिस्थापन, यह चर नई सूची के लिए इंगित होगा, पुरानी सूची ऑटो-जीसी होगी।

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