java WeakHashMap,具有Long、Int或String等类型
在研究如何在安卓中传递对象引用时,我想到了以下几点
让我们假设我有一张和钥匙一样长的WeakHashmap。现在我将一个对象放入这个WeakHashMap,并将其分配给键“new Long(1)”(假设我将保存对这个Long的引用)
现在,应用程序的另一部分创建了一个新的Long(1),然后我将第一个Long(用作键)设置为null
- WeakHashMap中的对象会发生什么李>
- 如果我用自己的类替换Long,并使用Long成员,如果它与另一个类型相同的对象(我自己的类)进行比较,并且该对象中的值相同,那么让它的compare()-方法返回true会怎么样李>
- 假设在这两种情况下,WeakReference都被清除。如果我在清除第一个on out之前使用第二个创建的密钥访问WeakHasMap一次,会有什么不同吗李>
# 1 楼答案
当内存没有强引用时,弱引用将被垃圾收集
现在是你的例子。这有点棘手。从javadoc for ^{} 开始,
valueOf
方法通过“缓存频繁请求的值”来提高性能。这意味着无论你使用valueOf
还是new
,答案都会有所不同在你的例子中,你使用了
new
,所以每个new Long(1)
都是不同的对象,即不同的引用。但这是需要记住的-Integer
,Long
和其他包装类型通常由JVM缓存,它们的行为可能与WeakHashMap
中的预期不同String
被拘留的人也有问题总之,要回答你的问题:
Long
的强引用,那么将在下一次机会对映射进行GC'ed李>HashMap
使用hashcode
和equals
进行比较。ATreeMap
使用compareTo
。在任何情况下都没有区别,这是关于参考文献,而不是关于任何平等的概念。如果没有更多对对象的强引用,那么映射将被GC'edMap
在检查Map
中是否已有密钥时,使用hashcode
和equals
。第Weak
部分讨论的是参考文献。两个对象可以是equals
,但不能是==
李>可以使用^{} 到track when your key is GC'ed。这可能会帮助你理解弱引用是如何工作的