0

私の質問を理解しやすくするために、次のサンプルコードを使用しています。このコードの出力は 5 ですが、私は 3 にしたかったのです。B は A のポインターとして機能していると推測していますが、最初に A を B にコピーし、その後の A の変更が B に影響しないようにする必要があります。 .

import java.io.*;
public class fg

{

public static void main(String args[]) throws Exception
{

    int[] A = new int[3];
            A[0]=1;
            A[1]=3;
            A[3]=7;

    check(A);


}

public static void check(int[] A)
{               
    int[] B = A;

    A[1] = 5;

    System.out.println(B[1]);
}

}

4

2 に答える 2

5

明示的にコピーを作成する必要があります。

int[] B = Arrays.copyOf(A, A.length);

int[]参照型であるため、割り当ては参照 (基本的にはポインター) をコピーするだけです。

配列要素自体がプリミティブ型でない場合は、おそらくディープ コピーが必要になるため、

type B[] = new type[A.length];
for(int i = 0; i < A.length; ++i) {
    B[i] = makeCopyOf(A[i]);  
}

どこでインスタンスmakeCopyOf()の適切なコピーを作成する必要がありtypeます。より良いものが見つからない場合はtype makeCopyOf(type orig) { return orig.clone(); }、フォールバックとして機能する可能性があります。

于 2012-11-05T12:52:03.830 に答える
2

B はreferenceであり、ポインタに似ています (さまざまな違いがあります - 算術を行うことはできず、直接メモリ ポインタではありません)。

そのため、参照している構造 (配列) のコピーを作成する必要があります。オブジェクトをコピーする場合は、ディープ コピーが必要になる場合があることに注意してください。おそらくコピー コンストラクターでこれを行う必要があります ( clone() が壊れていると見なされる理由については、この記事を参照してください) 。

于 2012-11-05T12:53:04.503 に答える