我一直在阅读有关静态方法和通过引用调用传递数组的这一部分。所以我的问题是:什么时候是返回数组参数而不是 void 的好时机?
提前致谢!
我一直在阅读有关通过引用调用传递数组的静态方法的这一部分。
如果这是一篇 Java 文章、网站、博客、书籍等等,您可能应该找到更好的。Java 不对任何参数使用“引用调用”。任何这样说的人要么不了解 Java,要么不了解“引用调用”的含义。
Java 按值传递所有参数。时期。
混淆的一点是有些人不明白Java中的对象和数组总是引用。因此,当您将数组(例如)作为参数传递时,您将通过值传递对数组的引用。但是,这不是挑剔。按值传递引用在语义上与真正的“按值调用”非常不同。
重新引用实际报价:
“所有这些示例都突出了一个基本事实,即在 Java 中传递数组的机制是关于数组内容的引用调用机制”(Sedgewick)。
鉴于“关于数组内容”的资格,我理解他在说什么。但称这种“引用调用”具有误导性。(很明显,你在某种程度上被它误导了!)
我还认为这在技术上是错误的。术语“按值调用”、“按引用调用”、“按名称调用”(等等)是关于参数传递/返回的。在这种情况下,参数是整个数组,而不是数组的内容。在那个级别,语义显然不是引用调用。(在方法中为参数名称分配新的数组引用不会更新调用者中的数组变量。)行为与数组内容的引用调用无法区分这一事实不会使其调用-引用。
现在到你的问题的实质......
什么时候是返回数组参数而不是 void 的好时机?
您的意思并不完全清楚,但我假设您正在谈论这两种选择:
public void method(String arg, String[] result) ...
相对
public String[] method(String arg) ...
我会说第二种形式通常更可取,因为它更容易理解和使用。此外,第二种形式允许该方法选择结果数组的大小。(对于第一种形式,如果数组太小或太大,则无法返回对重新分配的数组的引用。)
应该使用第一种形式的唯一情况是:
如果数组已经在其他数据结构中引用,则可能会出现第一种情况,并且查找/更新这些引用会很困难。如果数组很大,也可能会出现这种情况,并且制作副本的成本将主导该方法完成的实际工作的成本。
在java中传递给方法的所有参数都是引用期望原始类型,因此无论在方法内部还是外部,它都只是将一个对象存储在内存中,静态方法在这里甚至不被视为任何特殊情况。在您返回此数组或 void 类型的情况下,它不会有任何区别。
如果您返回此数组,则返回的值正是您刚刚传递给此方法的值。
好吧,最终...按值传递数组很慢。它必须抓取一块内存并复制数组。如果数组的大小只有几个字节,那没什么大不了的。但是如果它的内存很大,那么这将是一个缓慢的 IO 操作。特别是如果这发生在一个紧密的循环中,它会损害性能。
通过引用传递将允许您提前创建缓冲区并重用它。