【问题标题】:What's difference between java vararg array param and normal array param? [duplicate]java vararg 数组参数和普通数组参数有什么区别? [复制]
【发布时间】:2019-01-07 01:49:06
【问题描述】:

有两种函数声明:

void f(String ... s) {
    System.out.println(s.length);
}
void g(String [] s){
    System.out.println(s.length);
}

两者都可以,我猜“f()”只是g()的一种语法糖?

使用 f() 时,java 编译器仍然会创建一个 s 的内部数组,对还是错? ---- 我检查了 Intellij 中的类文件,似乎 f() 的反汇编代码仍然是 String...不是 String[]

您能帮忙澄清一下吗?非常感谢。

【问题讨论】:

标签: java arrays parameters variadic-functions


【解决方案1】:

问:java vararg 数组参数和普通数组参数有什么区别?

https://docs.oracle.com/javase/8/docs/technotes/guides/language/varargs.html

最后一个参数类型后面的三个句点表示最后一个参数可以作为数组或作为参数序列传递。 Varargs 只能用于最后的参数位置。

问:两者都可以,我猜“f()”只是g()的一种语法糖?

是的。

在一个数组中必须传递多个参数仍然是正确的, 但是可变参数功能会自动执行并隐藏该过程。

Q:当使用f()时,java编译器还是会创建一个s的内部数组,对还是错? ---- 我检查了 Intellij 中的类文件,似乎 f() 的反汇编代码仍然是 String...不是 String[]

它是数组句柄,见How does JVM implement the varargs?

另外我完全支持参考文献的最后陈述:

那么什么时候应该使用可变参数呢?作为客户,您应该利用 每当 API 提供它们时。核心 API 的重要用途 包括反射、消息格式化和新的 printf 工具。 作为 API 设计人员,您应该谨慎使用它们,仅当 好处确实令人信服。一般来说,您不应该 重载 varargs 方法,否则程序员很难 找出调用了哪个重载。

【讨论】:

    猜你喜欢
    • 2020-05-25
    • 2015-02-07
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2013-11-25
    • 2010-09-14
    • 1970-01-01
    相关资源
    最近更新 更多