자바 배열 복사 네 가지 방법

자바 배열 복사 에는 주로 네 가지 방법 이 있 는데 그것 이 바로 순환 할당,System.array copy(),Arrays.copy Of()(또는 Arrays.copy OfRange)와 clone()방법 이다.다음은 이 몇 가지 복사 본 을 각각 소개 한다.
순환 복사(속도 가 상대 적 으로 느 림)
순환 복 사 는 사실 할 말 이 없다.바로 하나의 for 순환 으로 요소 의 하나씩 복사 하고 깊 은 복사 나 얕 은 복 사 를 하 는 것 이다.이것 은 모두 가 스스로 파악 할 수 있다.
System.arraycopy(얕 은 복사)
이것 은 시스템 이 제공 하 는 복사 방식 이자 우리 가 추천 하 는 복사 방식 이다.이것 은 얕 은 복사 이다.즉,기본 적 인 유형 이 아 닌 대상 의 인용 이지 새로운 대상 을 만 드 는 것 이 아니다.코드 를 통 해 알 수 있 듯 이 이 방법 은 자바 언어 로 쓴 것 이 아니 라 바 텀 c 또는 c+로 이 루어 진 것 이기 때문에 속도 가 비교적 빠르다.
public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length);                  

소스 코드 를 통 해 알 수 있 듯 이 키 네 이 티 브 는 자바 언어 로 쓴 것 이 아니 라 다른 언어의 코드 를 호출 한 것 임 을 설명 합 니 다.
Arrays.copyOf(얕 은 복사)
이 방법 도 얕 은 복사 인 데,왜 일 까?우 리 는 그것 의 소스 코드 를 보면 알 수 있다.
public static byte[] copyOfRange(byte[] original, int from, int to) {                   
   int newLength = to - from;
   if (newLength < 0)
       throw new IllegalArgumentException(from + " > " + to);
       byte[] copy = new byte[newLength];
       System.arraycopy(original, from, copy, 0,
              Math.min(original.length - from, newLength));
        return copy;
    }

실제로 System.array copy 를 호출 했 기 때문에 분명 얕 은 복사 일 것 입 니 다.
Object.clone
clone()은 특수 합 니 다.대상 에 게 는 깊 은 복사 이지 만 배열 에 있어 서 는 얕 은 복사 입 니 다.
대상 복사
먼저 대상 의 복사 본 을 말씀 드 리 겠 습 니 다.그것 은 깊 은 복사 본 이 므 로 대상 으로 테스트 해 보 세 요.다음은 소스 코드 를 살 펴 보 겠 습 니 다.
protected native Object clone() throws CloneNotSupportedException;

여기에 네 이 티 브 키워드 도 있 기 때문에 밑바닥 의 c 언어 가 이 루어 진 것 이다.그리고 주의해 야 할 것 은 이 수정자 가 proctected 입 니 다.즉,우리 가 Object 류 를 만 든 후에 이 clone()방법 을 직접 호출 할 수 없습니다.proctected 키 워드 는 같은 가방 안의 클래스 와 그 하위 클래스 만 호출 할 수 있 기 때문에 우 리 는 하나의 object 류 를 설명 할 때 같은 가방 안에 있 지 않 기 때문에 호출 할 수 없습니다.
이 방법 을 호출 하려 면 클래스 를 작성 하고 cloneable 인 터 페 이 스 를 실현 하 는 것 을 성명 해 야 합 니 다.object 에 계승 하 는 것 을 표시 할 필요 가 없습니다.자바 의 클래스 가 부모 클래스 를 표시 하지 않 으 면 기본 부모 클래스 는 object 이기 때 문 입 니 다.그리고 우 리 는 이 방법 을 계승 한다.
@Override
    public Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }

이 방법 을 다른 가방 에서 호출 할 수 있 도록 이 권한 을 Public 로 업그레이드 해 야 합 니 다.이제 우 리 는 이런 종류의 clone()방법 으로 우리 의 종 류 를 복사 할 수 있다.
배열 복사
배열 의 경우 인용 할당 을 다른 배열 로 간단하게 인용 하 는 것 이 아니 라 새로운 배열 을 만 드 는 것 입 니 다.그러나 우 리 는 배열 자체 에 있어 서 그 요소 가 대상 일 때 원래 배열 의 모든 요소 에 저 장 된 것 이 대상 의 인용 이라는 것 을 알 고 있다.그래서 복사 한 배열 은 자 연 스 럽 게 대상 의 인용 이기 때문에 배열 대상 요소 에 있어 서 는 얕 은 복사 이기 도 한다.우 리 는 다음 코드 로 검증 합 니 다.

class Aby implements Cloneable{
    public int i;
    public Aby(int i) {
        this.i = i;
    }
    @Override
    public Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }
}

public class Solution {

    public static void main(String[] args) throws CloneNotSupportedException {
        Aby aby1 = new Aby(1);
        Aby aby2 = (Aby) aby1.clone();
        aby1.i = 2;
        System.out.println(aby1.i); //2
        System.out.println(aby2.i); //1

        Aby[] arr = {aby1,aby2};

        Aby[] arr2 = arr.clone();
        arr2[0].i = 3;
        System.out.println(arr[0].i);   //3
        System.out.println(arr2[0].i);  //3
    }
}

좋은 웹페이지 즐겨찾기