Java省略号是否会在幕后导致数组的内存分配?

时间:2012-01-25 11:02:27

标签: java

我正在编写一款Android游戏,我确保没有内存分配。一切都在汇集。

在我的一个辅助函数中,我想使用省略号。 Java省略号是否会在幕后导致数组的内存分配?

2 个答案:

答案 0 :(得分:4)

这取决于来电者。如果调用者提供单个值,则编译器会更改该调用代码以在后台创建数组。如果他们直接提供数组,则不需要新的数组。

例如:

public void foo(String... names) {
}

public void bar1() {
    // Does allocate array on each call
    foo("x", "y", "z");
}

private static final String[] EXISTING_ARRAY = new String[10];

public void bar2() {
    // No allocation
    foo(EXISTING_ARRAY);
}

因此,如果您希望每个数组创建在调用代码中都非常明显,那么使用varargs将是个坏主意。

答案 1 :(得分:2)

  

Java省略号是否导致幕后数组的内存分配?

是的,除非您将正确类型的数组作为最后一个参数传递; e.g。

public void helper(int ... args) {
    // ...
}

int[] intArray = ...
helper(intArray);  // no allocation performed here

helper(1, 2, 3);   // allocation performed here

(但是如果你总是要传递一个显式数组来避免分配,那么使用可变arity语法声明该方法几乎没有意义。)

JLS(8.4.1)说:

  

“如果最后一个形式参数是类型为T的变量arity参数,则认为它定义了类型为T []的形式参数。...所有实际的参数表达式都不对应于前面的形式参数变量arity参数将被评估为,结果将存储到数组中,并将传递给方法调用。“

(强调补充)