Скопируйте массивы примитивных типов с помощью System.arrayCopy, это мелкий или глубокий?

Я понимаю как System.arrayCopy() создает мелкую копию Object[] массивы, которые передаются ему.

Но я не понимаю, как это работает на массивах примитивных типов, таких как int[] или же byte[], Нет ссылок для копирования. В этом случае не должно быть разницы в мелком или глубоком копировании.

2 ответа

Как вы заметили:

Нет ссылок для копирования. В этом случае не должно быть разницы в мелком или глубоком копировании.

Для примитивов, System.arrayCopy просто копирует значения элементов массива.

System.arrayCopy() на массивах примитивных типов приводит к глубокому копированию.

Из ваших комментариев: "В этом случае не должно быть никакой разницы в мелкой или глубокой копии"

Есть разница. Если целевой массив после изменения является мелкой копией, изменения, которые вы вносите в целевой массив, должны повлиять на исходный массив и наоборот. Но это не тот случай, здесь.

Позвольте мне привести пример здесь:

public class ArrayCopy {
public static void main(String args[]) {
    int arr1[] = {0, 1, 2, 3, 4, 5};
    int arr2[] = {10, 11, 12, 13, 14, 15};
    System.out.println("Before change");
    System.out.println("arr1 " + Arrays.toString(arr1));
    System.out.println("arr2 " + Arrays.toString(arr2));
    System.arraycopy(arr1, 0, arr2, 0, 3);
    System.out.println("After change for arr2");
    System.out.println("arr1 " + Arrays.toString(arr1));
    System.out.println("arr2 " + Arrays.toString(arr2));
    int arr3[] = {20, 30};
    System.arraycopy(arr3, 0, arr1, 0, 2);
    System.out.println("After change for arr1");
    System.out.println("arr1 " + Arrays.toString(arr1));
    System.out.println("arr2 " + Arrays.toString(arr2));
}}

     Result:
 Before change
 arr1 [0, 1, 2, 3, 4, 5]
 arr2 [10, 11, 12, 13, 14, 15]
 After change for arr2
 arr1 [0, 1, 2, 3, 4, 5]
 arr2 [0, 1, 2, 13, 14, 15]
 After change for arr1
 arr1 [20, 30, 2, 3, 4, 5]
 arr2 [0, 1, 2, 13, 14, 15]

Если вы видите результат, если это мелкая копия, "После изменения для arr1" должен привести

                  arr1 [20, 30, 2, 3, 4, 5]
                  arr2 [20, 30, 2, 13, 14, 15]

Но это не так, потому что System.arrayCopy приводит глубокое копирование для примитивных типов. Надеюсь, это ответит на ваш вопрос.

Другие вопросы по тегам