gpt4 book ai didi

java - 弱引用可维护性

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:01:09 25 4
gpt4 key购买 nike

我正在阅读 java 中的弱引用,听起来很简单,如果一个对象只有弱引用,那么它可以被垃圾收集器收集。除了如果你的引用在你使用这个值之前就死了会发生什么?

例子:

假设我有一个带有键 {1,2,3,4,5} 的弱 HashMap ,所有键的值为 1。现在假设您有一个用于 [1:10] 中数字的随机数生成器。现在每次获取数字时,它都会检查它是否是 map 中的键,然后给出对该键的临时强引用。因此,使用此设置,您将拥有一些具有强引用的键,从而保留在内存中,但您也有可能在选择之前某些键会失效。

如果我对弱散列映射的直觉是正确的,那是否意味着该映射会在某个时候从其原始状态改变?

最佳答案

尝试使用 Integer 对象作为 WeakHashMap 的键可能会导致一些奇怪的行为。首先,javadoc for WeakHashMap有以下注释:

This class is intended primarily for use with key objects whose equals methods test for object identity using the == operator. Once such a key is discarded it can never be recreated, so it is impossible to do a lookup of that key in a WeakHashMap at some later time and be surprised that its entry has been removed. This class will work perfectly well with key objects whose equals methods are not based upon object identity, such as String instances. With such recreatable key objects, however, the automatic removal of WeakHashMap entries whose keys have been discarded may prove to be confusing.

考虑以下代码:

    WeakHashMap<Integer, String> map = new WeakHashMap<>();
Integer k = Integer.valueOf(9001);
map.put(k, "OVER 9000!?");

while (true)
{
System.out.println(map.get(k));
Thread.sleep(100);
k = Integer.valueOf(9001);
System.gc();
}

循环将从打印“OVER 9000!?”开始,但在第一个循环之后,原始 key 已被丢弃(即使现在有一个对 等于 的 key 的引用).因此,如果该键对象被垃圾回收,该条目将从映射中删除,循环将开始打印“null”。由于我们在丢弃 key 后调用 System.gc();,因此这很可能发生在单次循环之后。

不过,使用 Integer 作为 WeakHashMap 键的问题还没有结束。如果将上面的值 9001 更改为 1,您会发现行为发生了变化! (可能?这可能取决于实现。)现在,该条目永远不会从 map 中删除。这是因为 integer cache --Integer.valueOf(1) 总是返回相同的 Integer 实例,但是 Integer.valueOf(9001) 创建一个新的 Integer 每次实例。

第二个问题特定于 Integer,但第一个问题实际上适用于您尝试使用 equals 不是基于 == 的键的任何方案。如果 equals 基于 ==,那么你的问题并不适用——如果你没有对键不再存在,值是否从映射中删除并不重要因为您不再有办法访问它——您无法重新创建使用基于身份的相等性的键.

关于java - 弱引用可维护性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51885777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com