java - 使用可变参数时是否创建了新数组?
问题描述
考虑以下类:
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[]
?
解决方案
我会说不,因为以下原因。使用原始数组。没有创建一个新的。
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]
推荐阅读
- swift - 如何设置文本字段大小修复macos swift
- c - 如何从用户那里获取输入整数,直到他使用 eof 按下回车键?
- c# - 当他们触摸按钮统一时,我如何让我的平台移动 90 度
- bazel - 我可以根据不同的 cc_binary 在 cc_library 中设置不同的宏值吗?
- dart - 颤动简单权限android版本比较和iOS path_provider错误
- java - 迭代列表对象中的日期变量并根据位置选择日期范围
- matlab - 如何在 MATLAB 中打印小圆圈?
- javascript - Chartjs 重叠区域的不同填充颜色
- ubuntu - 来自 Ubuntu 上 ubuntu 终端的 cmake-gui 显示:QXcbConnection:无法连接到显示已中止(核心转储)
- javascript - 如何在按钮文本中附加下拉项文本