当前位置: 首页 > 面试题库 >

Java可变长度参数与数组,只是语法糖?

空翼
2023-03-14
问题内容

我正在参加本地社区大学的数据结构和算法课程,很有趣。该课程的教科书是Y. Daniel Liang的 Java编程简介,第10版 。这本书本身很扎实。

在处理中Java.util.Arrays,Liang提到了Java的“可变长度”参数。他写道(第265页):

Java将可变长度参数视为数组。您可以将数组或可变数量的参数传递给可变长度参数。当调用带有可变数量参数的方法时,Java创建一个数组并将参数传递给它。

一个例子是:

public static void (int... toes) {
    //... some code
}

但是,Liang从未解释可变长度参数的起源或优势。如Liang所说,如果将可变长度参数“转换”为数组,那么它们的优点是什么?可变长度参数是否促进了软件设计模式或工程目标?

换句话说,上面的代码片段提供了以下内容所没有提供的功能:

public static void (int[] toes) { // ...

问题答案:

在Java中,varargs是在调用方法时用于创建数组的语法糖。例如,这两个调用是等效的:

void foo(String... args) { ... }

foo("hello", null, "world", xyz);  // Java 1.5+
foo(new String[]{"hello", null, "world", xyz});  // All versions of Java

Varargs并没有使任何新事物成为可能(通过语法糖的定义),但是它减少了冗长性,并使某些构造更易于实现。例如,一些我最喜欢的可变参数的用途包括:PrintStream.printf()String.format()Method.invoke()

varargs的其他良好应用:

// This one is in the Java standard library
Collections: void addAll(Collection<? super T> c, T... elements);

// Custom examples
int max(int... nums);
void doOperation(File x, String y, SomeEnum options...);

此外,Java的varargs使语言与C,Python,JavaScript和其他语言中的vararg支持达到同等地位。因此,如果经常使用的设计(例如max())与varargs一起使用效果最好,则Java不再是需要较丑陋的实现的奇怪语言。



 类似资料:
  • 问题内容: 据我了解,一个由固定数量的元素组成,一个与您传递(相同类型)的参数数量一样多。但是他们是一样的吗?我可以通过一个期望的地方吗? 问题答案: 是的,如果您有一个带有varargs参数的方法,例如: 您这样称呼它: 然后编译器将其转换为: 参数的类型为,可以像其他数组变量一样使用。请注意,它 可能 仍然是: 有关更多信息,请参见varargs的文档。 但这 并不 意味着可变参数与阵列互换-

  • 问题内容: 我如何遍历可变长度的Java数组。 我想我会设置一个while循环,但是如何检测到数组末尾。 我想我想要这样的东西[只需要弄清楚如何表示myArray.notEndofArray()] 问题答案: 要么 第二个版本是“ for-each”循环,它适用于数组和Collections。大多数循环可以使用for- each循环完成,因为您可能并不在乎实际的索引。如果您确实关心实际索引,请使用

  • 问题内容: 我想知道如何初始化整数数组,使其大小和值在程序执行过程中发生变化,有什么建议吗? 问题答案: 是的:使用ArrayList。 在Java中,“普通”数组是固定大小的。您必须给它们一个尺寸,并且不能扩展或收缩它们。要更改大小,您必须创建一个新数组并复制所需的数据-这效率低下,给您带来痛苦。 幸运的是,有许多内置类可以实现通用的数据结构以及其他有用的工具。您需要检查Java 6 API的完

  • 问题内容: Core Audio具有C API,可将一些数据复制到您提供的内存中。在一种情况下,我需要传递一个指向AudioBufferList的指针,该指针定义为: UInt32标识缓冲区的数量,并且实际缓冲区紧随其后。 我可以成功获得此: 我无法识别(AudioBuffer)语法,但我认为它并不重要- 我认为括号会被忽略,mBuffers只是一个AudioBuffer,由我自己完成指针数学运算

  • 问题内容: 在处理可变长度参数时,我之前没有看到过什么特别的东西 例如,有一个名为prepared statement的方法,带有声明,使得 1。 2. 另一个方法声明 为什么Java不允许使用多个可变长度参数?还有其他方法可以做到吗? PS:这样做的原因是我的要求是为传递的参数生成通用的准备好的语句,因为所有此参数都将通过属性传递 问题答案: 仅允许最后一个参数为可变长度: String …等于

  • 问题内容: 我正在努力查看将值传递给函数时使用哪种方法是否有明显的优势。下面的代码可能不是解释我要做出的决定的最佳示例,但我认为这是最容易理解的示例。 可变参数方法 数组参数法 两种技术中的哪一种是首选?如果是这样,为什么(速度,可靠性或只是易于阅读)?谢谢。 问题答案: 我认为没有速度差异。因为,在功能内部,您可以像一样使用。 我认为如果参数数量较少(例如小于5个),则因为易于阅读,可能是一个更