4

重複の可能性:
Java は「参照渡し」ですか?

大きなbyte[]配列 (40Mb など) があり、それをメソッドで送信したい場合

method(array);

配列はコピーされますか? Java env => 80Mbでは、メモリがさらに 40Mb 増加しますよね?

はいの場合、メソッドを呼び出した後に「最初の」配列をどのように破棄できますか?

4

6 に答える 6

7

いいえ、アレイはコピーされません。

Java では、すべてが常に値渡しされます

非プリミティブ型の変数は、オブジェクトへの参照です。配列はオブジェクトであり、配列型の変数はその配列オブジェクトへの参照です。

非プリミティブ型パラメーターを取るメソッドを呼び出すと、参照は値渡しされます。つまり、参照自体はコピーされますが、参照先のオブジェクトはコピーされません。

于 2012-12-14T10:57:19.433 に答える
1

新しいObjectものは作成されません。関数パラメータへの参照のみがコピーされます。

于 2012-12-14T10:55:45.043 に答える
1

変数arrayは、実際には配列オブジェクトへの単なる参照です。関数に渡すときarrayは、参照が参照する実際の配列ではなく、参照をコピーするだけです。

于 2012-12-14T10:56:25.037 に答える
1

Java は常に値渡しです。渡される値は、プリミティブ型の場合は変数の値、オブジェクトの場合は変数が保持する参照の値です。

この場合、配列はオブジェクトであり、値によって渡されるものはそのオブジェクトへの参照です。いいえ、配列はコピーされません。

于 2012-12-14T10:57:06.510 に答える
0

Java は、オブジェクトを値渡しの参照として渡します。

したがって、ヒープには Object のコピーが 1 つだけ存在します。次の例を探してください: Is Java “pass-by-reference”?から

public void foo(Dog d) {
  d.name.equals("Max"); // true
   d = new Dog("Fifi");
   d.name.equals("Fifi"); // true
 }

Dog aDog = new Dog("Max");
foo(aDog);
aDog.name.equals("Max"); // true
于 2012-12-14T11:00:23.517 に答える
0

いいえ、アレイはコピーされません。実際、次の理由によります。

  1. Java では、すべてが常に値渡しされます。

  2. 配列自体はオブジェクトです。

したがって、結果はarray'メソッドのコピーになりますが、含まれているものは次のとおりです。バイト要素はコピーされません。そのため、 で配列を変更すると、すべて元の配列method影響します。

したがって、ご覧のようにメモリは2倍になりません:)

于 2012-12-14T11:01:00.970 に答える