[java] 배열 복사본 만들기



Answers

당신이 사용할 수있는

int[] a = new int[]{1,2,3,4,5};
int[] b = a.clone();

게다가.

Question

나는 항상 업데이트되고있는 배열을 가지고있다. a = [1,2,3,4,5] 라고하자. 나는 a 의 정확한 사본을 만들고 그것을 b 라고 부른다. a 가 [6,7,8,9,10]으로 변경되면 b 는 여전히 [1,2,3,4,5]가되어야합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? for 루프를 다음과 같이 시도했다.

for(int i=0; i<5; i++){
   b[i]=a[i]
}

하지만 제대로 작동하지 않는 것 같습니다. 그 의미가 무엇인지 모르기 때문에 딥 복사 등의 고급 용어를 사용하지 마십시오.




http://www.journaldev.com/753/how-to-copy-arrays-in-java 멋진 설명

Java Array 복사 메소드

Object.clone () : Object 클래스는 clone () 메서드를 제공하고 java의 array도 Object이기 때문에이 메서드를 사용하여 전체 배열 복사본을 얻을 수 있습니다. 배열의 부분 복사를 원하면이 방법은 적합하지 않습니다.

System.arraycopy () : 시스템 클래스 arraycopy ()는 배열의 부분 복사를 수행하는 가장 좋은 방법입니다. 복사 할 총 요소 수와 소스 및 대상 배열 인덱스 위치를 쉽게 지정할 수 있습니다. 예를 들어 System.arraycopy (source, 3, destination, 2, 5) 는 소스의 세 번째 인덱스에서 두 번째 대상 인덱스로 시작하여 소스에서 대상으로 5 개의 요소를 복사합니다.

Arrays.copyOf () : 배열의 처음 몇 요소 나 배열의 전체 복사본을 복사하려면이 메서드를 사용할 수 있습니다. 분명히 System.arraycopy ()와 같이 다용도가 아니지만 혼란스럽지 않고 사용하기 쉽습니다.

Arrays.copyOfRange () : 시작 인덱스가 0이 아닌 배열의 일부 요소를 복사하려는 경우이 메서드를 사용하여 부분 배열을 복사 할 수 있습니다.




Java에서 Arrays.copyOf ()를 사용해 볼 수 있습니다.

int[] a = new int[5]{1,2,3,4,5};
int[] b = Arrays.copyOf(a, a.length);



ArrayList 아닌 원시 배열로 작업해야한다면 Arrays 필요한 항목이 있습니다. 소스 코드를 살펴보면 배열의 복사본을 얻는 가장 좋은 방법입니다. System.arraycopy() 메서드는 비논리적 인 매개 변수를 제공하면 검사되지 않은 예외가 많이 발생하므로 방어적인 프로그래밍이 필요합니다.

Arrays.copyOf() 중 하나를 사용하여 첫 Nth 요소부터 Nth 요소까지 새로운 짧은 배열로 복사합니다.

public static <T> T[] copyOf(T[] original, int newLength)

copy가 지정된 길이가되도록 지정된 배열을 잘라내거나 null (필요한 경우)으로 채 웁니다. 원래 배열과 복사본에서 유효한 모든 인덱스의 경우 두 배열에 동일한 값이 포함됩니다. 사본에는 유효하지만 원본에는 유효하지 않은 색인의 경우, 사본에는 널 (null)이 들어갑니다. 이러한 인덱스는 지정된 길이가 원래 배열의 길이보다 큰 경우에만 존재합니다. 결과 배열은 원래 배열과 정확히 같은 클래스입니다.

2770
2771    public static <T,U> T[] More ...copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
2772        T[] copy = ((Object)newType == (Object)Object[].class)
2773            ? (T[]) new Object[newLength]
2774            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
2775        System.arraycopy(original, 0, copy, 0,
2776                         Math.min(original.length, newLength));
2777        return copy;
2778    }

또는 Arrays.copyOfRange() 도 트릭을 수행합니다.

public static <T> T[] copyOfRange(T[] original, int from, int to)

지정된 배열의 지정된 범위를 새로운 배열에 복사합니다. 범위 (from)의 초기 색인은 0과 original.length를 포함해야합니다. original [from]의 값은 (== original.length 또는 == to가 아닌 한) 사본의 초기 요소에 배치됩니다. 원본 배열의 후속 요소의 값은 복사본의 후속 요소에 배치됩니다. from보다 크거나 같아야하는 범위의 최종 색인 (to)은 original.length보다 클 수 있습니다.이 경우 색인이 원래보다 크거나 같은 사본의 모든 요소에 null이 위치합니다. 길이 -에서. 리턴 된 배열의 길이는 to - from이됩니다. 결과 배열은 원래 배열과 정확히 같은 클래스입니다.

3035    public static <T,U> T[] More ...copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
3036        int newLength = to - from;
3037        if (newLength < 0)
3038            throw new IllegalArgumentException(from + " > " + to);
3039        T[] copy = ((Object)newType == (Object)Object[].class)
3040            ? (T[]) new Object[newLength]
3041            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
3042        System.arraycopy(original, from, copy, 0,
3043                         Math.min(original.length - from, newLength));
3044        return copy;
3045    }

보시다시피,이 두 가지 모두 System.arraycopy 를 통한 래퍼 함수이며 방어 논리를 사용하여 수행하려는 작업이 유효합니다.

System.arraycopy 는 배열을 복사하는 가장 빠른 방법입니다.




배열에서 호출하는 모든 솔루션은 코드를 중복 null null checkersconsider 예제 :

int[] a = {1,2,3,4,5};
int[] b = Arrays.copyOf(a, a.length);
int[] c = a.clone();

//What if array a comes as local parameter? You need to use null check:

public void someMethod(int[] a) {
    if (a!=null) {
        int[] b = Arrays.copyOf(a, a.length);
        int[] c = a.clone();
    }
}

바퀴를 발명하지 않고 모든 필수 검사가 이미 수행 된 유틸리티 클래스를 사용하는 것이 좋습니다. 아파치 공유에서 ArrayUtils를 고려하십시오. 코드가 짧아집니다.

public void someMethod(int[] a) {
    int[] b = ArrayUtils.clone(a);
}

아파치 공유지를 찾을 수 there






Related