Java 关于物品回收

Java 关于物品回收,java,Java,我有个问题。以下代码有什么问题: 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; } 代码将被执行,

我有个问题。以下代码有什么问题:

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对象是否正确?

您正在传递
tempList2
引用的值。对象本身没有被复制。因此,当传入的
tempList2
被修改时,调用者会看到更改。这也叫


因此,一旦您了解了发生了什么,就没有什么问题。

您正在传递
tempList2
引用的值。对象本身没有被复制。因此,当传入的
tempList2
被修改时,调用者会看到更改。这也叫


所以,一旦你明白了发生了什么,就没有什么错。

这里真的没有“物体回收”这样的概念。没有垃圾被收集,如果你感兴趣的话。。。至少,如果没有这样的行,就不会:

tempList2 = new ArrayList();
getXYZ()

ArrayList
的引用被传递到方法中,然后返回。这就是全部。它只是一个引用-它不是对象本身


现在您可以说,该方法返回传递给它的
ArrayList
引用有点奇怪。。。这通常用于流畅的接口,但这里似乎不是这样。

这里真的没有“对象回收”这样的概念。没有垃圾被收集,如果你感兴趣的话。。。至少,如果没有这样的行,就不会:

tempList2 = new ArrayList();
getXYZ()

ArrayList
的引用被传递到方法中,然后返回。这就是全部。它只是一个引用-它不是对象本身

现在您可以说,该方法返回传递给它的
ArrayList
引用有点奇怪。。。通常这用于流畅的接口,但这里的情况似乎不是这样

我的问题是,回收Templist2ArrayList对象是否正确

我不太明白你说的“回收”是什么意思。这似乎不是应用程序为了避免分配新对象而循环使用对象的情况。(这是Java中“回收”的正常含义。)

如果使用相同的
tempList2
对象多次调用
getXYZ
,那么这只是将内容聚合到单个列表中的一种方法。
getXYZ
返回一个
ArrayList
的事实使得方法实现可能被更改为返回一个不同的
ArrayList
实例。这本身不是问题,但如果调用方没有适当地分配调用结果,则可能是问题

如果对任何给定的
tempList2
对象只调用一次
getXYZ
,那么这看起来有点奇怪

总之,这段代码看起来有点可疑,如果有人更改了
getXYZ
的实现,这段代码就很脆弱。然而,这并不是完全错误的,并且可能有一些很好的理由(或历史原因)以这种方式做事情,而这些理由在问题中包含的小块代码中并不明显

编辑-回应此评论(内联以使其可读)


实际上,上面代码的原因是,我想避免创建两个arraylist对象。例如:传统的方法是


这样做的真正传统方式是:

ArrayList tempList2 = getXYZ(tempList1);

这两种方法都不需要创建方法中不必要的
ArrayList
实例,也不需要将2个
ArrayList
实例传递到
getXYZ
方法中

我的问题是,回收Templist2ArrayList对象是否正确

我不太明白你说的“回收”是什么意思。这似乎不是应用程序为了避免分配新对象而循环使用对象的情况。(这是Java中“回收”的正常含义。)

如果使用相同的
tempList2
对象多次调用
getXYZ
,那么这只是将内容聚合到单个列表中的一种方法。
getXYZ
返回一个
ArrayList
的事实使得方法实现可能被更改为返回一个不同的
ArrayList
实例。这本身不是问题,但如果调用方没有适当地分配调用结果,则可能是问题

如果对任何给定的
tempList2
对象只调用一次
getXYZ
,那么这看起来有点奇怪

总之,这段代码看起来有点可疑,如果有人更改了
getXYZ
的实现,这段代码就很脆弱。然而,这并不是完全错误的,并且可能有一些很好的理由(或历史原因)以这种方式做事情,而这些理由在问题中包含的小块代码中并不明显

编辑-回应此评论(内联以使其可读)


实际上,上面代码的原因是,我想避免创建两个arraylist对象。例如:传统的方法是


这样做的真正传统方式是:

ArrayList tempList2 = getXYZ(tempList1);


这两种方法都不需要创建不必要的
ArrayList
实例,也不需要将2个
ArrayList
实例传递到
getXYZ
方法中。

我想补充一点,Java代码中通常不赞成这种行为,这基本上是依靠副作用来实现的。这并不意味着这是错误的,但我还是会避免做类似的事情。这要看情况而定。我会在公共API中避免这种行为,但在内部它可能很方便。我想补充一点,这种行为在Java代码中通常是不受欢迎的,这基本上是依赖于一方