자바 배열 복사 네 가지 방법
순환 복사(속도 가 상대 적 으로 느 림)
순환 복 사 는 사실 할 말 이 없다.바로 하나의 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
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
GitHub 웹 사이트에서 폴더 이름 바꾸기최근 Mac에서 작업하는 동안 git 저장소를 시작하고 물음표(?)가 있는 폴더를 만든 문제가 발생했습니다. 그것은 Mac에서는 유효한 폴더 이름이지만 Windows에서는 아닙니다. 그래서 나중에 Windows PC...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.