如果我们有大byte[]
个数组(如40Mb),我们想用方法发送它
method(array);
会复制数组吗?因此,Java中的内存将增加另外40Mb env => 80Mb ,对吧?
如果是,我们如何在调用方法后销毁'first'数组?
答案 0 :(得分:7)
不,不会复制数组。
在Java中,所有内容都始终按值传递。
非基本类型的变量是对象的引用。数组是一个对象,数组类型的变量是对该数组对象的引用。
当你调用一个采用非基本类型参数的方法时,引用按值传递 - 这意味着,引用本身被复制,但不是它所引用的对象。
答案 1 :(得分:1)
不会创建新的Object
,只需将参考复制到函数参数。
答案 2 :(得分:1)
变量array
实际上只是对数组对象的引用。当您将array
传递给函数时,您只是复制引用而不是引用引用的实际数组。
答案 3 :(得分:1)
Java总是按值传递。传递的值是基本类型的变量值,以及对象的变量保持的引用值。
在这种情况下,数组是一个Object,通过value传递的是对该Object的引用。所以不,数组不会被复制。
答案 4 :(得分:0)
Java将对象作为值传递的引用传递。
因此堆中只有一个Object副本。请查看以下示例:来自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
答案 5 :(得分:0)
不,不会复制数组。事实上,因为:
在Java中,一切都是按值传递的。
数组本身就是一个对象。
因此,结果是array'
将复制方法,但它包含的内容:字节元素不能复制。所以,您在method
中为数组更改的所有内容都会影响原始数组。
所以,内存不会像你看到的那样加倍:)