Java 静态方法-何时以void形式返回数组参数并以数组形式返回?

Java 静态方法-何时以void形式返回数组参数并以数组形式返回?,java,Java,我一直在阅读关于静态方法和通过引用调用传递数组的这一部分。所以我的问题是:什么时候是将数组参数作为数组而不是void返回的好时机 提前谢谢 好吧,最终。。。按值传递数组很慢。它必须获取一块内存并复制阵列。如果数组的大小只有几个字节,那也没什么大不了的。但是如果它是一个大内存块,那么这将是一个缓慢的IO操作。特别是如果这是在一个紧密的循环中发生的,它将损害性能 通过引用传递将允许您提前创建缓冲区并重用它 我一直在阅读这一节关于静态方法通过引用调用传递数组的内容 如果这是一篇Java文章、站点、博客

我一直在阅读关于静态方法和通过引用调用传递数组的这一部分。所以我的问题是:什么时候是将数组参数作为数组而不是void返回的好时机


提前谢谢

好吧,最终。。。按值传递数组很慢。它必须获取一块内存并复制阵列。如果数组的大小只有几个字节,那也没什么大不了的。但是如果它是一个大内存块,那么这将是一个缓慢的IO操作。特别是如果这是在一个紧密的循环中发生的,它将损害性能

通过引用传递将允许您提前创建缓冲区并重用它

我一直在阅读这一节关于静态方法通过引用调用传递数组的内容

如果这是一篇Java文章、站点、博客、书籍等等,您可能会找到更好的。Java对任何参数都不使用“引用调用”。说这句话的人要么不懂Java,要么不明白“通过引用调用”是什么意思

Java按值传递所有参数。句号

令人困惑的是,有些人不理解Java中的对象和数组总是引用。因此,当您将数组(例如)作为参数传递时,就是按值传递对数组的引用。然而,这并不是吹毛求疵。按值传递引用在语义上与真正的“按值调用”非常不同

关于实际报价:

“所有这些示例都强调了一个基本事实,即Java中传递数组的机制是关于数组内容的引用调用机制”(Sedgewick)

考虑到“关于数组内容”的限定条件,我理解他所说的。但称之为“参考电话”是一种误导。(很明显,你在某种程度上被它误导了!)

我还认为这在技术上是错误的。术语“按值调用”、“按引用调用”、“按名称调用”(等等)是关于参数传递/返回的。在本例中,参数是整个数组,而不是数组的内容。在这个层次上,语义显然不是通过引用调用的。(将新数组引用指定给方法中的参数名称不会更新调用方中的数组变量。)该行为与数组内容的逐引用调用无法区分这一事实并不意味着它是逐引用调用的


现在谈谈你问题的实质

什么时候是将数组参数作为数组而不是void返回的好时机

你的意思并不完全清楚,但我认为你在谈论这两种选择:

    public void method(String arg, String[] result) ...

    public String[] method(String arg) ...
我认为第二种形式通常更可取,因为它更容易理解和使用。此外,第二种形式允许方法选择结果数组的大小。(对于第一种形式,如果数组太小或太大,则无法返回对重新分配数组的引用。)

应使用第一种形式的唯一情况是:

  • 当方法的功能要求取决于更新现有阵列时,或
  • 当需要最大限度地减少分配的对象数量时;e、 g.尽量减少GC暂停

如果数组已在其他数据结构中引用,则可能出现第一种情况,并且查找/更新这些引用将很困难。如果数组很大,也可能会出现这种情况,而制作副本的成本将主导该方法所做实际工作的成本。

在java中传递到方法中的所有参数都是引用,而不是原语类型,因此无论在方法内部还是外部,它都只在内存中保留一个对象存储,静态方法在这里甚至不作为任何特例处理。在返回此数组或void类型的情况下,它不会产生任何差异


如果您返回此数组,则返回的值正是您刚才传递给此方法的值。

当您需要修改数组但希望保留参数arrayStatic方法时,此方法并不特殊。所有对象都是通过“引用”传递的。在Java中,不能将参数或结果传递为
void
。没有
void
数据类型。可能包含您的答案您的第一条评论就是我所需要的。谢谢:)@SLaks:FALSE。如果函数的输出是数组,它将如何通过引用传递数组?您没有将原始数组指针传递给它。它必须在函数中创建数组,然后传递该数组。此外,当它传递一个
值类型
时,它会传递一个值。例如,
int
float
@Slaks-我想你弄错了。Java总是按值传递。这可能是我的错,因为我对使用编程术语进行通信非常缺乏经验。这是我读到的。“所有这些示例都强调了一个基本事实,即Java中传递数组的机制是一种关于数组内容的引用调用机制”(Sedgewick)。我的意思是“我一直在阅读这一节关于静态方法和通过引用调用传递数组的内容。”