Java varargs是如何在内存中实现的



据我所知,本地变量和args存储在堆栈内存中,其中包括对象引用,而实际对象存储在堆内存中。那么,当您使用var args时,会发生什么呢?

public static int[] test(int... x) {
return x;
}
public static void main(String[] args) {
int[] a = test(1,2,3,4,5);
int[] b = test(6,7,8,9,0);
System.out.println(a);
System.out.println(b);
for (int i : a) {
System.out.println(i);
}
for (int i : b) {
System.out.println(i);
}

在这里,我相信x中作为params传递给test的所有值都存储在堆栈上,因此当我们调用test(1,2,3,4,5)时,我们正在使用堆栈空间,相应地,当我们调用test(6,7,8,9,0)时,我们应该在堆栈上引起内存冲突。。。但当我运行上面的程序时,我会得到以下结果。

[I@2db0f6b2
[I@3cd1f1c8
1
2
3
4
5
6
7
8
9
0

可以看出,由于对生成btest的第二次调用,a中的项没有损坏。两者的存储方式似乎不同。

这是否意味着params以某种方式存储在堆中?这是否意味着任何形式为function(param)的调用都会转换为param(基元或内存引用(的值,而不一定位于堆栈内存上?

Varags只是数组之上的语法修饰,即使用int...参数与使用int[]参数相同。与所有数组一样,数组驻留在堆上,并在堆栈上向下传递对它的引用。

x...只是x[]的语法糖。认为它的工作过程和原始数组完全相同。

如果引用本身是类或对象,如果它是方法如果基元类型类或对象的成员。-源

最新更新