java array - 배열 복사본 만들기




5 Answers

System.arraycopy() 사용해 볼 수 있습니다.

int[] src  = new int[]{1,2,3,4,5};
int[] dest = new int[5];

System.arraycopy( src, 0, dest, 0, src.length );
deep copy

나는 항상 업데이트되고있는 배열을 가지고있다. 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]
}

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




당신이 사본을 만들고 싶다면 :

int[] a = {1,2,3,4,5};

이것은 갈 길입니다.

int[] b = Arrays.copyOf(a, a.length);

Arrays.copyOf 는 작은 배열에서 a.clone() 보다 Arrays.copyOf 수 있습니다. 두 요소 모두 똑같이 빠르게 복사하지만 clone ()은 Object 반환하므로 컴파일러에서 암시 적 캐스팅을 int[] 에 삽입해야합니다. 다음과 같이 바이트 코드에서 확인할 수 있습니다.

ALOAD 1
INVOKEVIRTUAL [I.clone ()Ljava/lang/Object;
CHECKCAST [I
ASTORE 2



나는이 모든 "배열을 복사하는 더 좋은 방법"이 정말로 당신의 문제를 해결하지 않는다고 생각합니다.

너는 말한다.

나는 [...]와 같은 for 루프를 시도했지만 올바르게 작동하지 않는 것 같습니까?

그 루프를 보면, 작동하지 않는 명백한 이유 는 없습니다.

  • 당신은 어쨌든 ab 배열을 엉망으로 만든다 (예를 들어 ab 는 같은 배열을 참조한다), 또는
  • 당신은 애플리케이션이 멀티 쓰레드이고 다른 쓰레드가 어레이를 동시에 읽고 업데이트하고 a .

두 경우 모두 복제를 수행하는 다른 방법으로는 기본 문제를 해결할 수 없습니다.

첫 번째 시나리오의 수정 사항은 분명합니다. 두 번째 시나리오에서는 스레드를 동기화하는 방법을 찾아야합니다. 원자 배열 클래스는 원자 복사 생성자 또는 복제 메서드가 없기 때문에 도움이되지 않지만 원시 뮤텍스를 사용하여 동기화하면 트릭을 수행합니다.

(당신의 질문에 힌트가 있는데, 실제로 스레드와 관련이 있다고 생각하게합니다. 예를 들어, a 가 끊임없이 변하는 것입니다.)




Arrays.copyOfRange 사용할 수도 있습니다.

:

public static void main(String[] args) {
    int[] a = {1,2,3};
    int[] b = Arrays.copyOfRange(a, 0, a.length);
    a[0] = 5;
    System.out.println(Arrays.toString(a)); // [5,2,3]
    System.out.println(Arrays.toString(b)); // [1,2,3]
}

이 방법은 Arrays.copyOf 와 비슷하지만 더 유연합니다. 두 사람 모두 System.arraycopy 를 사용합니다.

참조 :




배열의 null 안전 복사의 경우이 answer 제공된 Object.clone() 메서드와 함께 선택적 요소를 사용할 수도 있습니다.

int[] arrayToCopy = {1, 2, 3};
int[] copiedArray = Optional.ofNullable(arrayToCopy).map(int[]::clone).orElse(null);



Related

java arrays copy