2009-09-02 6 views
8

Java에서 primit가 아닌 타입의 배열을 복사하는 방법은 무엇입니까? 성능 문제는 어떻습니까? 합니다 (offsetlength 파라미터로하면 어레이의 임의의 부위를 복사 할 수있는 기능을 제공)Java : 원시 타입이 아닌 배열 복사

+0

배열 자체 (즉, 배열의 참조) 만 복사 하시겠습니까? 아니면 배열의 참조가 가리키는 모든 객체를 복제하고 싶습니까? – Jesper

답변

7

오래된 학교 방법이었다

public static void java.lang.System.arraycopy(Object src, int srcPos, 
     Object dest, int destPos, int length) 

이 다른 하나 개의 기존 배열에서 copys. 복사본을 복사본으로 만들고 있다고 가정하면 새로운 배열을 직접 할당해야합니다.

JDK 6 이상부터 java.util.Arrays 클래스에는 새로운 크기의 배열 복사본을 만드는 데 사용되는 숫자가 copyOf 개 있습니다. 관련되어있는 것들이다 :

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

public static <T,U> T[] copyOf(U[] original, int newLength, 
     Class<? extends T[]> newType) 

이 처음 원래 어레이 형을 이용하여 복사를 만들고, 두 번째는 다른 배열 형태로 복사한다.

arraycopy와 3 인수 copyOf는 원본 (소스) 배열의 각 요소 유형을 대상 배열 유형과 대조해야합니다. 그래서 두 가지 모두 유형 예외를 던질 수 있습니다. copyOf (이론적으로 적어도)의 2 인자는 타입 검사를 할 필요가 없으므로 (이론적으로) 더 빨리 수행되어야합니다. 실제로 상대적인 성능은 구현에 따라 다릅니다. 예를 들어, arraycopy은 종종 JVM에 의해 특별한 대우를받습니다.

+0

int [] array = {1, 2, 3}; int [] copy = Arrays.copyOf (array, array.length, Integer.class);'컴파일되지 않습니다 (_ "Array 유형의 copyOf (int [], int) 메서드는 인수에 적용 할 수 없습니다 (int [], int, Class ) "_) –

14
System.arraycopy 

. 또는 JDK 6에 추가하고 사용할 수 있도록 일반적인 방법입니다했다

java.util.Arrays.copyOf 

:이 유형 좁힐 수 있습니다

Integer[] is = new Integer[] { 4, 6 } 
Integer[] copy = Arrays.copyOf(is, is.length); 

또는 :

Number[] is = new Number[]{4, 5}; 
Integer[] copy = Arrays.copyOf(is, is.length, Integer[].class); 

참고 당신이 할 수있는 배열에 clone 방법을 사용하십시오.

,210
+0

터치에 옥스 보우 (Touché oxbow) - 같은 대답으로 30 분 후에 누군가가 와서 받아 들였습니다! – pjp

+0

@pjp : Stephen의 대답을 받아 들였습니다. 질문의 실행 부분을 추가로 언급했습니다. – desolat

+0

전혀 문제가되지 않습니다 * 왜 * pjp *가 너무 까다 롭습니다! –