我有时会认为,如果oldObject != newObject
那时对象已经改变了 - 在大多数情况下这似乎是一个公平的假设,但它真的是一个错误的假设吗?
简而言之,在什么情况下,以下代码可以打印"相同!"?
static WeakReference<Object> oldO = null;
...
Object o = new Object();
oldO = new WeakReference(o);
// Do some stuff with o - could take hours or even days to complete.
...
// Discard o (or let it go out of scope).
o = null;
// More stuff - could be hours or days later.
...
o = new Object();
// Later still.
if ( o == oldO.get() ) {
System.out.println("Same!");
}
Run Code Online (Sandbox Code Playgroud)
我意识到这确实是远程可能的,因为对象引用本质上是对象的内存地址(或者可能在某些JVM中).但它有多大可能?我们是否在实际发生之前谈论了几十年的运行时间?
添加
我道歉 - 请假设这oldO
是某种形式的weak
参考,并不能阻止它被收集.也许它Weak
就像代码(现在)建议的那样,或者引用存储在某个数据库或文件中.
(我正在回答我认为您真正想知道的内容,而不是您拥有的特定片段)
它依赖于实现。对象引用的约定是,只要该对象还活着,就没有其他对象会与它进行比较 == 。这意味着在对象被垃圾收集后,VM 可以自由地重用相同的对象引用。
Java的实现可能会选择使用递增的整数来进行对象引用,在这种情况下,只有当引用计数器溢出回0时才能获得相同的对象引用。其他实现可能会使用内存位置,这使得更有可能获得相同的引用被重复使用。无论如何,如果重要的话,您应该定义自己的对象标识。