在做一些关于如何在android中传递对象引用的研究时,我正在考虑以下内容。
假设我有一个带有Long键的WeakHashmap。现在我将一个Object放入此WeakHashMap并将其分配给键'new Long(1)'(假设我将保存对此Long的引用)。
现在应用程序的另一部分创建了一个新的Long(1),然后我将我的第一个Long(用作键)设置为null。
答案 0 :(得分:10)
当没有对内存的强引用时,弱引用将被垃圾收集。
现在,你的例子。这有点棘手。从javadoc for Long
开始,valueOf
方法通过“缓存频繁请求的值”来提高性能。这意味着无论您使用valueOf
还是new
,它都会对答案产生影响。
在您的情况下,您使用new
,因此每个new Long(1)
将是一个不同的对象 - 即不同的引用。但是要记住这一点 - Integer
,Long
并且JVM通常缓存的其他包装类型可能不像WeakHashMap
中那样表现。 String
被实习,因此也存在问题。
无论如何,回答你的问题:
Long
没有更强的引用,那么映射将在下次机会时进行GC。HashMap
使用hashcode
和equals
进行比较。 TreeMap
使用compareTo
。无论如何它都没有区别,这是关于任何关于平等概念的引用。如果对您的对象没有更强的引用,则映射将为GC。Map
在检查密钥是否已经在hashcode
时使用equals
和Map
。 Weak
部分正在讨论参考文献。两个对象可以是equals
,但不能是==
。您可以使用PhantomReference
至track when your key is GC'ed。这可能有助于您了解弱引用的工作原理。