代码之家  ›  专栏  ›  技术社区  ›  Codi

如何在内存中实现Java varargs

  •  -1
  • Codi  · 技术社区  · 6 年前

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

    在这里,我相信所有作为params传递给 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 因为第二次打电话给 测试 产生 b . 两者的存储方式似乎不同。

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

    2 回复  |  直到 6 年前
        1
  •  4
  •   Mureinik    6 年前

    Varags只是一种在数组上加糖的语法-即,使用 int... 参数与 int[] . 与所有数组一样,数组位于堆中,并在堆栈中向下传递对它的引用。

        2
  •  2
  •   Soner from The Ottoman Empire    6 年前

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

    如果引用本身是 类或对象,如果它是 方法。如果原始类型是 类或对象的成员。- Source