19

在 Java 中将数组作为参数传递是否可以,例如int[5] &result

我想传递对数组的引用,因为我想在调用函数中更改数组。语法是什么?

4

5 回答 5

40
private void demo() {
    int[] array = new int[5];
    System.out.println(Arrays.toString(array)); // 0, 0, 0, 0, 0
    fillArray(array);
    System.out.println(Arrays.toString(array)); // 0, 1, 2, 3, 4
}

private void fillArray(int[] array) {
    for (int i = 0; i < array.length; i++) {
        array[i] = i;
    }
}

数组是 Java 中的对象。并且对对象的引用是按值传递的。

于 2012-12-27T22:31:39.447 回答
23

在 Java 中,数组是按值传递的,但值是对数组的引用。假设你有一个数组arr。传递的时候可以改变arr引用的数组,但是不能改变arr引用的数组;即在方法内部,您可以修改被引用的对象,但不能修改仍将是对同一对象的引用的传递变量。我将尝试用一个例子来说明:

public static void swap(StringBuffer a, StringBuffer b)
{
    StringBuffer t = a;
    a = b;
    b = t;
}

public static void change(StringBuffer a, StringBuffer b)
{
    a = a.append("1");
    b = b.append("2");
}

public static void main(String[] args)
{
    StringBuffer a = new StringBuffer("First");
    StringBuffer b = new StringBuffer("Second");
    swap(a, b);
    System.out.println(a + " " + b);
    change(a, b);
    System.out.println(a + " " + b);
}

输出:

First Second
First1 Second2

您可以从First Second输出中获得的示例中看到,而不是Second First. 这是因为在函数swap中使用了对 main 中的引用没有影响的副本。从而说明您不能修改仍将是对同一对象的引用的传递变量的事实。但是,该函数change会带来预期的效果,因为您可以修改引用的对象

有关更多参考,请参阅:
Java 是“按引用传递”吗?

于 2012-12-27T22:34:55.510 回答
5

Java 是按值传递的。此引用将按值传递,即复制。它仍将指向原始数组。

int[] arrayToPass
于 2012-12-27T22:30:47.837 回答
2

这可能是一种不受欢迎的思考方式,但我自己是 C/C++ 方面的,它让我更容易。

在 Java 中,对象是引用类型。这意味着实际的对象在某处的堆上,而您实际使用的只是对该对象的引用。因此,根据 C 指针(作为类比)来考虑它会更简单。

Classname object;

在 C/C++ 中的行为类似于以下内容

Classname *object;

同样,在函数的情况下,它们的行为就像函数的参数作为指针传递一样。类似于在 C 中模拟传递引用的方式:

void Function(Classname object)

它更像是下面的 C 版本

void Function(Classname *object)

只要您不更改指针本身的值(在 java 中通过使用新实例重新分配变量),您就可以使用它来访问和修改原始实例。

总而言之,除了原始类型(、、等)之外的所有类型都是引用类型(甚至像、、和数组这样的类型)。intdoublebooleanIntegerDoubleBoolean

因此,正如其他人已经解释的那样,您不需要添加&它以使其行为符合您的预期(除了某些警告,例如使用新实例重新分配)。

于 2012-12-27T22:50:20.980 回答
0

可以更改您的函数参数以接受列表吗?

java.util.Arrays 中的静态方法 asList 应该返回一个使用数组作为存储的 List。

class Example
{
  public static void changeArray( List t )
  {
    //
  }
}

// a caller
int[] test = new int[5];
Example.changeArray( Arrays.asList( test ) ); //list backed with array

我稍后会对此进行审查。

于 2012-12-27T22:45:49.547 回答