可能的重复:
Java 是“按引用传递”吗?
如果我们有大byte[]
数组(比如 40Mb)并且我们想在方法中发送它
method(array);
数组会被复制吗?因此,Java env => 80Mb中的内存将再增加 40Mb ,对吗?
如果是,我们如何在调用该方法后销毁“第一个”数组?
可能的重复:
Java 是“按引用传递”吗?
如果我们有大byte[]
数组(比如 40Mb)并且我们想在方法中发送它
method(array);
数组会被复制吗?因此,Java env => 80Mb中的内存将再增加 40Mb ,对吗?
如果是,我们如何在调用该方法后销毁“第一个”数组?
不,不会复制数组。
在 Java 中,一切都是按值传递的。
非原始类型的变量是对对象的引用。数组是一个对象,数组类型的变量是对该数组对象的引用。
当您调用采用非原始类型参数的方法时,引用是按值传递的——这意味着,引用本身被复制,而不是它所引用的对象。
不会创建新Object
的,只会将引用复制到函数参数。
该变量array
实际上只是对数组对象的引用。当您传递array
给函数时,您只是在复制引用而不是引用所引用的实际数组。
Java 总是按值传递。传递的值是原始类型情况下的变量值和对象情况下变量持有的引用值。
在这种情况下,数组是一个对象,通过值传递的是对该对象的引用。所以不,数组不会被复制。
Java 将对象作为按值传递的引用传递。
所以 Heap 中只会有一个 Object 的副本。查找以下示例:来自Java “传递引用”吗?
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
都会影响原始数组。
所以,内存不会像你看到的那样翻倍:)