ArrayList को क्लोन कैसे करें और इसकी सामग्री को कैसे क्लोन करें?


273

मैं कैसे ArrayListजावा में क्लोन कर सकता हूं और इसकी वस्तुओं को क्लोन भी कर सकता हूं ?

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

ArrayList<Dog> dogs = getDogs();
ArrayList<Dog> clonedList = ....something to do with dogs....

और मैं उम्मीद करूंगा कि वस्तुएं clonedListकुत्तों की सूची में समान नहीं हैं।


जवाबों:


199

आपको आइटम पर पुनरावृति करने की आवश्यकता होगी, और जैसे ही आप जाते हैं, अपने परिणाम सरणी में क्लोन डालकर, उन्हें एक-एक करके क्लोन करें।

public static List<Dog> cloneList(List<Dog> list) {
    List<Dog> clone = new ArrayList<Dog>(list.size());
    for (Dog item : list) clone.add(item.clone());
    return clone;
}

काम करने के लिए, स्पष्ट रूप से, आपको इंटरफ़ेस Dogको लागू करने Cloneableऔर clone()विधि को ओवरराइड करने के लिए अपनी कक्षा प्राप्त करनी होगी ।


19
आप इसे उदारतापूर्वक नहीं कर सकते, हालांकि। क्लोन () क्लोन करने योग्य इंटरफ़ेस का हिस्सा नहीं है।
माइकल मायर्स

13
लेकिन क्लोन () ऑब्जेक्ट में सुरक्षित है, इसलिए आप इसे एक्सेस नहीं कर सकते। उस कोड को संकलित करने का प्रयास करें।
माइकल मायर्स

5
सभी वर्ग ऑब्जेक्ट का विस्तार करते हैं, इसलिए वे क्लोन () को ओवरराइड कर सकते हैं। यह वही है जो क्लोन करने योग्य है!
Stephan202

2
यह एक अच्छा जवाब है। क्लोन करने योग्य वास्तव में एक इंटरफ़ेस है। हालाँकि, mm खरीदारों के पास एक बिंदु है, जिसमें क्लोन () विधि ऑब्जेक्ट क्लास में घोषित एक संरक्षित तरीका है। आपको अपने डॉग क्लास में इस तरीके को ओवरराइड करना होगा, और खेतों की मैन्युअल कॉपी खुद करनी होगी।
जोस

3
मैं कहता हूं, एक कारखाना या बिल्डर, या यहां तक ​​कि सिर्फ एक स्थिर विधि बनाएं, जो डॉग का एक उदाहरण लेगा, और मैन्युअल रूप से फ़ील्ड्स को एक नए उदाहरण में कॉपी करेगा, और उस नए इंस्टेंस को वापस करेगा।
जोस

196

मैं, व्यक्तिगत रूप से डॉग के लिए एक निर्माता जोड़ूंगा:

class Dog
{
    public Dog()
    { ... } // Regular constructor

    public Dog(Dog dog) {
        // Copy all the fields of Dog.
    }
}

फिर बस पुनरावृति (वर्धन के उत्तर में दिखाया गया है):

public static List<Dog> cloneList(List<Dog> dogList) {
    List<Dog> clonedList = new ArrayList<Dog>(dogList.size());
    for (Dog dog : dogList) {
        clonedList.add(new Dog(dog));
    }
    return clonedList;
}

मुझे लगता है कि इसका फायदा यह है कि आपको जावा में टूटे-फूटे सामान के साथ चक्कर लगाने की जरूरत नहीं है। यह जावा संग्रह को कॉपी करने के तरीके से भी मेल खाता है।

एक अन्य विकल्प यह हो सकता है कि आप अपना स्वयं का ICloneable इंटरफ़ेस लिखें और उसका उपयोग करें। इस तरह आप क्लोनिंग के लिए एक सामान्य तरीका लिख ​​सकते हैं।


क्या आप DOG के सभी क्षेत्रों की प्रतिलिपि के साथ अधिक विशिष्ट हो सकते हैं। मैं वास्तव में नहीं समझ रहा हूँ :(
डॉ। ANDRO

क्या एक अपरिभाषित वस्तु (डॉग के बजाय) के लिए उस फ़ंक्शन को लिखना संभव है?
तोबी जी

@बड़ा करने के लिए। मुझे समझ नहीं आ रहा है कि आपका क्या मतलब है। क्या आप चाहते हैं cloneList(List<Object>)या Dog(Object)?
cdmckay

@cdmckay एक फ़ंक्शन जो क्लोनलिस्ट (सूची <ऑब्जेक्ट>), क्लोनलिस्ट (सूची <डॉग>) और क्लोनलिस्ट (सूची <कैट>) के लिए काम करता है। लेकिन आप एक सामान्य निर्माता नहीं कह सकते हैं जो मुझे लगता है ...?
तोबी जी।

@बड़ा करने के लिए। एक सामान्य क्लोनिंग फ़ंक्शन की तरह? यह वास्तव में यह सवाल नहीं है।
cdmckay

143

सभी मानक संग्रह में प्रतिलिपि निर्माता हैं। उन्हें इस्तेमाल करें।

List<Double> original = // some list
List<Double> copy = new ArrayList<Double>(original); //This does a shallow copy

clone()कई गलतियों के साथ डिजाइन किया गया था ( इस प्रश्न को देखें ), इसलिए इससे बचना सबसे अच्छा है।

से प्रभावी जावा 2 संस्करण , मद 11: अवहेलना क्लोन विवेकपूर्ण तरीके से

क्लोन करने योग्य से जुड़ी सभी समस्याओं को देखते हुए, यह कहना सुरक्षित है कि अन्य इंटरफेस इसे विस्तारित नहीं करना चाहिए, और विरासत के लिए डिज़ाइन किए गए वर्ग (आइटम 17) को इसे लागू नहीं करना चाहिए। इसकी कई कमियों के कारण, कुछ विशेषज्ञ प्रोग्रामर केवल क्लोन विधि को ओवरराइड करने के लिए कभी नहीं चुनते हैं और कभी भी इसे लागू नहीं करते हैं, शायद, सरणियों की प्रतिलिपि बनाने के लिए। यदि आप वंशानुक्रम के लिए एक वर्ग डिज़ाइन करते हैं, तो ध्यान रखें कि यदि आप एक अच्छी तरह से व्यवहार किए गए संरक्षित क्लोन पद्धति प्रदान करने के लिए नहीं चुनते हैं, तो क्लोन करने योग्य को लागू करने के लिए उपवर्गों के लिए असंभव होगा।

इस पुस्तक में क्लोनेबल / क्लोन के ऊपर कई फायदे कॉपी कंस्ट्रक्टर्स का वर्णन है।

  • वे एक जोखिम-प्रवण परोपकारी भाषाई वस्तु निर्माण तंत्र पर भरोसा नहीं करते हैं
  • वे पतले प्रलेखित सम्मेलनों के लिए अप्राप्य पालन की मांग नहीं करते हैं
  • वे अंतिम क्षेत्रों के उचित उपयोग के साथ संघर्ष नहीं करते हैं
  • वे अनावश्यक जाँच अपवादों को नहीं फेंकते
  • उन्हें जातियों की आवश्यकता नहीं है।

कॉपी कंस्ट्रक्टर का उपयोग करने के एक और लाभ पर विचार करें: मान लें कि आपके पास ए है HashSet s, और आप इसे ए के रूप में कॉपी करना चाहते हैं TreeSet। क्लोन विधि इस कार्यक्षमता की पेशकश नहीं कर सकती है, लेकिन रूपांतरण निर्माता के साथ यह आसान है new TreeSet(s):।


84
जितना मुझे पता है, मानक संग्रह के कॉपी निर्माता उथले प्रतिलिपि बनाते हैं, न कि एक गहरी प्रतिलिपि। यहां पूछा गया प्रश्न एक गहरी प्रतिलिपि उत्तर के लिए दिखता है।
अब्दुल

19
यह बस गलत है, कॉपी कॉन्स्टेक्टर्स एक उथली नकल करते हैं - ते सवाल का
पूर्ण एपिसोड

1
इस उत्तर के बारे में क्या सही है कि यदि आप सूची में वस्तुओं को उत्परिवर्तित नहीं कर रहे हैं, तो आइटम जोड़ना या निकालना दोनों सूची से उन्हें नहीं हटाता है। यह सरल काम के रूप में उथले नहीं है ।
नौमेनन

42

जावा 8 तत्व कुत्तों पर कॉपी कंस्ट्रक्टर या क्लोन विधि को सुरुचिपूर्ण ढंग से और कॉम्पैक्ट रूप से कॉल करने के लिए एक नया तरीका प्रदान करता है: स्ट्रीम , लैम्ब्डा और कलेक्टर

निर्माता की प्रतिलिपि बनाएँ:

List<Dog> clonedDogs = dogs.stream().map(Dog::new).collect(toList());

अभिव्यक्ति Dog::newको विधि संदर्भ कहा जाता है । यह एक फ़ंक्शन ऑब्जेक्ट बनाता है जो एक कंस्ट्रक्टर को कॉल करता है Dogजिस पर एक और कुत्ते को तर्क के रूप में लेता है।

क्लोन विधि [1]:

List<Dog> clonedDogs = dogs.stream().map(d -> d.clone()).collect(toList());

ArrayListपरिणाम के रूप में हो रही है

या, यदि आपको एक ArrayListपीठ प्राप्त करनी है (यदि आप इसे बाद में संशोधित करना चाहते हैं):

ArrayList<Dog> clonedDogs = dogs.stream().map(Dog::new).collect(toCollection(ArrayList::new));

सूची को जगह में अद्यतन करें

यदि आपको dogsसूची की मूल सामग्री को रखने की आवश्यकता नहीं है, तो आप replaceAllविधि का उपयोग कर सकते हैं और सूची को जगह में अद्यतन कर सकते हैं :

dogs.replaceAll(Dog::new);

सभी उदाहरण मानते हैं import static java.util.stream.Collectors.*;


कलेक्टर ने ArrayListएस

अंतिम उदाहरण से कलेक्टर को एक उपयोग विधि में बनाया जा सकता है। चूंकि यह व्यक्तिगत रूप से करने के लिए इस तरह की एक सामान्य बात है, इसलिए मुझे यह छोटा और सुंदर लग रहा है। ऐशे ही:

ArrayList<Dog> clonedDogs = dogs.stream().map(d -> d.clone()).collect(toArrayList());

public static <T> Collector<T, ?, ArrayList<T>> toArrayList() {
    return Collectors.toCollection(ArrayList::new);
}

[१] नोट CloneNotSupportedException:

इस cloneविधि के काम करने के लिए विधि की घोषणा Dog नहीं करनी चाहिए कि यह फेंकता है CloneNotSupportedException। कारण यह है कि तर्क को mapकिसी भी जाँच अपवाद को फेंकने की अनुमति नहीं है।

ऐशे ही:

    // Note: Method is public and returns Dog, not Object
    @Override
    public Dog clone() /* Note: No throws clause here */ { ...

हालांकि यह एक बड़ी समस्या नहीं होनी चाहिए, क्योंकि यह वैसे भी सबसे अच्छा अभ्यास है। ( उदाहरण के लिए प्रभाव जावा यह सलाह देता है।)

यह ध्यान देने के लिए गुस्तावो का धन्यवाद।


पुनश्च:

यदि आपको यह बहुत अच्छा लगता है, तो आप विधि संदर्भ सिंटैक्स का उपयोग ठीक उसी कार्य को करने के लिए कर सकते हैं:

List<Dog> clonedDogs = dogs.stream().map(Dog::clone).collect(toList());

क्या आप इस तरह से प्रदर्शन का कोई प्रभाव देखते हैं जहां डॉग (d) कॉपी कंस्ट्रक्टर है? List<Dog> clonedDogs = new ArrayList<>(); dogs.stream().parallel().forEach(d -> clonedDogs.add(new Dog(d)));
सौरभजंटूरकर

1
@ सौरभजंटूरकर: आपका संस्करण थ्रेड-सुरक्षित नहीं है और इसका उपयोग समानांतर धाराओं के साथ नहीं किया जाना चाहिए। ऐसा इसलिए है क्योंकि parallelकॉल clonedDogs.addएक ही समय में कई थ्रेड से कॉल किया जाता है। जो संस्करण उपयोग करते collectहैं वे थ्रेड-सुरक्षित हैं। यह स्ट्रीम लाइब्रेरी के कार्यात्मक मॉडल के फायदों में से एक है, समान कोड का उपयोग समानांतर धाराओं के लिए किया जा सकता है।
Lii

1
@ सौरभजंटूरकर: इसके अलावा, कलेक्शन ऑपरेशन तेज है। यह बहुत कुछ वैसा ही करता है जैसा आपका संस्करण करता है, लेकिन समानांतर धाराओं के लिए भी काम करता है। उदाहरण के लिए, आप एक सरणी सूची के बजाय एक समवर्ती कतार का उपयोग करके अपने संस्करण को ठीक कर सकते हैं, लेकिन मैं लगभग निश्चित हूं कि यह बहुत धीमा होगा।
Lii

जब भी मैं आपके समाधान का उपयोग करने की कोशिश करता हूं तो मुझे एक मिल जाता Unhandled exception type CloneNotSupportedExceptionहै d.clone()। अपवाद की घोषणा करना या इसे पकड़ना इसका हल नहीं है।
गुस्तावो

@ गुस्तावो: यह लगभग निश्चित रूप से है क्योंकि आप जिस वस्तु का क्लोन बना रहे हैं, ( Dogइस उदाहरण में) वह क्लोनिंग का समर्थन नहीं करता है। क्या आप सुनिश्चित हैं कि यह Clonableइंटरफ़ेस लागू करता है?
Lii

28

मूल रूप से मैन्युअल रूप से पुनरावृत्ति के बिना तीन तरीके हैं,

1 निर्माणकर्ता का उपयोग करना

ArrayList<Dog> dogs = getDogs();
ArrayList<Dog> clonedList = new ArrayList<Dog>(dogs);

2 का उपयोग करना addAll(Collection<? extends E> c)

ArrayList<Dog> dogs = getDogs();
ArrayList<Dog> clonedList = new ArrayList<Dog>();
clonedList.addAll(dogs);

3 पैरामीटर के addAll(int index, Collection<? extends E> c)साथ विधि का उपयोग करनाint

ArrayList<Dog> dogs = getDogs();
ArrayList<Dog> clonedList = new ArrayList<Dog>();
clonedList.addAll(0, dogs);

एनबी: यदि इनका संचालन जारी है तो निर्दिष्ट संग्रह को संशोधित किया गया है, तो इन परिचालनों का व्यवहार अपरिभाषित होगा।


49
कृपया नहीं कि ये सभी 3 वेरिएंट केवल सूचियों की उथली प्रतियाँ बनाते हैं
इलेक्ट्रोबैबे

8
यह एक गहरी क्लोन नहीं है, उन दो सूचियों को समान ऑब्जेक्ट बनाए रखते हैं, केवल संदर्भों को कॉपी किया है, लेकिन डॉग ऑब्जेक्ट्स, एक बार जब आप या तो सूची को संशोधित करते हैं, तो अगली सूची में समान परिवर्तन होगा। donno y इतने सारे अपवोट।
सॉरीकिडो

1
@ Neeson.Z सभी विधियाँ सूची की गहरी प्रति और सूची के तत्व की उथली प्रतियाँ बनाती हैं। यदि आप सूची के एक तत्व को संशोधित करते हैं तो परिवर्तन दूसरी सूची से परिलक्षित होगा, लेकिन यदि आप सूची में से एक को संशोधित करते हैं (उदाहरण के लिए किसी ऑब्जेक्ट को हटाते हुए), तो दूसरी सूची अपरिवर्तित होगी।
एलेसेंड्रो टेरुज़ि

17

मुझे लगता है कि मौजूदा हरा जवाब बुरा है , आप क्यों पूछ सकते हैं?

  • इसमें बहुत सारे कोड जोड़ने पड़ सकते हैं
  • इसकी आवश्यकता है कि आप सभी सूचियों को कॉपी करने के लिए सूचीबद्ध करें और ऐसा करें

जिस तरह से सीरियलाइजेशन भी खराब है, आपको पूरे स्थान पर सीरियल को जोड़ना होगा।

तो समाधान क्या है:

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

Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);

इसे https://github.com/kostaskougios/cloning पर देखें


8
इस विधि के साथ एक चेतावनी यह है कि यह प्रतिबिंब का उपयोग करता है, जो वर्खान के समाधान की तुलना में थोड़ा धीमा हो सकता है।
cdmckay

6
मैं पहले बिंदु को नहीं समझता "इसके लिए बहुत कोड की आवश्यकता है"। जिस लाइब्रेरी की आप बात कर रहे हैं, उसे अधिक कोड की आवश्यकता होगी। इसका केवल यह एक मामला है कि आप इसे कहां रखते हैं। अन्यथा मैं इस तरह की चीज़ों के लिए एक विशेष पुस्तकालय की बात मानता हूँ ..
nawfal

8

मुझे एक रास्ता मिल गया है, आप सूची को अनुक्रमित / अनसुना करने के लिए json का उपयोग कर सकते हैं। सीरियलाइज्ड सूची के मूल वस्तु का कोई संदर्भ नहीं होता है जब अनधिकृत किया जाता है।

Gson का उपयोग करना:

List<CategoryModel> originalList = new ArrayList<>(); // add some items later
String listAsJson = gson.toJson(originalList);
List<CategoryModel> newList = new Gson().fromJson(listAsJson, new TypeToken<List<CategoryModel>>() {}.getType());

आप ऐसा कर सकते हैं कि जैक्सन और किसी अन्य जसन लाइब्रेरी का उपयोग भी कर सकते हैं।


1
मुझे नहीं पता कि लोगों ने इस जवाब को क्यों गलत ठहराया है। अन्य उत्तरों को क्लोन () को लागू करना होगा या नए पुस्तकालयों को शामिल करने के लिए अपनी निर्भरता को बदलना होगा। लेकिन JSon पुस्तकालय में अधिकांश परियोजनाएं पहले से ही शामिल होंगी। मैंने इसके लिए उत्थान किया।
सतीश

1
@ सतीश हां, यह एकमात्र उत्तर है जिसने मेरी मदद की, मुझे यकीन नहीं है कि दूसरों के साथ क्या गलत है, लेकिन कोई फर्क नहीं पड़ता कि मैंने क्या किया, क्लोन या कॉपी कंस्ट्रक्टर का उपयोग करें, मेरी मूल सूची अपडेट हो जाती थी, लेकिन इस तरह से ऐसा नहीं होता है , तो लेखक को धन्यवाद!
पराग पवार

खैर, यह सच है कि ज्ञान के लिए एक शुद्ध जावा उत्तर नहीं है, लेकिन इस मुद्दे से जल्दी से निपटने के लिए एक कुशल समाधान है
marcRDZ

महान हैक, समय का आवंटन बचाता है
mxml

6

मैंने हमेशा इस विकल्प का उपयोग किया है:

ArrayList<Dog> clonedList = new ArrayList<Dog>(name_of_arraylist_that_you_need_to_Clone);

2

आपको ArrayListहाथ से क्लोन करना होगा (इसके द्वारा पुनरावृत्ति करना और प्रत्येक तत्व को एक नए में कॉपी करना ArrayList), क्योंकि clone()यह आपके साथ नहीं करेगा। इसका कारण यह है कि इसमें निहित वस्तुएं स्वयं को ArrayListलागू नहीं कर सकती Clonableहैं।

संपादित करें : ... और यह वही है जो वर्चन का कोड करता है।


1
और यहां तक ​​कि अगर वे करते हैं, तो प्रतिबिंब के अलावा क्लोन () तक पहुंचने का कोई रास्ता नहीं है, और यह वैसे भी सफल होने की गारंटी नहीं है।
माइकल मायर्स

1

एक बुरा तरीका यह है कि इसे प्रतिबिंब के साथ किया जाए। मेरे लिए कुछ इस तरह से काम किया।

public static <T extends Cloneable> List<T> deepCloneList(List<T> original) {
    if (original == null || original.size() < 1) {
        return new ArrayList<>();
    }

    try {
        int originalSize = original.size();
        Method cloneMethod = original.get(0).getClass().getDeclaredMethod("clone");
        List<T> clonedList = new ArrayList<>();

        // noinspection ForLoopReplaceableByForEach
        for (int i = 0; i < originalSize; i++) {
            // noinspection unchecked
            clonedList.add((T) cloneMethod.invoke(original.get(i)));
        }
        return clonedList;
    } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
        System.err.println("Couldn't clone list due to " + e.getMessage());
        return new ArrayList<>();
    }
}

नीट और गंदा चाल! एक संभावित समस्या: यदि originalमुझे लगता है कि विभिन्न वर्गों की वस्तुएं हैं, तो मुझे लगता है कि cloneMethod.invokeयह एक अपवाद के साथ विफल होगा जब इसे गलत तरह की वस्तु के साथ लगाया जाता है। इस वजह से Methodप्रत्येक वस्तु के लिए एक विशिष्ट क्लोन प्राप्त करना बेहतर हो सकता है । या क्लोन विधि का उपयोग करें Object(लेकिन चूंकि वह सुरक्षित है जो अधिक मामलों में विफल हो सकता है)।
Lii

इसके अलावा, मुझे लगता है कि खाली सूची वापस करने के बजाय कैच-क्लॉज में रनटाइम अपवाद को फेंकना बेहतर होगा।
लीइ

1
List<Dog> dogs;
List<Dog> copiedDogs = dogs.stream().map(dog -> SerializationUtils.clone(dog)).Collectors.toList());

यह प्रत्येक कुत्ते की गहरी नकल करेगा


0

अन्य पोस्टर सही हैं: आपको सूची को पुन: व्यवस्थित करने और एक नई सूची में कॉपी करने की आवश्यकता है।

हालाँकि ... यदि सूची में ऑब्जेक्ट अपरिवर्तनीय हैं - तो आपको उन्हें क्लोन करने की आवश्यकता नहीं है। यदि आपकी वस्तु में एक जटिल वस्तु ग्राफ है - तो उन्हें अपरिवर्तनीय होने की आवश्यकता होगी।

अपरिवर्तनीयता का अन्य लाभ यह है कि वे थ्रेडसेफ़ भी हैं।


0

यहां जेनेरिक टेम्प्लेट प्रकार का उपयोग करके एक समाधान दिया गया है:

public static <T> List<T> copyList(List<T> source) {
    List<T> dest = new ArrayList<T>();
    for (T item : source) { dest.add(item); }
    return dest;
}

जेनेरिक अच्छे हैं लेकिन सवाल का जवाब देने के लिए आपको वस्तुओं को क्लोन करने की भी आवश्यकता है। देखें stackoverflow.com/a/715660/80425
डेविड स्नेबल-कॉंट

0

आपके लिए ऑब्जेक्ट्स क्लोन () विधि को ओवरराइड करते हैं

class You_class {

    int a;

    @Override
    public You_class clone() {
        You_class you_class = new You_class();
        you_class.a = this.a;
        return you_class;
    }
}

और कॉल .clone () वेक्टर obj या ArraiList obj के लिए ...।


0

कॉमन्स- lang-2.3.jar का उपयोग करके आसान तरीका है कि क्लोन सूची में जावा की लाइब्रेरी

लिंक डाउनलोड कॉमन्स- lang-2.3.jar

कैसे इस्तेमाल करे

oldList.........
List<YourObject> newList = new ArrayList<YourObject>();
foreach(YourObject obj : oldList){
   newList.add((YourObject)SerializationUtils.clone(obj));
}

मुझे उम्मीद है कि यह मददगार हो सकता है।

: डी


1
बस एक नोट: कॉमन्स लैंग का इतना पुराना संस्करण क्यों? : यहाँ रिलीज इतिहास देखें commons.apache.org/proper/commons-lang/release-history.html
informatik01

0

पैकेज import org.apache.commons.lang.SerializationUtils;

एक विधि है SerializationUtils.clone(Object);

उदाहरण

this.myObjectCloned = SerializationUtils.clone(this.object);

इस प्रश्न का उत्तर देना थोड़ा पुराना है। और टिप्पणी में कई अन्य जवाब सवाल के नीचे।
मॉस्किटो-एक्स

0

मैंने सिर्फ एक लिब विकसित किया है जो एक इकाई ऑब्जेक्ट और एक java.util.List ऑब्जेक्ट को क्लोन करने में सक्षम है। बस https://drive.google.com/open?id=0B69Sui5ah93EUTloSktFUkctN0U में जार डाउनलोड करें और स्थैतिक विधि cloneListObject (सूची सूची) का उपयोग करें। यह विधि न केवल सूची बल्कि सभी इकाई तत्वों को क्लोन करती है।


0

नीचे मेरे लिए काम किया ..

in dog.java

public Class Dog{

private String a,b;

public Dog(){} //no args constructor

public Dog(Dog d){ // copy constructor
   this.a=d.a;
   this.b=d.b;
}

}

 -------------------------

 private List<Dog> createCopy(List<Dog> dogs) {
 List<Dog> newDogsList= new ArrayList<>();
 if (CollectionUtils.isNotEmpty(dogs)) {
 dogs.stream().forEach(dog-> newDogsList.add((Dog) SerializationUtils.clone(dog)));
 }
 return newDogsList;
 }

यहाँ जो नई सूची बनाई गई है, जो CreateCopy विधि से बनाई गई है, SerializationUtils.clone () के माध्यम से बनाई गई है। इसलिए नई सूची में किया गया कोई भी बदलाव मूल सूची को प्रभावित नहीं करेगा


-1

मुझे लगता है कि मुझे एक गहरी नकल ArrayList बनाने का एक आसान तरीका मिल गया। मान लें कि आप एक स्ट्रिंग ArrayList arrayA को कॉपी करना चाहते हैं।

ArrayList<String>arrayB = new ArrayList<String>();
arrayB.addAll(arrayA);

मुझे पता है अगर यह आपके लिए काम नहीं करता है।


3
यदि आप मेरे मामले में सूची <सूची <JsonObject >> का उपयोग करते हैं तो काम नहीं करता है
djdance

तार अपरिवर्तनीय हैं। क्लोनिंग का कोई मतलब नहीं है और आपके उदाहरण में arrayB और arrayA में समान ऑब्जेक्ट संदर्भ हैं - इसकी उथली प्रति।
क्रिश्चियन फ्राइज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.