重複の可能性:
Java は「参照渡し」ですか?
大きなbyte[]
配列 (40Mb など) があり、それをメソッドで送信したい場合
method(array);
配列はコピーされますか? Java env => 80Mbでは、メモリがさらに 40Mb 増加しますよね?
はいの場合、メソッドを呼び出した後に「最初の」配列をどのように破棄できますか?
重複の可能性:
Java は「参照渡し」ですか?
大きなbyte[]
配列 (40Mb など) があり、それをメソッドで送信したい場合
method(array);
配列はコピーされますか? Java env => 80Mbでは、メモリがさらに 40Mb 増加しますよね?
はいの場合、メソッドを呼び出した後に「最初の」配列をどのように破棄できますか?
いいえ、アレイはコピーされません。
Java では、すべてが常に値渡しされます。
非プリミティブ型の変数は、オブジェクトへの参照です。配列はオブジェクトであり、配列型の変数はその配列オブジェクトへの参照です。
非プリミティブ型パラメーターを取るメソッドを呼び出すと、参照は値渡しされます。つまり、参照自体はコピーされますが、参照先のオブジェクトはコピーされません。
新しいObject
ものは作成されません。関数パラメータへの参照のみがコピーされます。
変数array
は、実際には配列オブジェクトへの単なる参照です。関数に渡すときarray
は、参照が参照する実際の配列ではなく、参照をコピーするだけです。
Java は常に値渡しです。渡される値は、プリミティブ型の場合は変数の値、オブジェクトの場合は変数が保持する参照の値です。
この場合、配列はオブジェクトであり、値によって渡されるものはそのオブジェクトへの参照です。いいえ、配列はコピーされません。
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
いいえ、アレイはコピーされません。実際、次の理由によります。
Java では、すべてが常に値渡しされます。
配列自体はオブジェクトです。
したがって、結果はarray'
メソッドのコピーになりますが、含まれているものは次のとおりです。バイト要素はコピーされません。そのため、 で配列を変更すると、すべて元の配列method
に影響します。
したがって、ご覧のようにメモリは2倍になりません:)