Немодифицируемый массив Java
final Integer[] arr={1,2,3};
arr[0]=3;
System.out.println(Arrays.toString(arr));
Я попробовал приведенный выше код, чтобы узнать, можно ли переназначить конечные переменные массива [ ans: это может быть]. Я понимаю, что конечным массивом Integer [] это означает, что мы не можем назначить другой экземпляр из Integer [], кроме того, который мы назначили первоначально. Я хотел бы знать, возможно ли сделать переменные массива также немодифицируемыми.
Ответы
Ответ 1
Это невозможно, насколько я знаю.
Однако существует метод Collections.unmodifiableList(..), который создает немодифицируемое представление, например. a List<Integer>
.
Если вы хотите гарантировать, что даже создатель немодифицируемого списка просмотра не сможет изменить базовый (изменяемый) список, посмотрите Guava ImmutableList.
Ответ 2
Нет. Содержимое массива можно изменить. Вы не можете этого предотвратить.
Collections имеет различные методы для создания немодифицируемых коллекций, но массивы не предусмотрены.
Ответ 3
Конечное ключевое слово только предотвращает изменение ссылки arr, т.е. вы не можете:
final int[] arr={1,2,3};
arr = new int[5];
Если объект arr ссылается на изменяемый объект (например, массивы), ничто не мешает вам его модифицировать.
Единственное решение - использовать неизменяемые объекты.
Ответ 4
Ключевое слово "final" относится только к ссылкам (указатель на расположение памяти объекта в куче). Вы не можете изменить адрес (местоположение) объекта. Его до вашего объекта, как он внутренне обрабатывает неизменность.
Добавлен, хотя int - это примитивный тип данных, int [] следует рассматривать как объект.
Вы не можете сделать это
final int a = 5
a = 6
Вы можете сделать это:
final int[] a = new int[]{2,3,4};
a[0] = 6;
Вы не можете этого сделать:
final int[] a = new int[]{2,3,4};
a = new int[]{1,2,3}
Ответ 5
Чтобы кто-нибудь еще прочитал этот старый вопрос, имейте в виду, что есть также неизменные коллекции Google Guava. ImmutableList имеет гораздо более высокую производительность, чем Collections.unmodifiableList(), и, возможно, более безопасен, поскольку он действительно неизменен и не подкреплен изменчивой коллекцией.
Ответ 6
Другой способ - использовать эту функцию:
Arrays.copyOf(arr, arr.length);