这是一个初学者的问题。
在将对象作为参数传递给方法或从该方法返回该对象之间,JAVA是否存在任何差异。例如:将List作为参数传递并将其填入方法或仅允许方法返回列表是否更好?
我的猜测是,它应该没有区别,因为返回引用并且没有任何内容被复制。但是还有更微妙的东西吗?
提前致谢
Altober
答案 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实现,将其初始化为适当的大小,并传递与被调用方法的算法兼容的列表。通常,来电者没有做出好选择所必需的知识。
如果被调用的方法返回一个列表,它可以:
答案 3 :(得分:1)
没有区别,两者都是对列表对象的引用。 我个人更喜欢结果是通过返回给出并留下参数。但这可能会迫使您创建一个新列表,这可能会花费您(性能,内存)。
返回允许链接。
答案 4 :(得分:1)
您可能已经意识到,Java中的所有内容都是按值传递的。
在将对象作为参数传递给方法或从方法返回该对象之间JAVA有什么不同吗? 没有真正的区别,因为它是两种情况下传递的参考。
将List作为参数传递并将其填入方法或仅允许方法返回列表是否更好? 我猜你的要求取决于你的要求。该方法是否需要列表作为输入,还是可以完全自己构造它?
我的猜测是,它应该没有区别,因为返回引用而没有复制任何内容? 严格来说,这不是真的,因为返回了的副本。