为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

牧羊人nacy 2023-07-19 15:45:24
考虑下面的类: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[]?
查看完整描述

2 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

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


   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]


查看完整回答
反对 回复 2023-07-19
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

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



查看完整回答
反对 回复 2023-07-19
  • 2 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信