Подтвердить что ты не робот

Немодифицируемый массив Java

final Integer[] arr={1,2,3};
arr[0]=3;
System.out.println(Arrays.toString(arr));

Я попробовал приведенный выше код, чтобы узнать, можно ли переназначить конечные переменные массива [ ans: это может быть]. Я понимаю, что конечным массивом Integer [] это означает, что мы не можем назначить другой экземпляр из Integer [], кроме того, который мы назначили первоначально. Я хотел бы знать, возможно ли сделать переменные массива также немодифицируемыми.

4b9b3361

Ответ 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);