Elimde bir ArrayList
var ve onu aynen kopyalamak istiyorum. Birilerinin bunu doğru yapmak için biraz zaman harcadığını varsayarak mümkün olduğunda yardımcı sınıfları kullanıyorum. Doğal olarak, bir kopyalama yöntemi içeren Collections
sınıfını kullanıyorum.
Diyelim ki aşağıdakilere sahibim:
List<String> a = new ArrayList<String>();
a.add("a");
a.add("b");
a.add("c");
List<String> b = new ArrayList<String>(a.size());
Collections.copy(b,a);
Bu başarısız oluyor çünkü temelde b
nin a
yı tutacak kadar büyük olmadığını düşünüyor. Evet b
nin boyutunun 0 olduğunu biliyorum, ama şimdi yeterince büyük olmalı, değil mi? Eğer önce b
yi doldurmak zorunda kalırsam, o zaman Collections.copy()
benim için tamamen işe yaramaz bir fonksiyon haline gelir. Yani, bir kopyalama fonksiyonu programlamak dışında (ki şimdi yapacağım) bunu yapmanın uygun bir yolu var mı?
bnin *kapasitesi* 3, ancak *boyutu* 0'dır.
ArrayListin bir tür tampon kapasitesine sahip olması bir uygulama ayrıntısıdır -
Listarayüzünün bir parçası değildir, bu nedenle
Collections.copy(List, List)bunu kullanmaz. Bunun için
ArrayList` özel durumunu kullanmak çirkin olurdu.
MrWiggles'ın belirttiği gibi, bir koleksiyon alan ArrayList kurucusunu kullanmak verilen örnekte izlenecek yoldur.
Daha karmaşık senaryolar için (ki bu sizin gerçek kodunuzu da içerebilir) Guava içindeki koleksiyonları faydalı bulabilirsiniz.
Bir Listeyi kopyalamanın en basit yolu, onu yeni listenin yapıcısına aktarmaktır:
List<String> b = new ArrayList<>(a);
b,
a`nın sığ bir kopyası olacaktır
Collections.copy(List,List)kaynağına baktığımda (daha önce hiç görmemiştim) öğeleri indeks indeks kopyalamak için olduğu görülüyor.
List.set(int,E)` kullanılarak 0 öğesi hedef listedeki 0 öğesinin üzerine yazılacak vs. vs. İtiraf etmeliyim ki javadoc'lardan pek anlaşılmıyor.
List<String> a = new ArrayList<>(a);
a.add("foo");
b.add("bar");
List<String> b = new ArrayList<>(a); // shallow copy 'a'
// the following will all hold
assert a.get(0) == b.get(0);
assert a.get(1) == b.get(1);
assert a.equals(b);
assert a != b; // 'a' is not the same object as 'b'