Проблема с назначением массива другому массиву в 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 являются объектами, то есть переданы по ссылке.