java是通过方法推送对象时生成的对象的副本?
假设我的对象状态中有一个private static Integer i = 0
。然后,假设我通过某种方法将其推进,该方法将i
作为参数,如下所示:pushThroughMethod(i)
i
是否被复制到堆上并有资格进行垃圾收集
你可以在下面搜索框中键入要查询的问题!
假设我的对象状态中有一个private static Integer i = 0
。然后,假设我通过某种方法将其推进,该方法将i
作为参数,如下所示:pushThroughMethod(i)
i
是否被复制到堆上并有资格进行垃圾收集
# 1 楼答案
您已经声明了一个引用类型为
java.lang.Integer
的变量。无论你分配给它什么,它都是对那种类型的对象的引用很明显,不管有什么方法调用,堆上都有一个对象
相反,如果您有一个
int
变量,并将其传递给一个采用Integer
参数的方法,那么您可以正确地说Integer
实例将因为该方法调用而被卷入该调用是否生成了
Integer
的新实例是JVM的一个内部细节,至少要考虑以下问题(对热点7有效):Integer
实例李>int
值。所有这些都取决于JIT编译器执行的优化深度李>最后,请注意in a related question,据测量
new Integer(1)
实际生成的代码比Integer.valueOf(1)
快(问题是关于Character
,但在其他方面情况完全相同)# 2 楼答案
Java基本类型(int、long、float等)而不是它们的对象对应类型(Integer、long、float等)是按值传递的。此外,对对象的引用是通过值传递的。不过,对象本身是通过引用传递的
因此,如果用对象O调用方法x(),那么:
X内:
在您的示例中,当您调用
pushThroughMethod(i)
时,会创建一个对i
的新引用,但它指向相同的Integer
i
只有在所有对它的强引用都消失后才有资格进行垃圾收集。在这种情况下,即使pushThroughMethod()删除它对i
的引用,静态引用仍将保留并阻止收集