首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java省略号是否会在幕后导致数组的内存分配?

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

Stack Overflow用户
提问于 2012-01-25 19:02:27
回答 2查看 431关注 0票数 0

我正在写一个Android游戏,其中我确保没有内存分配。一切都是池化的。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-25 19:04:47

这取决于调用者。如果调用方提供单个值,编译器将更改调用代码以在幕后创建数组。如果他们直接提供数组,就不需要新的数组了。

例如:

代码语言:javascript
复制
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将不是一个好主意。

票数 4
EN

Stack Overflow用户

发布于 2012-01-25 19:04:17

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

可以,除非您将正确类型的数组作为最后一个参数进行传递。

代码语言:javascript
复制
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[]类型的形参。...所有与形参前面的形参不对应的实际实参表达式将被计算为,并将结果存储到将传递给方法调用的数组中。”

(已添加强调)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9001607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档