List.copyOf
➙ değiştirilemez liste
Sen sordun:
Listenin bir kopyasını atamanın başka bir yolu yok mu
Java 9 , bilinmeyen bir somut sınıfın List.of
değiştirilememesi için değişmezleri kullanma yöntemlerini getirdi List
.
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
Bununla birlikte biz de var List.copyOf
. Bu yöntem de List
bilinmeyen bir beton sınıfı değiştirilemez .
List< String > colors = new ArrayList<>( 4 ) ; // Creates a modifiable `List`.
colors.add ( "AliceBlue" ) ;
colors.add ( "PapayaWhip" ) ;
colors.add ( "Chartreuse" ) ;
colors.add ( "DarkSlateGray" ) ;
List< String > masterColors = List.copyOf( colors ) ; // Creates an unmodifiable `List`.
“Değiştirilemez” ile listedeki öğelerin sayısını kastediyoruz ve her yuvada bir öğe olarak tutulan nesne başvurusu sabittir. Öğe ekleyemez, bırakamaz veya değiştiremezsiniz. Ancak, her öğede tutulan nesne başvurusu değiştirilebilir olabilir veya olmayabilir .
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
IdeOne.com'da canlı olarak çalışan bu koda bakın .
dates.toString (): [2020-02-02, 2020-02-03, 2020-02-04]
colors.toString (): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString (): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
Nesne referanslarını sordunuz. Diğerlerinin de söylediği gibi, bir liste oluşturup iki referans değişkenine (işaretçiler) atarsanız, yine de yalnızca bir listeniz vardır. Her ikisi de aynı listeye işaret ediyor. Listeyi değiştirmek için iki işaretçiden birini kullanırsanız, bellekte yalnızca bir liste olduğu için her iki işaretçi de değişiklikleri görür.
Bu yüzden listenin bir kopyasını oluşturmanız gerekir. Bu kopyanın değiştirilemez olmasını istiyorsanız, bu Yanıtta açıklanan List.copyOf
yöntemi kullanın . Bu yaklaşımda, her biri aynı içerik nesnelerine referans tutan öğelere sahip iki ayrı listeyle sonuçlanırsınız. Örneğin, yukarıdaki örneğimizde String
renkleri temsil etmek için nesnelerin kullanılmasıyla , renk nesneleri bellekte bir yerde yüzer. İki liste aynı renk nesnelerine işaretçiler tutar. İşte bir diyagram.
İlk liste colors
değiştirilebilir. Bu, bazı öğelerin yukarıdaki kodda görüldüğü gibi kaldırılabileceği anlamına gelir, burada orijinal 3. öğeyi kaldırdık Chartreuse
(2 dizini = sıra 3). Ve elemanlar eklenebilir. Ve elemanlar veya String
gibi başka bir şeye işaret edecek şekilde değiştirilebilir .OliveDrab
CornflowerBlue
Bunun aksine, dört elementi masterColors
sabittir. Çıkarma, ekleme ve başka bir renk değiştirme yok. Bu List
uygulama değiştirilemez.