1

したがって、私は Java を初めて使用するので、この質問はおそらく少しばかげているように見えるかもしれませんが、とにかく... 次のようなコードがあるとします。

int[] oneArray = {1,2,3,4,5,6,7,8,9,10};
int[] anotherOne = new int[150];
anotherOne = Arrays.copyOf(oneArray, oneArray.length);

anotherOne を印刷すると、初期サイズが何であっても、copyOf メソッドの後に、前述の関数の 2 番目のパラメーターとして指定したものになります。上記の場合、配列は 10 要素に縮小されます (または、ポインターがメモリ内の別の場所を指し始め、新しい 10 要素配列が作成されたのではないでしょうか?)。だから私は間違っているのでしょうか、それともanotherOneの初期サイズはまったく意味がなく、将来のある時点でコピーになるように作成された場合は、サイズを指定せずに初期化する必要があります(int [] anotherOne;)?

4

4 に答える 4

9

代わりにこれを実行してください。これにより、不要な中間配列を作成する必要がなくなります。

int[] oneArray = {1,2,3,4,5,6,7,8,9,10};
int[] anotherOne = Arrays.copyOf(oneArray, oneArray.length);

ただし、2 番目の配列を length150にする必要がある場合は、次のように記述できます。

int[] oneArray = {1,2,3,4,5,6,7,8,9,10};
int[] anotherOne = new int[150];
System.arraycopy(oneArray, 0, anotherOne, 0, oneArray.length);
于 2012-09-17T17:38:31.027 に答える
6

Arrays.copyOfすでにコピーを作成しています。anotherOneその前に初期化する必要はありません。

int[] oneArray = {1,2,3,4,5,6,7,8,9,10};
int[] anotherOne = Arrays.copyOf(oneArray, oneArray.length);

あなたのコードで何が起こるかというと、

  • oneArrayメモリ内に配列を作成します
  • anotherOneメモリ内に 150 個の整数の配列を作成します
  • このArrays.copyOfメソッドは 3 番目の配列を作成し、変数anotherOneがこの配列を指すようにします。この結果、150 要素の配列への参照がなくなるため、ガベージ コレクションが実行されます。

つまり、実際には、コードは完全に機能しますが、150 個の整数の配列を作成および消去するために CPU 時間 (および短時間のメモリ) を無料で使用しています。

于 2012-09-17T17:38:37.120 に答える
2

Arrays.copyOfそのメソッド内で作成された新しい配列を返しています。その新しい配列を variable に割り当てるとanotherOne、作成した配列への参照が失われ、ガベージ コレクションの対象になります。

したがって、配列を作成するために使用するサイズは重要ではなく、初期化やそれを使用して作成する配列も重要でint[] anotherOne = new int[150]; はありません

以下を使用することもできます。

int[] anotherOne = Arrays.copyOf(oneArray, oneArray.length);

または:

int[] anotherOne;

// ...
anotherOne = Arrays.copyOf(oneArray, oneArray.length);

結果に少なくとも150 個の要素が本当に必要な場合は、次の方法でも実現できますArray.copyOf

int[] anotherOne =
    Arrays.copyOf(oneArray, (oneArray.length > 150) ? oneArray.length() : 150);

anotherOne少なくとも150 個の要素が含まれるようになりました。

于 2012-09-17T17:38:41.663 に答える
1

いいえ。

あなたが何かをするとき

int[] one = initilize...
int[] two = initilize...
two = one;

one の初期値は、Garbage Collector

于 2012-09-17T17:39:27.213 に答える