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