我有一个问题。关于以下代码有什么问题:
ArrayList tempList2 = new ArrayList();
tempList2 = getXYZ(tempList1, tempList2);
//method getXYZ
getXYZ(ArrayList tempList1, ArrayList tempList2) {
//does some logic and adds objects into tempList2
return tempList2;
}
代码将被执行但似乎通过将tempList2传递给getXYZ方法参数,它正在进行对象回收。
我的问题是,回收tempList2 arraylist对象是否正确?
答案 0 :(得分:3)
这里真的没有“对象回收”这样的概念。没有什么是垃圾收集,如果这是你感兴趣的......至少,如果没有这样的行,那就不是:
tempList2 = new ArrayList();
在getXYZ()
内。
将ArrayList
的引用传递给方法,然后返回。就这样。它只是一个参考 - 它不是对象本身。
现在你可以说这个方法返回传递给它的ArrayList
引用有点奇怪...通常用于流畅的接口,但这里似乎不是这样。< / p>
答案 1 :(得分:3)
我的问题是,回收tempList2 arraylist对象是否正确?
我不太清楚“回收”是什么意思。这似乎不是应用程序正在回收对象以避免分配新对象的情况。 (这是Java中“回收”的正常含义。)
如果使用相同的getXYZ
对象多次调用tempList2
,那么这只是将内容聚合到单个列表中的一种方式。 getXYZ
返回ArrayList
的事实使得可能会更改方法实现以返回不同的ArrayList
实例。这不是问题本身,但可能是调用者没有适当地分配调用结果。
如果getXYZ
仅针对任何给定的tempList2
对象调用一次,那么这看起来有点奇怪。
总之,这段代码看起来有点可疑,如果有人更改了getXYZ
的实现,则代码很脆弱。然而,这并非正确的错误,并且可能有一些很好的理由(或历史原因)以这种方式做事,这在您提交问题的小块代码中并不明显。
编辑 - 回应此评论(内联使其可读)
实际上,上面代码的原因是,我想避免创建两个arraylist对象。例如:传统的方法是
ArrayList tempList2 = new ArrayList();
tempList2 = getXYZ(tempList1);
//method getXYZ
getXYZ(ArrayList tempList1) {
ArrayList tempList = new ArrayList();
//INSTANTIATED ONLY ONCE
//does some logic and adds objects into tempList
return tempList;
}
真正的传统方式是:
ArrayList tempList2 = getXYZ(tempList1);
或
ArrayList tempList2;
// some intermediate lines
tempList2 = getXYZ(tempList1);
这些都不需要为您的方法创建不必要的ArrayList
实例,也不需要将2 ArrayList
个实例传递到getXYZ
方法。
答案 2 :(得分:0)
您传递的是tempList2
引用的值。对象本身不会被复制。因此,当传入的tempList2
被修改时,调用者会看到更改。这也称为call-by-sharing
一旦你理解了正在发生的事情,那就没有错。