Скопируйте массивы примитивных типов с помощью 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 приводит глубокое копирование для примитивных типов. Надеюсь, это ответит на ваш вопрос.