Неизменяемый массив Java - PullRequest
       46

Неизменяемый массив Java

12 голосов
/ 17 сентября 2010
final Integer[] arr={1,2,3};
arr[0]=3;
System.out.println(Arrays.toString(arr));

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

Ответы [ 6 ]

22 голосов
/ 17 сентября 2010

Насколько я знаю, это невозможно.

Однако существует метод Collections.unmodifiableList (..) , который создает неизменяемое представление, например, List<Integer>.

Если вы хотите гарантировать, что даже создатель списка неизменяемых представлений не сможет изменить базовый (изменяемый) список, взгляните на ImmutableList .

9 голосов
/ 17 сентября 2010

Нет. Содержимое массива может быть изменено. Вы не можете предотвратить это.

Коллекции имеет различные методы создания неизменяемых коллекций, но массивы не предусмотрены.

4 голосов
/ 17 сентября 2010

Последнее ключевое слово только предотвращает изменение ссылки на arr, т.е. вы не можете сделать это:

final int[] arr={1,2,3}; 
arr = new int[5]; 

Если объект, на который ссылается arr, является изменяемым объектом (например, массивами), ничто не мешает вам изменить его.

Единственное решение - использовать неизменяемые объекты.

1 голос
/ 31 августа 2017

Другой способ - использовать эту функцию:

Arrays.copyOf(arr, arr.length);
0 голосов
/ 15 апреля 2015

Всем, кто читает этот старый вопрос, следует помнить, что есть также неизменные коллекции Google Guava. ImmutableList имеет гораздо более высокую производительность, чем Collections.unmodifiableList (), и, возможно, безопаснее, поскольку он действительно неизменен и не поддерживается изменяемой коллекцией.

0 голосов
/ 04 марта 2011

Ключевое слово '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}
...