使用 varargs 时是否会创建一个新数组?

考虑下面的类:


class Collection {


    private Object[] terms;

    public Collection(Object... terms) {

        this.terms = terms;

    }


    // Do something with terms...

}

我试图用这个类来保持不变性,并且我想更多地了解 varargs 及其功能。当我使用参数时:


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

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


Object[] arr = {1, 2, 3, 4};

Collection c = new Collection(arr);

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


牧羊人nacy
浏览 85回答 2
2回答

手掌心

我会说不,因为以下原因。使用原始数组。不会创建新的。   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;   }打印出来20858577712085857771[1, 2, 1000, 4]

白猪掌柜的

当我解释JLS时,如果您传递一个数组作为参数,则不会创建新数组。WJS 的示例还表明,在这种情况下它保持相同的数组,因为在 vararg 函数中所做的更改在执行后仍然可见。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java