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 .
date.toString (): [2020-02-02, 2020-02-03, 2020-02-04]
colors.toString (): [AliceBlue, PapayaWhip, DarkSlateGray]
masterColors.toString (): [AliceBlue, PapayaWhip, Chartreuse, DarkSlateGray]
Вы спрашивали об объектных ссылках. Как говорили другие, если вы создаете один список и назначаете его двум ссылочным переменным (указателям), у вас все равно остается только один список. Оба указывают на один и тот же список. Если вы используете любой указатель для изменения списка, оба указателя позже увидят изменения, так как в памяти есть только один список.
Так что вам нужно сделать копию списка. Если вы хотите, чтобы эта копия не изменялась, используйте List.copyOf
метод, описанный в этом ответе. При таком подходе вы получите два отдельных списка, каждый из которых содержит элементы, которые содержат ссылку на одни и те же объекты содержимого. Например, в нашем примере выше, использующем String
объекты для представления цветов, цветные объекты плавают где-то в памяти. Два списка содержат указатели на объекты одного цвета. Вот схема.
Первый список colors
можно изменить. Это означает, что некоторые элементы могут быть удалены, как видно из кода выше, где мы удалили исходный третий элемент Chartreuse
(индекс 2 = порядковый номер 3). И элементы могут быть добавлены. И элементы могут быть изменены, чтобы указать на некоторые другие, String
такие как OliveDrab
илиCornflowerBlue
.
Напротив, четыре элемента masterColors
являются фиксированными. Без удаления, без добавления и без замены другого цвета. Эта List
реализация не поддается изменению.