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реализация не поддается изменению.