Java函数参数是不是总是按值传递数组? [复制]
Posted
技术标签:
【中文标题】Java函数参数是不是总是按值传递数组? [复制]【英文标题】:Are Java function parameters always passed-by-value for arrays? [duplicate]Java函数参数是否总是按值传递数组? [复制] 【发布时间】:2012-12-02 08:53:33 【问题描述】:可能重复:Is Java “pass-by-reference”?
如果我们有很大的 byte[]
数组(比如 40Mb)并且我们想在方法中发送它
method(array);
数组会被复制吗?所以在 Java env => 80Mb 中内存会再增加 40Mb,对吧?
如果是,我们如何在调用方法后销毁'first'数组?
【问题讨论】:
另见***.com/questions/15871825/… 【参考方案1】:不,不会复制数组。
在 Java 中,一切都总是按值传递。
非原始类型的变量是对对象的引用。数组是对象,数组类型的变量是对该数组对象的引用。
当您调用采用非原始类型参数的方法时,引用按值传递 - 这意味着,引用本身被复制,而不是它所引用的对象。
【讨论】:
【参考方案2】:不会创建新的Object
,只会将引用复制到函数参数。
【讨论】:
【参考方案3】:变量array
实际上只是对数组对象的引用。当您将 array
传递给函数时,您只是在复制引用而不是引用所引用的实际数组。
【讨论】:
【参考方案4】:Java 总是按值传递。传递的值是原始类型的变量值和对象的变量所持有的引用的值。
在这种情况下,数组是一个对象,通过值传递的是对该对象的引用。所以不,数组不会被复制。
【讨论】:
【参考方案5】: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
【讨论】:
【参考方案6】:不,数组不会被复制。事实上,因为:
在 Java 中,一切都是按值传递的。
数组本身就是一个对象。
所以,结果是array'
将被复制为方法,但它包含的东西:字节元素不复制。因此,您为 method
中的数组更改的所有内容都会影响原始数组。
所以,内存不会像你看到的那样翻倍:)
【讨论】:
只是好奇,关于第 2 点,“数组”是否扩展了“对象”? :-) java 中的每个对象都扩展了 Object ;) 一个基元数组是一个对象吗? 确实! ***.com/questions/12806739/…以上是关于Java函数参数是不是总是按值传递数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章