Java方法中byte[]和byte之间的区别是什么?

4

有人问我两种方法参数之间的区别以及为什么会使用其中一种而不是专门分配的数组。

putMessage(byte ...send)

putMessage(byte[] send)

我无法自信地回答他们,并且无法记住...的名称。


谢谢大家,所有的回答都很好,可惜我不能把已回答的标志分开。 - JPM
5个回答

6
在你的第一个例子中,...被称为可变参数。你的第二个例子有一个数组参数。Varargs是一种便利方式,当你想在一个方法中硬编码变量数量的参数,但不想手动创建一个数组来保存它们时使用。这是一种简写符号。考虑这个例子:
putMessage(0b00100101, 0b00100101, 0b00100101); // varargs

与这个相比:

putMessage(new byte[] { 0b00100101, 0b00100101, 0b00100101 }); // array

第一个例子更简洁易读。

2
带有省略号的参数通常被称为“可变参数”,如果您想要搜索相关信息,可以在谷歌上搜索这个词汇。
使用可变参数允许您调用一个带有可变数量参数的方法,而无需指定数组。
public void printStr(String ...strings) {
    for (String s : strings) {
        System.out.println(s);
    }
}

> printStr("Hello", "World")
Hello
World

因此,可变参数提供了一定的便利,但也存在缺点 - 可变参数必须是方法签名中的最后一个参数,因此您不能在一个方法中拥有多个可变参数。如果您想将多个数组传递给一个方法,您必须使用数组,而不是可变参数。
另一个您可能会在某些期望使用可变参数的地方看到数组的原因是,可变参数仅在Java 5中引入 - 较旧的代码和需要向后兼容的代码仍将使用数组,即使在概念上使用可变参数可能更合理。
在方法签名中使用可变参数的优点在于灵活性 - 在某些情况下,调用方已经准备好了一个数组,而在某些情况下,他们只有几个参数。可变参数将接受数组或每个变量作为单独的参数,从而节省了调用方实例化和填充数组的麻烦。

1

省略号(三个点)表示您正在使用“可变参数”。

有关更多详细信息,请参见http://download.oracle.com/javase/1,5.0/docs/guide/language/varargs.html

在方法内部,您可以将“send”的元素作为数组访问。就这方面而言,这两种方法是相同的。方便之处在于调用者。在第二个putMessage中,调用者被迫创建一个字节数组以传递给putMessage。在第一个putMessage中,调用者可以简单地说“putMessage(byte1, byte2)”或“putMessage(byte1, byte2, byte3)”或“putMessage(byte1)”-- 可变数量的参数,或可变参数。


1

第一个是使用Varargs

简而言之

A. 第一个可以用于调用单个字节类型参数、2个字节参数...或多个参数或数组。

B. 第二个只能与数组一起使用。


我想知道如果你传递一个数组,内存使用情况的差异是什么? - JPM

0

省略号(...)允许您在调用函数时内联 N 个类型的参数,而无需先定义数组。最终,您只是得到一个参数数组,但它基本上是一种简写或语法糖。此外,使用省略号语法,您的客户端代码可能会更加清晰和声明式......尽管它很容易变得混乱和难以阅读。

这里有一个很好的例子省略号语法(可变长度参数列表)。在查看示例时,请考虑如果使用数组而不是可变长度参数列表,主函数中的客户端代码将会是什么样子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接