I 표준 유틸이 없습니다깊은 복사 []와 ArrayList를 자바
내가 그렇게 할 수있는 방법 몇 가지 객체 []의 깊은 복사와 ArrayList를 을 만들고 싶어 (반복하지 않고, 및 호출 클론) 이걸하기 위해?
감사 주앙
I 표준 유틸이 없습니다깊은 복사 []와 ArrayList를 자바
내가 그렇게 할 수있는 방법 몇 가지 객체 []의 깊은 복사와 ArrayList를 을 만들고 싶어 (반복하지 않고, 및 호출 클론) 이걸하기 위해?
감사 주앙
없음 없음 사소한 개체는 복제를 지원하기 위해 일부를 제공해야합니다 (복제 또는 직렬화를 구현하는 형태 임). 이 방법은 내장 된 방법이없고 루프가 어쩔 수없는 이유입니다.
모든 코드가 있다면 복제본을 사용하여 복제 생성자를 권장하거나 serialize/deserialize를 권장합니다. JVM에 저수준 사본을 요청하지 않고 객체에 자체 사본을 작성하라고 요청합니다.
public class Widget {
private int x = 0;
public Widget(Widget copyMe){
this.x = copyMe.x;
// ...
}
// ....
}
당신은 여전히 새 컬렉션을 채우는 복사 생성자를 호출하는 기존의 콜렉션 루프 물론 루프가 필요합니다 이러한 코드는 그렇게 잘하면 저렴 장기적으로 유지 읽기가 매우 간단하고 쉽습니다. 효과적인 Java라는 책이 있습니다.이 책에서는 복제본의 함정에 대해 자세히 설명하고 직렬화하여 매우 좋습니다.
매우 고속 복사 및 분류 등 (예 : Hadoop)이 필요한 시스템이 있습니다. 이러한 시스템은 사용자 지정 바이너리 형식 (예 : byte [] getAsBytes()/public Widget (byte [] fromBytes))을 지원하기 위해 개발자에게 부담을줍니다. byte []로 변환 된 많은 객체를 더 큰 배열로 패킹한다는 것은 큰 배열의 System.arraycopy를 사용하여 매우 빠르게 한꺼번에 복사 할 수 있다는 것을 의미합니다. JVM은 System.arraycopy를 저수준 메모리 복사본으로 수행합니다. 복사 한 후에도 바이트 덩어리에서 객체를 비 직렬화하려면 루프가 필요합니다.
일반적으로 컴파일러와 jvm은 기본 코드를 매우 잘 최적화하는 경향이 있습니다. 실제 측정 가능한 성능 문제가 없다면 매우 읽기 쉬운 복사본 생성자가있는 매우 간단한 루프가 가장 장기적으로 될 것입니다 접근.
딥 복사본에는 개념적인 루프가 있습니다. 문제는 그것이 util 내부에서 볼 수 없게 숨어 있는지 여부입니다. – corsiKa
Dupe? http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object-in-java –
복사본을 수정 하시겠습니까? – Arkadiy