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函数参数是不是总是按值传递数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

java方法参数

java 值传递 数组传递

值的引用传递数组作为函数参数

ECMAScript 中所以函数的参数都是按值传递

java传递参数问题

Java方法中传递数组与改变数组值的问题