使用可变参数时是否创建了一个新数组?

Is a new Array created when varargs is used?

考虑以下 class:

class Collection {

    private Object[] terms;
    public Collection(Object... terms) {
        this.terms = terms;
    }

    // Do something with terms...
}

我正试图通过此 class 保持不变性,并且我想了解更多关于可变参数及其功能的信息。当我使用参数时:

Collection c = new Collection(1, 2, 3, 4);

我假设在上述实例中创建了一个新数组。但是,如果我要执行类似以下代码的操作:

Object[] arr = {1, 2, 3, 4};
Collection c = new Collection(arr);

由于使用可变参数,是否在上述实例中隐式创建了一个新数组,或者该数组是否只是通过引用传递,就像类型参数用于 Object[] 一样?

我会拒绝,原因如下。使用原始数组。没有创建新的。

   public static void main(String[] args) {
      int[] v = { 1, 2, 3, 4
      };
      System.out.println(System.identityHashCode(v));
      test(v);
      System.out.println(Arrays.toString(v));
   }

   public static void test(int... vals) {
      System.out.println(System.identityHashCode(vals));
      vals[2] = 1000;
   }

打印出来

2085857771
2085857771
[1, 2, 1000, 4]


正如我对 JLS 的解释,如果您将一个数组作为参数传递,则不会创建新数组。 WJS 的示例还表明,在这种情况下它保持相同的数组,因为可变参数函数中所做的更改在执行后仍然可见。