JAVA返回对象或通过引用传递

时间:2013-11-21 10:38:36

标签: java methods return-value argument-passing

这是一个初学者的问题。

在将对象作为参数传递给方法或从该方法返回该对象之间,JAVA是否存在任何差异。例如:将List作为参数传递并将其填入方法或仅允许方法返回列表是否更好?

我的猜测是,它应该没有区别,因为返回引用并且没有任何内容被复制。但是还有更微妙的东西吗?

提前致谢

Altober

5 个答案:

答案 0 :(得分:5)

许多评论似乎误解了你的意思。

我相信你问的是

之间的区别
public void myMethod(List list) {
    list.add(new Object());
}

public List myMethod() {
    List list = new ArrayList();
    list.add(new Object());
    return list;
}

如果我错了,请纠正我。

没有规则说哪一个是对的。这一切都取决于您希望如何设计您的程序。后一种方法不允许您使用现有列表,因此可能会考虑性能问题。

您还可以在从方法返回值时执行方法链接,因此有时您可以同时接受参数并返回值。与此不同的是,如果将现有List作为参数传递,则将使用现有List,但如果参数为null,则创建新List。然而,这可能会使来电者感到困惑。

答案 1 :(得分:4)

首先,Java中没有“通过引用传递”:语言按值传递引用(它不是不是)。

您的问题的答案是“它取决于”:将对象作为参数传递给方法允许您在多个调用中重用相同的对象,而返回对象则强制该方法向其提供新对象或现有对象呼叫者。

请考虑以下示例:您正在从多个方法收集数据,并且需要将所有数据放在一个列表中。您可以使用返回列表及其数据的方法

interface DataSource {
    void supplyData(List<Data> list);
}

或者您可以将这些方法传递给列表,并让他们将数据添加到同一列表中:

interface DataSource {
    List<Data> supplyData(); 
}

在第一种情况下,您可以循环遍历多个数据源,并将它们传递给相同的列表:

List<Data> bigList = new ArrayList<Data>();
foreach (DataSource s : mySources) {
    s.supplyData(bigList);
}

在第二种情况下,您需要从supplyData的调用中获取单个列表,并将其内容放在您保存在循环中的大列表中:

List<Data> bigList = new ArrayList<Data>();
foreach (DataSource s : mySources) {
    List<Data> tmp = s.supplyData();
    bigList.addAll(tmp);
}

在第二种情况下,每次调用都会创建一个临时列表tmp,在将其内容添加到大列表后会被丢弃。

请注意,传递现有列表不一定是更好的解决方案 - 实际上,有些情况下应该避免这种情况。

例如,当您处理外部提供的插件时,您应该更喜欢第二种策略。否则,DataSource接口的恶意实现将能够以您的程序不期望的方式操纵公共列表,例如将其项目添加到其他所有人之前,删除来自其他来源的项目,检查来自其他来源,等等。

答案 2 :(得分:2)

除了来自dasblinkenlight的答案,这是正确的(取决于),从方法返回列表也比将列表作为参数传递更有优势。

通过将列表作为参数传递,调用者有责任选择适当的List实现,将其初始化为适当的大小,并传递与被调用方法的算法兼容的列表。通常,来电者没有做出好选择所必需的知识。

如果被调用的方法返回一个列表,它可以:

  • 如果不需要返回任何内容,则返回Collections.emptyList()
  • 返回一个尺寸合适的ArrayList
  • 返回子列表或不可修改的视图或已在内存中已有的列表的转换视图,而不是复制
  • 对其创建的列表执行任何操作,而不必担心作为参数传递的列表是不可修改的,或者是固定大小的,或者已经包含元素。

答案 3 :(得分:1)

没有区别,两者都是对列表对象的引用。 我个人更喜欢结果是通过返回给出并留下参数。但这可能会迫使您创建一个新列表,这可能会花费您(性能,内存)。

返回允许链接。

答案 4 :(得分:1)

您可能已经意识到,Java中的所有内容都是按值传递的。

在将对象作为参数传递给方法或从方法返回该对象之间JAVA有什么不同吗? 没有真正的区别,因为它是两种情况下传递的参考。

将List作为参数传递并将其填入方法或仅允许方法返回列表是否更好? 我猜你的要求取决于你的要求。该方法是否需要列表作为输入,还是可以完全自己构造它?

我的猜测是,它应该没有区别,因为返回引用而没有复制任何内容? 严格来说,这不是真的,因为返回了的副本。