如何在内存中实现Java varargs

问题描述 投票:-1回答:2

据我所知,本地变量和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);
    }

在这里,我相信所有在test中作为参数传递给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

可以看出,a没有腐败的物品,因为第二次调用test产生了b。两者似乎都以不同方式存储。

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

java variadic-functions heap-memory stack-memory
2个回答
4
投票

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


2
投票

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

如果引用本身是类或对象的成员,则它可以存储在堆上,如果它是方法中的局部变量,则可以存储在堆栈上。如果原始类型是类或对象的成员,则它们可以存储在堆上。 - Source

© www.soinside.com 2019 - 2024. All rights reserved.