List.copyOf
➙ немодифікується список
Ти запитав:
Чи немає іншого способу призначити копію списку
Java 9 принесла List.of
методи використання літералів для створення немодифікованого List
невідомого конкретного класу.
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
List< LocalDate > dates = List.of(
today.minusDays( 1 ) , // Yesterday
today , // Today
today.plusDays( 1 ) // Tomorrow
);
Поряд з цим ми також отримали List.copyOf
. Цей метод також повертає немодифікований List
невідомий конкретний клас.
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`.
Під "немодифікується" ми маємо на увазі кількість елементів у списку, і референт об'єкта, що міститься у кожному слоті як елемент, фіксується. Ви не можете додавати, видаляти або замінювати елементи. Але об'єкт референт проводиться в кожному елементі може або не може бути мінливим .
colors.remove( 2 ) ; // SUCCEEDS.
masterColors.remove( 2 ) ; // FAIL - ERROR.
Дивіться цей код, який працює на веб-сайті IdeOne.com .
дати.toString (): [2020-02-02, 2020-02-03, 2020-02-04]
color.toString (): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString (): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
Ви запитували про посилання на об'єкти. Як говорили інші, якщо ви створили один список і призначили його двом еталонним змінним (покажчикам), у вас все ще є лише один список. Обидва вказують на один і той же список. Якщо ви використовуєте будь-який вказівник для зміни списку, обидва вказівники згодом побачать зміни, оскільки в пам'яті є лише один список.
Тому потрібно зробити копію списку. Якщо ви хочете, щоб цю копію неможливо змінити, скористайтеся List.copyOf
методом, описаним у цій відповіді. У такому підході ви закінчуєте два окремі списки, у кожному з елементів, які містять посилання на однакові змістові об'єкти. Наприклад, у нашому прикладі вище, використовуючи String
об’єкти для представлення кольорів, кольорові об’єкти десь пливуть у пам’яті. Два списки містять покажчики на однакові кольорові об’єкти. Ось схема.
Перший список colors
може змінюватися. Це означає, що деякі елементи можна було видалити, як видно з коду вище, де ми видалили початковий 3-й елемент Chartreuse
(індекс 2 = порядковий 3). І елементи можна додавати. І елементи можна змінити, щоб вказати на якусь іншу, String
наприклад, OliveDrab
або CornflowerBlue
.
На противагу цьому, чотири елементи masterColors
фіксуються. Ніякого видалення, жодного додавання та заміни іншого кольору. Це List
реалізація неможливо змінити.