English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼에서는 예제를 통해 Java에서 배열을 복사할 수 있는 다양한 방법(일维와 이维)을 배울 수 있습니다.
Java에서는 배열을 다른 배열로 복사할 수 있습니다. Java에서 배열을 복사하는 데 사용할 수 있는 여러 가지 기술이 있습니다.
예제를 들어 보겠습니다
class Main { public static void main(String[] args) { int[] numbers = {1, 2, 3, 4, 5, 6}; int[] positiveNumbers = numbers; //배열 복사 for(int number : positiveNumbers) { System.out.print(number + ""); } } }
출력:
1, 2, 3, 4, 5, 6
위의 예제에서, 우리는 numbers 배열을 positiveEnumbers 배열로 복사하는 데 사용하는 대입 연산자 (=)를 사용했습니다.
이 기술은 가장 간단한 기술 중 하나이며, 동일한 효과를 가집니다. 그러나, 이 기술에는 문제가 있습니다. 우리가 배열의 요소를 변경하면, 다른 배열의 해당 요소도 변경됩니다. 예를 들어,
class Main { public static void main(String[] args) { int[] numbers = {1, 2, 3, 4, 5, 6}; int[] positiveNumbers = numbers; //배열 복사 //첫 번째 배열의 값을 변경합니다 numbers[0] = -1; //두 번째 배열을 출력합니다 for(int number : positiveNumbers) { System.out.print(number + ""); } } }
출력:
-1, 2, 3, 4, 5, 6
여기서, 우리는 numbers 배열의 하나의 값을 변경했습니다. positiveNumbers 배열을 출력할 때, 같은 값도 변경되었습니다.
이유는 두 배열이 같은 배열 객체를 참조하기 때문입니다. 이는 가볍은 복사 때문입니다. 가볍은 복사에 대한更多信息을 알고 싶다면, 방문하십시오가볍은 복사。
현재, 배열을 복사하면서 새 배열 객체를 생성하려면 깊은 복사가 아닌 가볍은 복사가 필요합니다.
예를 들어,
import java.util.Arrays; class Main { public static void main(String[] args) { int[] source = {1, 2, 3, 4, 5, 6}; int[] destination = new int[6]; //반복하여 요소를 원본에서 목적지로 복사합니다 for (int i = 0; i < source.length; ++i) { destination[i] = source[i]; } //배열을 문자열로 변환합니다 System.out.println(Arrays.toString(destination)); } }
출력:
[1, 2, 3, 4, 5, 6]
위의 예제에서는 for 루프를 사용하여 원본 배열의 각 요소를 순회합니다. 각 반복에서는 원본 배열에서 요소를 목적 배열로 복사합니다.
여기서, 원본과 목적 배열이 다른 객체(깊은 복사)를 참조합니다. 따라서, 하나의 배열의 요소가 변경되면 다른 배열의 해당 요소도 변경되지 않습니다.
다음과 같은 문장을 주목하세요
System.out.println(Arrays.toString(destination));
toString() 메서드는 배열을 문자열로 변환하는 데 사용됩니다.
Java에서System 클래스데이터가 포함된 arraycopy() 메서드를 복사합니다. 위의 두 가지 메서드에 비해, 이 메서드는 배열을 복사하는 데 더 나은 방법입니다.
메서드는 원본 배열의 지정된 부분을 목적 배열로 복사할 수 있습니다. 예를 들어,
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
여기서
src -복사할 원본 배열을 선택하십시오
srcPos -원본 배열의 시작 위치(인덱스)
dest -목적 배열에서 원본에서 복사할 요소
destPos -목적 배열의 시작 위치(인덱스)
length -복사할 요소의 수
예를 들어,
//Arrays.toString() 메서드를 사용하여 import java.util.Arrays; class Main { public static void main(String[] args) { int[] n1 = {2, 3, 12, 4, 12, -2}; int[] n3 = new int[5]; //길이의 배열을 생성합니다1의 n2배열 int[] n2 = new int[n1.length]; //전체 n1배열을 n로 복사합니다2 System.arraycopy(n1, 0, n2, 0, n1.length); System.out.println("n2 = " + Arrays.toString(n2)); //부터 n1배열의 인덱스2복사 요소 //요소를 n로 복사합니다3배열의 인덱스1 //복사됩니다2개의 요소 System.arraycopy(n1, 2, n3, 1, 2); System.out.println("n3 = " + Arrays.toString(n3)); } }
출력:
n2 = [2, 3, 12, 4, 12, -2] n3 = [0, 12, 4, 0, 0]
위의 예제에서는 arraycopy() 메서드를 사용했습니다.
System.arraycopy(n1, 0, n2, 0, n1.length) - n1배열의 전체 요소가 n로 복사됩니다2배열에서
System.arraycopy(n1, 2, n3, 1, 2 )- INDEX2시작하는 n1배열의 두 요소가 n에서 복사됩니다3배열1시작 인덱스에서
정보를 볼 수 있듯이, int형 배열 요소의 기본 초기값은 0입니다.
또한 사용할 수 있습니다Java ArraysArrayCopy 클래스에서 정의된 copyOfRange() 메서드를 사용하여 배열을 복사합니다. 예를 들어,
//toString()와 copyOfRange() 메서드를 사용하여 import java.util.Arrays; class ArraysCopy { public static void main(String[] args) { int[] source = {2, 3, 12, 4, 12, -2}; //전체 원본 배열을 목적지로 복사합니다 int[] destination1 = Arrays.copyOfRange(source, 0, source.length); System.out.println("destination1 = " + Arrays.toString(destination1)); //INDEX2복사까지5(제외5) int[] destination2 = Arrays.copyOfRange(source, 2, 5); System.out.println("destination2 = " + Arrays.toString(destination2)); } }
출력 결과
destination1 = [2, 3, 12, 4, 12, -2] destination2 = [12, 4, 12]
위 예제에서 다음 행을 주목하세요:
int[] destination1 = Arrays.copyOfRange(source, 0, source.length);
여기서 destination을 생성하고 있는 것을 볼 수 있습니다1배열과 동시에 원본 배열을 그에 복사합니다. copyOfRange() 메서드를 호출하기 전에 destination을 생성하지 않습니다1에 대한 더 많은 정보를 얻으려면 방문하세요Java copyOfRange。
일차원 배열과 마찬가지로 두차원 배열을 for 루프를 사용하여 복사할 수도 있습니다. 예를 들어,
import java.util.Arrays; class Main { public static void main(String[] args) { int[][] source = {"}} {1, 2, 3, 4}, {5, 6}, {0, 2, 42, -4, 5} }; int[][] destination = new int[source.length][]; for (int i = 0; i < destination.length; ++i) { //목표 배열의 각 행에 공간을 할당합니다 destination[i] = new int[source[i].length]; for (int j = 0; j < destination[i].length; ++j) { destination[i][j] = source[i][j]; } } //목표 배열을 표시합니다 System.out.println(Arrays.deepToString(destination)); } }
출력:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
위 프로그램에서 다음 행을 주목하세요:
System.out.println(Arrays.deepToString(destination);
여기서 deepToString() 메서드를 사용하여 더 나은 두차원 배열 표현을 제공합니다. 더 많은 정보를 얻으려면 방문하세요Java deepToString()。
이 코드를 더 간단하게 만들기 위해 System.arraycopy()를 내부 루프 대신 사용할 수 있습니다. 예를 들어, 예를 들어,
import java.util.Arrays; class Main { public static void main(String[] args) { int[][] source = {"}} {1, 2, 3, 4}, {5, 6}, {0, 2, 42, -4, 5} }; int[][] destination = new int[source.length][]; for (int i = 0; i<source.length; ++i) { //목표 배열의 각 행에 공간을 할당합니다 destination[i] = new int[source[i].length]; System.arraycopy(source[i], 0, destination[i], 0, destination[i].length); } //목표 배열을 표시합니다 System.out.println(Arrays.deepToString(destination)); } }
출력:
[[1, 2, 3, 4], [5, 6], [0, 2, 42, -4, 5]]
여기서 우리는 arraycopy() 메서드를 내부 for 루프 대신 사용하여 동일한 출력을 얻을 수 있다는 점을 볼 수 있습니다.