我正在编写一款Android游戏,我确保没有内存分配。一切都在汇集。
在我的一个辅助函数中,我想使用省略号。 Java省略号是否会在幕后导致数组的内存分配?
答案 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参数将被评估为,结果将存储到数组中,并将传递给方法调用。“
(强调补充)