मेरे पास ArrayList<String>
एक कॉपी है जिसे मैं वापस करना चाहूंगा। ArrayList
एक क्लोन विधि है जिसमें निम्नलिखित हस्ताक्षर हैं:
public Object clone()
इस विधि को कॉल करने के बाद, मैं लौटी हुई वस्तु को वापस कैसे डालूं ArrayList<String>
?
मेरे पास ArrayList<String>
एक कॉपी है जिसे मैं वापस करना चाहूंगा। ArrayList
एक क्लोन विधि है जिसमें निम्नलिखित हस्ताक्षर हैं:
public Object clone()
इस विधि को कॉल करने के बाद, मैं लौटी हुई वस्तु को वापस कैसे डालूं ArrayList<String>
?
जवाबों:
ArrayList newArrayList = (ArrayList) oldArrayList.clone();
ArrayList<String> newArrayList = (ArrayList<String>) oldArrayList.clone();
।
List<String>
बजाय का उपयोग करें ArrayList<String>
। इस तरह से अधिकांश समय संग्रह का उपयोग किया जाना चाहिए।
आप क्लोन क्यों करना चाहेंगे? नई सूची बनाना आमतौर पर अधिक मायने रखता है।
List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);
काम हो गया।
ArrayList(Collection<? extends E> c)
अर्थ है कि यह मायने नहीं रखता कि आप तर्क के रूप में किस प्रकार की सूची का उपयोग करते हैं।
यह वह कोड है जिसका मैं उपयोग करता हूं:
ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);
आशा है कि आप के लिए उपयोगी है
ArrayList
उपयोग के बजायArrayList<YourObject>
ArrayList
कंस्ट्रक्टर के ओवरलोडिंग का उपयोग क्यों नहीं करेंगे ?
जावा 8 के साथ इसे एक स्ट्रीम के साथ क्लोन किया जा सकता है।
import static java.util.stream.Collectors.toList;
...
List<AnObject> clone = myList.stream().collect(toList());
toCollection
एक बेहतर विकल्प हो सकता है।
बता दें कि Object.clone () में कुछ प्रमुख समस्याएं हैं, और इसका उपयोग ज्यादातर मामलों में हतोत्साहित किया जाता है। कृपया पूर्ण उत्तर के लिए जोशुआ बलोच द्वारा " प्रभावी जावा " से आइटम 11 देखें । मेरा मानना है कि आप आदिम प्रकार सरणियों पर Object.clone () का सुरक्षित रूप से उपयोग कर सकते हैं, लेकिन इसके अलावा आपको क्लोन का सही उपयोग और ओवरराइडिंग के बारे में विवेकपूर्ण होना चाहिए। आप शायद कॉपी कंस्ट्रक्टर या एक स्थिर फैक्ट्री विधि को परिभाषित करने से बेहतर हैं जो आपके शब्दार्थ के अनुसार स्पष्ट रूप से ऑब्जेक्ट को क्लोन करता है।
मुझे लगता है कि यह कलेक्शन एपीआई का उपयोग करके चाल करना चाहिए:
नोट : प्रतिलिपि विधि रेखीय समय में चलती है।
//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);
List<MySerializableObject> copyList = new ArrayList<>(mMySerializableObjects.size());
इसका उपयोग copyList.addAll(original);
करना एक अच्छा विकल्प है
int
तर्कों की खुशी । मुझे नहीं पता कि आप अच्छे पुराने के बजाय इस अस्पष्ट स्थैतिक पद्धति का उपयोग क्यों करना चाहते हैं addAll
।
मुझे लगता है कि addAll का उपयोग करना ठीक काम करता है।
ArrayList<String> copy = new ArrayList<String>();
copy.addAll(original);
कोष्ठक का उपयोग जेनरिक सिंटैक्स के बजाय किया जाता है
new ArrayList<String>(original)
?
यदि आप चाहते हैं कि एक गेटर में सूची को वापस करने में सक्षम होने के लिए यह करना बेहतर होगा:
ImmutableList.copyOf(list);
एक सामान्य इंटरफ़ेस को क्लोन करने के लिए जैसे java.util.List
आपको इसे डालना होगा। यहाँ आप एक उदाहरण हैं:
List list = new ArrayList();
List list2 = ((List) ( (ArrayList) list).clone());
यह थोड़ा मुश्किल है, लेकिन यह काम करता है, यदि आप एक List
इंटरफ़ेस वापस करने के लिए सीमित हैं, तो आपके जाने के बाद कोई भी आपकी सूची को लागू कर सकता है।
मुझे पता है कि यह उत्तर अंतिम उत्तर के करीब है, लेकिन मेरा उत्तर यह बताता है कि जब आप List
सामान्य माता-पिता के साथ काम कर रहे हों, तो वह सब कैसे करें- नहींArrayList
ArrayLists क्लोनिंग करते समय बहुत सावधान रहें। जावा में क्लोनिंग उथली है। इसका मतलब है कि यह केवल Arraylist को क्लोन करेगा और इसके सदस्यों को नहीं। इसलिए यदि आपके पास एक ArrayList X1 है और इसे X2 में क्लोन किया है तो X2 में कोई भी परिवर्तन X1 में प्रकट होगा और इसके विपरीत। जब आप क्लोन करते हैं तो आप केवल मूल में समान तत्वों के संकेत के साथ एक नया ArrayList उत्पन्न करेंगे।
List<String> shallowClonedList = new ArrayList<>(listOfStrings);
ध्यान रखें कि यह केवल एक उथला है जिसकी गहरी प्रति नहीं है, अर्थात। आपको एक नई सूची मिलती है, लेकिन प्रविष्टियां समान हैं। यह केवल तार के लिए कोई समस्या नहीं है। जब सूची प्रविष्टियाँ अपने आप ही वस्तुएं हों, तो अधिक पेचीदा हो।
मैं एक जावा पेशेवर नहीं हूं, लेकिन मुझे एक ही समस्या है और मैंने इस पद्धति से हल करने की कोशिश की। (यह माना जाता है कि टी में एक कॉपी कंस्ट्रक्टर है)।
public static <T extends Object> List<T> clone(List<T> list) {
try {
List<T> c = list.getClass().newInstance();
for(T t: list) {
T copy = (T) t.getClass().getDeclaredConstructor(t.getclass()).newInstance(t);
c.add(copy);
}
return c;
} catch(Exception e) {
throw new RuntimeException("List cloning unsupported",e);
}
}
List
कार्यान्वयन वर्ग के पास सार्वजनिक नहीं-आर्ग निर्माता है। उदाहरण के लिए, List
एस रिटर्न Array.asList
, List.of
या List.subList
शायद नहीं।