我正在写一个Android游戏,其中我确保没有内存分配。一切都是池化的。
在我的一个辅助函数中,我想使用省略号。Java省略号是否会在幕后导致数组的内存分配?
发布于 2012-01-25 19:04:47
这取决于调用者。如果调用方提供单个值,编译器将更改调用代码以在幕后创建数组。如果他们直接提供数组,就不需要新的数组了。
例如:
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将不是一个好主意。
发布于 2012-01-25 19:04:17
省略号是否会在幕后导致数组的内存分配?
可以,除非您将正确类型的数组作为最后一个参数进行传递。
public void helper(int ... args) {
// ...
}
int[] intArray = ...
helper(intArray); // no allocation performed here
helper(1, 2, 3); // allocation performed here(但是如果您总是要传递一个显式数组来避免分配,那么使用可变参数语法声明该方法就没有什么意义了。)
JLS (8.4.1)这样说:
“如果最后一个形参是T类型的可变形参,则认为它定义了一个T[]类型的形参。...所有与形参前面的形参不对应的实际实参表达式将被计算为,并将结果存储到将传递给方法调用的数组中。”
(已添加强调)
https://stackoverflow.com/questions/9001607
复制相似问题