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.ofdeğ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 Listbilinmeyen 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.copyOfyö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 Stringrenkleri 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 colorsdeğ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 Stringgibi başka bir şeye işaret edecek şekilde değiştirilebilir .OliveDrabCornflowerBlue
Bunun aksine, dört elementi masterColorssabittir. Çıkarma, ekleme ve başka bir renk değiştirme yok. Bu Listuygulama değiştirilemez.