Bir öğeyi içeren bir liste yapmak için Collections.singletonList (bir şey) yerine Arrays.asList (bir şey) kullanmanın bir avantajı (veya bir çok farkı) var mı? İkincisi, döndürülen listeyi de değiştirilemez hale getirir.
Bir öğeyi içeren bir liste yapmak için Collections.singletonList (bir şey) yerine Arrays.asList (bir şey) kullanmanın bir avantajı (veya bir çok farkı) var mı? İkincisi, döndürülen listeyi de değiştirilemez hale getirir.
Yanıtlar:
Collections.singletonList(something)olduğu değişmez oysa Arrays.asList(something)sabit boyutudur ListListe ve Dizi yığın birleştirileceğini bir Array temsili.
Arrays.asList(something)hem Liste'ye hem de yapışık diziye yansıtılan yapısal olmayan değişikliklere izin verir . UnsupportedOperationExceptionBelirli bir dizin için bir öğe ayarlayabilseniz de, öğeleri eklemek, kaldırmak için atar .
Tarafından döndürülen Listede yapılan değişiklikler ile Collections.singletonList(something)sonuçlanır UnsupportedOperationException.
Ayrıca, döndürülen Listenin kapasitesi, kapasitesi desteklenen dizinin boyutu olandan farklı olarak Collections.singletonList(something)her zaman 1Arrays.asList(something) olacaktır.
Sadece singletonlist'in bir dizi tarafından desteklenmediğini ve sadece bu öğeye bir referansı olduğunu eklerim. Muhtemelen, daha az bellek gerektirir ve oluşturmak istediğiniz liste sayısına bağlı olarak önemli olabilir.
Yöntem Arrays.asList, belirtilen dizi tarafından desteklenen sabit boyutlu bir liste döndürür. Usul örneğini döndürür ArrayListbir olan özel bir iç içe statik sınıf uzanan AbstractListolup java.util.ArrayList. Bu statik sınıf, örneğin, set, indexOf, forEach, replaceAllvb. Gibi birkaç yöntemin uygulanmasını sağlar, ancak çağırdığımızda add, kendiliğinden bir uygulaması yoktur, bunun yerine AbstractListhangi fırlatma yöntemi çağrılır java.lang.UnsupportedOperationException.
Collections.singletonListDöner bir değişmez liste sadece belirtilen nesneyi ihtiva eden ve de seri hale getirilebilir.
Bir yan notta, değişmez listeler için genellikle Collections.unmodifiableListbelirtilen listenin değiştirilemez bir görünümünü döndüren kullanırız .
List<String> srcList = Arrays.asList("Apple", "Mango", "Banana");
var fruits = new ArrayList<>(srcList);
var unmodifiableList = Collections.unmodifiableList(fruits);
fruits.set(0, "Apricot");
var modFruit = unmodifiableList.get(0);
System.out.println(modFruit); // prints Apricot
Değiştirilemez bir görünüm koleksiyonu değiştirilemeyen ve aynı zamanda bir destek koleksiyonuna bir görünümdür. Destek koleksiyonunda değişikliklerin hala mümkün olabileceğini ve gerçekleşmeleri durumunda değiştirilemeyen görünümden görülebileceğini unutmayın.
Java 10 ve sonrasında gerçek bir değişmez listeye sahip olabiliriz . Gerçekten değiştirilemeyen bir liste almanın iki yolu vardır :
var unmodifiableList = List.copyOf(srcList); var unmodifiableList = srcList.stream().collect(Collectors.toUnmodifiableList());
Bu iki değişkenten herhangi biri kullanılırsa değer "Kayısı" değil yine "Elma" olacaktır. Gereğince doc ait Java 10 :
List.ofVeList.copyOfstatik fabrika yöntemleri unmodifiable listeleri oluşturmak için uygun bir yol sağlar. Bu yöntemlerle oluşturulan List örnekleri aşağıdaki özelliklere sahiptir:
- Bunlar unmodifiable . Öğeler eklenemez, kaldırılamaz veya değiştirilemez. Listedeki herhangi bir mutatör yönteminin çağrılması her zaman
UnsupportedOperationExceptionatılır. Ancak, içerilen öğelerin kendileri değiştirilebilirse, bu, List'in içeriğinin değişmesine neden olabilir.- Boş öğelere izin vermezler. Bunları null öğelerle yaratma girişimleri ortaya çıkar
NullPointerException.- Tüm elemanlar serileştirilebilirse serileştirilebilirler.
- Listedeki öğelerin sırası, sağlanan bağımsız değişkenlerin veya sağlanan dizideki öğelerin sırasıyla aynıdır.
- Onlar
value-based. Arayanlar, iade edilen örneklerin kimliği hakkında hiçbir varsayımda bulunmamalıdır. Fabrikalar yeni örnekler oluşturmakta veya mevcut örnekleri yeniden kullanmakta serbesttir. Bu nedenle, bu örneklerde kimliğe duyarlı işlemler (referans eşitliği (==), kimlik karma kodu ve senkronizasyon) güvenilir değildir ve bundan kaçınılmalıdır.- Serileştirilmiş Form sayfasında belirtildiği gibi serileştirilirler .
ImmutableList.of()veLists.newArrayList()karışıma da atabilirsiniz .