我对java中的引用和垃圾收集器有疑问。
当使用参数调用方法时,假设一个数组,它会被发送一个被认为是参数的数组引用的副本。
假设:在调用方法之后,或者在方法内部对所考虑的数组执行操作时,就会触发垃圾收集器。
现在对于调用方法和被调用方法中的数组是相同的引用,无论垃圾收集器执行的操作和移动(垃圾收集器可以将引用从eden移动到幸存者1)?
问题的一个更简单的表达式:您是否可以依赖此参考副本,以便将其用作“通过引用”发送的参数的机制?
非常感谢! Roxana的
答案 0 :(得分:2)
如果您正在尝试询问是否可以假装通过引用伪装:
// We'd like to pass x by reference...
String x = "hello";
String[] array = { x };
foo(array);
x = array[0];
...
static void foo(String[] array)
{
array[0] = array[0] + "foo";
}
...然后是的,这将始终有效,并且不受垃圾收集的影响。
我个人试图避免它,但是,它会起作用:)
请注意,与真正的pass-by-reference不同,如果方法抛出异常,那么方法调用之后的赋值将不会发生,因此您将失去“更改”。
答案 1 :(得分:0)
垃圾收集器删除任何引用无法访问的对象。在您的示例中,至少有2个引用可用于访问对象。因此,它不会被删除,您可以使用引用来访问它。
答案 2 :(得分:0)
一些垃圾收集器通过查找无引用的对象并回收它们占用的空间来工作。
其他人通过查找带有引用的所有对象并将它们移动到新的对象空间来工作。移动所有对象后,将回收旧对象空间。在这种情况下,所有参考都会更新。