为什么拳击比var-args更受欢迎?

时间:2014-10-26 19:10:55

标签: java

我从JLS知道扩大比拳击更受欢迎,拳击比var-args更受欢迎。

我理解,扩展是传统方法,设计师倾向于将其作为优先事项。我无法理解的是为什么拳击比var-args更受欢迎。以下是我的两个问题。

  1. 为什么拳击比var-args更受欢迎?
  2. 如何解释幕后拳击和var-args?
  3. 有人可以用一个例子来解释吗?

    据我所知,Var-args基本上构建了一个Arraytype来保存所提供的参数。我知道数组是一个对象。我想表明我对这个例子的困惑

    // 1 Object is made which is basically a wrapper
    public void boxing(Integer i); 
    // 1 object made which is an Array
    public void boxing(int.. x) 
    

    在这两种情况下,都会制作一个对象。那么前者的路径比后者更快?

    谢谢,

1 个答案:

答案 0 :(得分:2)

实际上,var-args框和un-box成为类型的数组,所以我认为它们是免费的,而非独家的选择。

现在,出于性能原因,您可能会在很多情况下选择一个,因为不必要地创建对象是您不需要支付的费用。这就是为什么var-arg方法有多次出现零arg,one-arg,two-arg和three-arg堂兄弟的原因。各种等效调用在var-arg版本之前绑定,为var-arg调用的(希望是常见的)低arg计数版本提供了更快的路径。

人们可能在使用var-args而不是拳击是他们倾向于变成泛型类型列表的地方,比如(Object ...参数)over(Int x,Float precision,Boolean visible),但是&# 39;在我看来,这只是不好的做法。

---编辑答案以回应问题编辑---

所以这两个场景是

// 1 Object is made which is basically a wrapper
public void boxing(Integer i);

// 1 object made which is an Array
public void boxing(int.. x) 

唯一可以替换这些内容的调用方案是one-arg调用方案。第一个装箱方法不支持零和两个参数,因此如果我们讨论的是两个相同的拳击方法,它们就不能被视为有效的参数列表。

从功能上来说,后者在调用

时是不正确的
boxing(5, 4);

而且表现明智,当它被称为

时也是一个打击
boxing(null);

由于第一个根本不需要任何装箱,而第二个需要将空转换为零元素数组,因此在尝试取消时不会出现空指针异常在函数中框出数组。

所以,如果你有一个可选的单个原语参数,使用boxing而不是var-args,因为varargs在概念上是错误的(通过允许额外的参数),并且在没有值的情况下,性能命中(到创建一个零长度数组。)

注意:要使null参数调用在许多情况下起作用,您需要强制转换。

boxing((Integer)null);

我只能想象如果你尝试过这会产生什么样的拳击神龛

boxing((int)null);