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

Cod*_*odi 0 java heap-memory variadic-functions stack-memory

据我所知,局部变量和参数存储在堆栈内存中,其中包括对象引用,而实际对象存储在堆内存中。那么当你使用 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);
    }
Run Code Online (Sandbox Code Playgroud)

test在这里,我相信作为参数传递给in 的所有值都x存储在堆栈中,因此当我们调用 时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
Run Code Online (Sandbox Code Playgroud)

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

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

Mur*_*nik 6

Varag 只是数组顶部的语法糖 - 即,使用int...参数与int[]. 与所有数组一样,数组驻留在堆上,并且您可以在堆栈上向下传递对它的引用。