سؤال

لدي ArrayList<String> ان كنت ترغب في العودة نسخة. ArrayList وقد استنساخ الطريقة التي التوقيع التالي:

public Object clone()

بعد استدعاء هذا الأسلوب ، كيف يلقي الكائن عاد مرة أخرى إلى ArrayList<String>?

هل كانت مفيدة؟

المحلول

ArrayList newArrayList = (ArrayList) oldArrayList.clone();

نصائح أخرى

لماذا تريد أن مستنسخ ؟ إنشاء قائمة جديدة عادة ما تكون أكثر منطقية.

List<String> strs;
...
List<String> newStrs = new ArrayList<>(strs);

هذه المهمة.

هذا هو رمز يمكنني استخدام هذا:

ArrayList copy = new ArrayList (original.size());
Collections.copy(copy, original);

الأمل هو مفيد بالنسبة لك

مع جافا 8 يمكن المستنسخة مع تيار.

import static java.util.stream.Collectors.toList;

...

List<AnObject> clone = myList.stream().collect(toList());

العلم أنه كائن.استنساخ() لديها بعض المشاكل الرئيسية ، واستخدامه هو تثبيط في معظم الحالات.الرجاء مراجعة البند 11 من "فعالة جافا"من قبل يشوع بلوخ على إجابة كاملة.أعتقد يمكنك استخدام بأمان الكائن.استنساخ() على نوع بدائي المصفوفات ، ولكن بغض النظر عن ذلك تحتاج إلى أن تكون حكيمة عن بشكل صحيح باستخدام الغالب استنساخ.ربما كنت أفضل حالا تحديد نسخة منشئ أو طريقة مصنع ثابت صراحة استنساخ الكائن الخاص بك وفقا دلالات.

أعتقد أن هذا ينبغي أن تفعل خدعة باستخدام مجموعات API:

ملاحظة:طريقة النسخ يعمل في الزمن الخطي.

//assume oldList exists and has data in it.
List<String> newList = new ArrayList<String>();
Collections.copy(newList, oldList);

أجد باستخدام addAll يعمل بشكل جيد.

ArrayList<String> copy = new ArrayList<String>();
copy.addAll(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 والعكس بالعكس.عند استنساخ سوف تولد سوى new ArrayList مع مؤشرات نفس العناصر في النص الأصلي.

هذا يجب أن تعمل أيضا:

ArrayList<String> orig = new ArrayList<String>();
ArrayList<String> copy = (ArrayList<String>) orig.clone()
ArrayList first = new ArrayList ();
ArrayList copy = (ArrayList) first.clone ();

أنا لست جافا المهنية ، ولكن لدي نفس المشكلة و حاولت أن تحل بهذه الطريقة.(يفترض أن ر لديه نسخة منشئ).

 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<String> shallowClonedList = new ArrayList<>(listOfStrings);

نضع في اعتبارنا أن هذه ليست سوى ضحلة غير عميقة نسخ ie.يمكنك الحصول على قائمة جديدة ، ولكن القيود هي نفسها.هذه ليست مشكلة بالنسبة ببساطة السلاسل.الحصول على أكثر صعوبة عندما إدخالات قائمة الكائنات ذاتهما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top