2010-04-07 17 views
13

मुझे जावा ArrayList की उथली प्रतिलिपि की आवश्यकता है, क्या मुझे clone() का उपयोग करना चाहिए या मूल सूची में पुन: उपयोग करना चाहिए और तत्वों को नई सरणी सूची में कॉपी करना चाहिए, जो तेज़ है?ArrayList उथले प्रतिलिपि या क्लोन()

+1

प्रश्न दर्ज करने के दौरान, आपको देखा जाना चाहिए कि संबंधित प्रश्न की एक सूची पॉप अप हो गई है (वही सूची जैसा कि आप इस पृष्ठ के दाएं निचले कॉलम में देखते हैं)। क्या आप उनमें चारों ओर झुकते थे? उन उत्तरों को पर्याप्त क्यों नहीं थे? कृपया विस्तार से बताएं। – BalusC

+0

मैं पॉप अप पर गया था। ArrayList iterator बनाम क्लोन() के संदर्भ में प्रदर्शन से संबंधित कुछ भी नहीं था। – tech20nn

उत्तर

9

उपयोग clone(), या कॉपी-निर्माता का उपयोग करें।

कॉपी-कन्स्ट्रक्टर पास किए गए संग्रह से सरणी में अतिरिक्त परिवर्तन करता है, जबकि clone() विधि सीधे आंतरिक सरणी का उपयोग करती है।

ध्यान रखें कि clone()Object देता है, इसलिए आपको List पर जाना होगा।

+0

बिल्कुल मैंने java.util.ArrayList स्रोत कोड को देखा और पाया कि क्लोन() Array.copyof का उपयोग करता है, जो मूल पर लूपिंग से कहीं अधिक कुशल होगा सारणी सूची। सार्वजनिक वस्तु क्लोन() { कोशिश { @SuppressWarnings ("अनियंत्रित") ArrayList वी = (ArrayList ) super.clone(); v.elementData = Arrays.copyOf (elementData, आकार); v.modCount = 0; रिटर्न वी; } पकड़ें (क्लोन नॉटस्परपोर्ट अपवाद ई) { // ऐसा नहीं होना चाहिए, क्योंकि हम क्लोनेबल नए InternalError() को फेंकते हैं; } } – tech20nn

+1

मैं दक्षता के बारे में ज्यादा चिंता नहीं करता। क्लोन का उपयोग करना() एक दर्द है; सुझाए गए रूपांतरण कन्स्ट्रक्टर का उपयोग करें। –

+2

@ केविन बॉरिलियन आपको लगता है कि 'क्लोन()' का उपयोग दर्द क्यों है? 'क्लोन()' को लागू करना दर्द है, इसका उपयोग नहीं कर रहा है। – Bozho

34

कोई ज़रूरत नहीं दोहराना चाहते:

List original = ... 
List shallowCopy = new ArrayList(original); 

http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html#ArrayList%28java.util.Collection%29

+3

यह स्वीकार्य उत्तर होना चाहिए। – Kawu

+0

हालांकि यह थ्रेडसेफ नहीं है। (यहां समाप्त हुआ क्योंकि मुझे ConcurrentModificationException यह कर रहा है) – Gubatron

8

मैन्युअल रूप से पुन: प्रयास करने के बजाय आप copy constructor का उपयोग कर सकते हैं।

कि के बीच गति अंतर के लिए और का उपयोग कर clone() के रूप में:

  1. यह कोई फर्क नहीं पड़ता
  2. सबसे अधिक संभावना से कोई भी
  3. है अपने विशिष्ट सिस्टम विन्यास के लिए एक बेंचमार्क करो और मामले का उपयोग
+0

@ माइकल..धन्यवाद। मैंने कॉपी कन्स्ट्रक्टर के लिए कोड की जांच की। Bozho के रूप में उल्लिखित आंतरिक सरणी संरचना की प्रतिलिपि बनाने के लिए इसमें अतिरिक्त कदम है। सार्वजनिक ऐरेलिस्ट (संग्रह सी) { elementData = c.toArray(); आकार = elementData.length; यदि (elementData.getClass()! = ऑब्जेक्ट [] वर्ग) elementData = Arrays.copyOf (elementData, आकार, ऑब्जेक्ट [] वर्ग); } – tech20nn

+0

मुझे सार्वभौमिक पसंद है "क्या मुझे अनुकूलित करना चाहिए?" विचार पैटर्न –

-1

सवाल यह बताता है कि उथल-पुथल गहराई नहीं है। एक सरणी सूची संदर्भ से सीधे संदर्भ का पालन करना भी सही काम करेगा। प्रतिलिपि प्रतिलिपि में प्रति व्यक्ति शामिल है सरणी सूची में तत्व।

ArrayList<Integer> list=new ArrayList<Integer>(); 
list.add(3); 
ArrayList<Integer> list1=list; //shallow copy... 

क्या इसमें कोई समस्या है ??

+2

यह गलत है। यह सब यह होगा कि स्मृति में एक भौतिक 'ArrayList' ऑब्जेक्ट के लिए दो पॉइंटर्स होंगे। एक सूची में 'इंटीजर' जोड़ना' इंटीगर 'को अन्य सूची में भी प्रकट करता है। यही वह नहीं है जिसे हम चाहते हैं। शालो कॉपी अंतर्निहित वस्तुओं को समान स्मृति स्थान साझा करने के लिए बनाता है, लेकिन सूचियों में अलग मेमोरी स्पेस होती है। तो यदि आप एक 'इंटीगर' को संशोधित करते हैं, तो यह दोनों सूचियों में संशोधित किया जाएगा। लेकिन यदि आप एक सूची में 'इंटेगर' जोड़ते हैं, तो यह दूसरे में दिखाई नहीं देगा। दीप प्रति अन्य सूची में किसी भी चीज़ में किसी भी बदलाव को प्रतिबिंबित नहीं करेगा। – Antimonit

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