使用可变参数时是否创建了一个新数组?
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 的示例还表明,在这种情况下它保持相同的数组,因为可变参数函数中所做的更改在执行后仍然可见。
考虑以下 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 的示例还表明,在这种情况下它保持相同的数组,因为可变参数函数中所做的更改在执行后仍然可见。