首页 > 解决方案 > 使用可变参数时是否创建了新数组?

问题描述

考虑以下类:

class Collection {

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

    // Do something with terms...
}

我试图保持这个类的不变性,我想了解更多关于可变参数及其功能的信息。当我使用参数时:

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

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

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

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

标签: javaarraysimmutability

解决方案


我会说不,因为以下原因。使用原始数组。没有创建一个新的。

   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]



推荐阅读