在 Java 中将数组作为参数传递是否可以,例如int[5] &result
?
我想传递对数组的引用,因为我想在调用函数中更改数组。语法是什么?
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 中的对象。并且对对象的引用是按值传递的。
在 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 是“按引用传递”吗?
Java 是按值传递的。此引用将按值传递,即复制。它仍将指向原始数组。
int[] arrayToPass
这可能是一种不受欢迎的思考方式,但我自己是 C/C++ 方面的,它让我更容易。
在 Java 中,对象是引用类型。这意味着实际的对象在某处的堆上,而您实际使用的只是对该对象的引用。因此,根据 C 指针(作为类比)来考虑它会更简单。
Classname object;
在 C/C++ 中的行为类似于以下内容
Classname *object;
同样,在函数的情况下,它们的行为就像函数的参数作为指针传递一样。类似于在 C 中模拟传递引用的方式:
void Function(Classname object)
它更像是下面的 C 版本
void Function(Classname *object)
只要您不更改指针本身的值(在 java 中通过使用新实例重新分配变量),您就可以使用它来访问和修改原始实例。
总而言之,除了原始类型(、、等)之外的所有类型都是引用类型(甚至像、、和数组这样的类型)。int
double
boolean
Integer
Double
Boolean
因此,正如其他人已经解释的那样,您不需要添加&
它以使其行为符合您的预期(除了某些警告,例如使用新实例重新分配)。
可以更改您的函数参数以接受列表吗?
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
我稍后会对此进行审查。