Проблема с назначением массива другому массиву в Java
public class TestingArray {
public static void main(String[] args) {
int iCheck = 10;
int j = iCheck;
j = 11;
System.err.println("value of iCheck "+iCheck);
int[] val1 = {1,2,9,4,5,6,7};
int[] val2 = val1;
val2[0] = 200;
System.err.println("Array Value "+val1[0]);
}
}
Выход:
значение iCheck 10
Значение массива 200
Из приведенного выше кода я обнаружил, что если какой-либо массив val2
назначается другому массиву val1
и если мы меняем какое-либо значение массива val2
, результат также отражается для массива val1
то время как тот же сценарий не связан с назначением переменной. Зачем?
Ответы
Ответ 1
Следующий оператор делает val2
ссылкой на тот же массив, что и val1
:
int[] val2 = val1;
Если вы хотите сделать копию, вы можете использовать val1.clone()
или Arrays.copyOf()
:
int[] val2 = Arrays.copyOf(val1, val1.length);
Объекты (включая экземпляры классов коллекции, String
, Integer
и т.д.) работают аналогичным образом, поскольку назначение одной переменной другой просто копирует ссылку, заставляя обе переменные ссылаться на один и тот же объект. Если рассматриваемый объект изменчив, последующие изменения, внесенные в его содержимое через одну из переменных, также будут видны через другую.
Примитивные типы (int
, double
и т.д.) ведут себя по-другому: ссылки отсутствуют, а присваивание делает копию значения.
Ответ 2
Проще говоря, "val1" и "val2" являются указателями на фактический массив. Вы назначаете val2 для указания того же массива, что и val1. Поэтому измените одно, а другое увидит одно и то же изменение. Чтобы он действительно был копией, вам нужно клонировать массив вместо назначения.
Ответ 3
Поскольку вы назначаете ссылку от val1
до val2
, поэтому оба они указывают на один и тот же объект в памяти.
Ответ 4
Поскольку массивы на Java являются объектами, то есть переданы по ссылке.