Java массив примитивных типов данных

#java #arrays #types #pass-by-reference #pass-by-value

#java #массивы #типы #передача по ссылке #передача по значению

Вопрос:

Почему следующий код работает так, как будто он использует ссылочные типы, а не примитивные типы?

 int[] a = new int[5];
int[] b = a;
a[0] = 1;
b[0] = 2;
a[1] = 1;
b[1] = 3;
System.out.println(a[0]);
System.out.println(b[0]);
System.out.println(a[1]);
System.out.println(b[1]);
  

И на выходе получается:
2
2
3
3
вместо
1
2
1
3

Ответ №1:

Содержимое массива int может не быть ссылками, но переменные int[] являются. Устанавливая b = a , вы копируете ссылку, и два массива указывают на один и тот же фрагмент памяти.

Ответ №2:

Я описываю, что вы здесь делаете:

  1. создание массива целых чисел int[] a = new int[5];
  2. создание ссылки на созданный массив int[] b = a;
  3. добавление целого числа в массив «a», позиция 0
  4. перезапись ранее добавленного целого числа, поскольку b[0] указывает на то же местоположение, что и a[0]
  5. добавление целого числа в массив «a», позиция 1
  6. перезапись ранее добавленного целого числа снова, потому что b[1] указывает на то же местоположение, что и a[1]

Ответ №3:

вы не создаете новый экземпляр с помощью int[] b = a

если вам нужен новый экземпляр (и ожидаемый результат), добавьте clone() : int[] b = a.clone()

удачи

Комментарии:

1. Итак, array — это объект с простой ссылкой?

2. @IgorDiy да, массив — это объект, большинство операций с массивами их не копируют (было бы ужасно дорого вызывать метод с массивом в качестве аргумента, если бы его нужно было скопировать!)

3. @IgorDiy, это объект, он даже наследует объект, например, new int[2].getClass().Возвращает getSuperClass() Object.class . В качестве бонуса в нем есть все методы, которые есть у объекта.

Ответ №4:

Оба a и b указывают на (является) одним и тем же массивом. Изменение значения в a или b приведет к изменению того же значения для другого.