java - Java函数在返回参数时会复制参数传递的数组吗?

标签 java arrays

我读到 Java passes arrays to functions by reference (sort of)并且它允许对其进行修改,这将反射(reflect)在原始数组上。

嗯,我不确定上面链接中的引用部分,因为有人说 Java is always pass by value, with no exceptions, ever.但是我确信对参数数组的修改也会改变原始数组。

那么这是否意味着当我返回通过参数传递的同一个数组时,Java 会返回原始数组的副本?虽然不这样做并使用原始数组代替会节省一些内存和 CPU 使用率?还是 Java 在这两种情况下都复制数组?

例如,以下两个函数是否相同,或者第一个是否节省内存和 cpu 资源?:

public void modifyArray (int[] arr)
{
    for (int i = 0; i < arr.length; i++) arr[i] = i + 1;
}

public int[] modifyArray (int[] arr)
{
    for (int i = 0; i < arr.length; i++) arr[i] = i + 1;
    return arr;
}

编辑:

更清楚一点,我只关心性能(尤其是在处理大型数组时),我实际上不需要复制数组,我有一个现有代码可以执行此操作,想知道是否删除retun 部分会提高性能。

最佳答案

Java 按值传递引用。这意味着更换数组没有害处,即

public void f(String[] a)
{
   a = new String[42];
}

但更改其中的任何内容都会更改原始数组。一般对象的深度复制可能非常耗时,并且在对象包含引用对象的对象的情况下也很困难......因此标准行为是避免它。

关于java - Java函数在返回参数时会复制参数传递的数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36335145/

相关文章:

java - 如何在 Struts 2 中进行动态 URL 重定向?

java - 替换存储在字符串数组中的换行符

java - Android ImageSwitcher 图像到另一个 Activity

java - 为什么replaceAll在这行代码中不起作用?

java - Mongo 存储库测试搜索 Jpa 存储库

javascript - 编写一个 valueStock 函数,以产品数组作为参数

c - 我如何使用指针在该数组(函数)内部移动而不是数组订阅

ruby - 在文本 block 中搜索正则表达式数组的最有效方法是什么?

javascript - 将 jsonarray 分割成 block 数组到另一个数组中

java - 无法运行代码,intellij run arrow是 'grey'