有两种函数声明:
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 []
您能帮忙澄清一下吗?非常感谢。
答案 0 :(得分:1)
问:java vararg数组参数和普通数组参数有什么区别?
请参见https://docs.oracle.com/javase/8/docs/technotes/guides/language/varargs.html
最终参数类型后面的三个句点表示最终参数可以作为数组或作为参数序列传递。可变参数只能在最后一个参数位置使用。
问:都可以,我猜“ f()”只是g()语法糖的一种形式?
是的
仍然必须在数组中传递多个参数, 但是varargs功能可以自动执行并隐藏该过程。
问:使用f()时,java编译器仍会创建s的内部数组,对还是错? ----我检查了Intellij中的类文件,似乎f()的反汇编代码仍然是String ...而不是String []
它作为数组处理,请参见How does JVM implement the varargs?
我也完全支持引用的最终声明:
那么什么时候应该使用varargs?作为客户,您应该利用 只要API提供它们,它们中的任何一个。核心API的重要用途 包括反射,消息格式和新的printf工具。 作为API设计人员,您仅应在以下情况下谨慎使用它们: 好处确实令人信服。一般来说,您不应该 重载varargs方法,否则程序员将很难 找出要调用的重载。