问题标签 [weakhashmap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5609 浏览

java - 设置等效于 WeakHashMap?

相当于? _ HashSet<WeakReference<T>>_ 也就是说,条目不再被引用时会被自动删除吗?SetWeakHashMap<T>

如果不是,什么是等价物?

0 投票
1 回答
138 浏览

java - WeakReferences、Weakhashmaps、软引用有什么用?

请解释 WeakReferences 的用途。我通常确实了解 Java 概念,但这给我带来了麻烦。

我确实理解什么是弱引用,但它们的用法和性质在我脑海中有点模糊。我无法想象一个正确的场景,其中使用 Wea​​kReferences 成为必要。

我也知道 WeakHashMap 与 WeakReferences 相关,其中包含空键的行会被自动删除。我无法想象这是怎么回事,我在某处有一个 WeakHashMap,而其他一些进程使一个键无效,然后 WeakHashMap 通过删除该行来节省一天的时间。

此外,每个人都参考的这篇文章没有提供可以帮助我理解的案例研究。

如果有人能想出一个场景并让我对此有所了解,我将不胜感激。

0 投票
5 回答
1726 浏览

java - WeakHashMap 的用法?

WeakHashMap 是 Map 接口的一个实现,如果相应的键不再被程序的任何部分引用,则 Grabage Collector 可以回收值对象的内存。因此,如果程序中不再使用密钥。无论其用途如何,它的 Entry 对象都将被垃圾回收。到这里为止很清楚

这与 HashMap 不同,其中值对象保留在 HashMap 中,即使不再引用 key。我们需要在 HashMap 对象上显式调用 remove() 方法来删​​除该值。调用 remove 只会从地图中删除条目。它对 GC 的准备情况将取决于它是否仍在程序中的某个地方使用。

请找到上面解释的这个编码示例

根据我的理解,在 HashMap 上使用 Wea​​kHashMap

我的理解是,只有当我们想要确保在程序的任何部分不再引用键时,Grabage Collector 回收值对象时,我们才应该使用 Wea​​kHashMap。这使程序内存高效我的理解在这里正确吗?

根据JavaDocs使用 Wea​​kHashMap ,我可以发现这个语句

此类主要用于关键对象,其 equals 方法使用 == 运算符测试对象身份。

我没有明白上述陈述的含义以及它与我对 WeakHashMap 用法的理解有何不同。实际上我没有明白这个声明与 WeakHashMap 的使用有什么关系?

更新:- 在进一步仔细阅读下面的声明 javadocs

WeakHashMap 中的条目在其键不再常用时将被自动删除。更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,也就是说,使其可终结,最终确定,然后回收。当一个键被丢弃时,它的条目被有效地从映射中删除,所以这个类的行为与其他映射实现有些不同。

为了我和他人的利益,我正在修改我的理解

根据我修改后的理解,在 HashMap 上使用 Wea​​kHashMap

仅当我们想要确保在 GC 运行时从 map 中删除键值对时,我们才应该使用 Wea​​kHashMap,此时键不再被普通使用,而不是 map 本身。

例子是:-

0 投票
1 回答
47 浏览

java - 如何防止一个值强引用它的键?

一个比我优秀得多的程序员告诉我,他WebSocketWeakHashMap. 我自己查看了该地图,它看起来很完美,因为连接将关闭,而负责保持地图的线程不会立即意识到,从而允许对关闭的连接进行垃圾收集。

文档中,我注意到“WeakHashMap 中的值对象由普通的强引用保存。因此应注意确保值对象不会直接或间接地强引用它们自己的键,因为这会阻止密钥被丢弃。”。

这是否意味着一个值根本不应该引用它的或任何其他键,WeakHashMap以免阻止垃圾收集?

值对它的键的强引用究竟是如何产生的?

例如,我需要保存与密钥(连接)关联的 IP 和 DNS 地址列表。我如何确保那些不是对密钥的强引用InetSocketAddressthen InetAddress

0 投票
1 回答
2956 浏览

java - 如何在 Java 中有效地使用 String 作为 WeakHashMap 键,或替代解决方案

我正在用 Java 管理一个存储用户数据的项目。用户可以在线,也可以离线。当用户在线时,他们的数据被加载到数据对象中以便于访问,并在他们注销时卸载。

但是对于离线用户,为了防止多个命令同时操作数据导致数据丢失,我存储了一个weakhashmap作为加载的用户数据对象的缓存。如果有任何东西需要访问离线数据对象来修改它,系统将在从文件加载它之前首先检查缓存。

我唯一能想到的如何存储它们是一个字符串键,它代表用户的用户名。但是由于 java 的工作方式,由于 VM 的字符串缓存系统,这似乎并不总是有效。

最初我想使用字符串包装器,但同样由于哈希图的工作方式(通过使用哈希码),创建一个新的字符串包装器不会得到我需要的值,如果我存储了字符串包装器,那会破坏目的通过始终存储对密钥的强引用(防止从弱哈希图中删除密钥)。

也许我只是不明白应该如何使用弱哈希图:S 如果这不是弱哈希图应该被使用的方式,我愿意接受其他关于如何做我想做的事情的想法。

0 投票
1 回答
465 浏览

java - Java 能否保证 WeakHashMap 项检查后不会消失

我想在WeakHashMap中存储一些数据,但是有一个问题。假设我们有一个代码:

输出将是

这是合乎逻辑的。

但还有另一种情况:

结果不太好:

我怎样才能避免这种误导性的结果?请记住,值和键可以为空。

0 投票
3 回答
1243 浏览

java - 带有字符串文字和字符串对象的弱哈希映射的行为

我正在理解 WeakhashMap 的概念。字符串文字和字符串对象让人难以理解。

以下是代码:

输出是:

但是当 String hkey = new String("hashkey"); 字符串 wkey = new String("weakkey");

替换为以下代码,输出更改。

输出是:

问题:在 WeakHashMap 中以不同的方式使字符串字面量和字符串对象“空”产生影响。是什么原因?

0 投票
0 回答
110 浏览

java - Android:使用接口和 WeakHashMap

经过一整夜的测试(没有任何运气),我的界面需要一些支持。我直接在 Android 框架上工作,我创建了一个类,它作为一个带有 WeakHashMap 的 Binder 来控制回调。

这是代码:

我的回调:

我的活页夹:

这 2 个类被写入框架,所以我用一个实现我的接口的简单类创建了 2 个测试应用程序:


好的,此时我又做了一个类(所有这3个类,所以实现接口的2个和下面的一个被写到不同的包中)

在这第三堂课中,我只是调用: MyBinder.letsgo();

我面临的问题,以及我试图解决的问题...... 8/9 小时是:如果我在第三个包上运行letsgo(),则回调WeakHashMap 大小的日志显示为0。如果我在第二个包上运行letsgo()它可以工作,但它只会触发同一个包中的回调。如果我在第一个包上运行它也是一样的。

我也尝试使用 HashMap 而不是 WeakHashMap,因为我认为必须引用对象但没有任何运气。我想知道是否有人可以帮助我让我去睡觉 :D 谢谢!

0 投票
2 回答
47 浏览

java - 为什么 WeakHashMap 没有删除 WeakReferenced 对象

我最近尝试了解 java.util.WeakHashMap。

但是当我使用 Wea​​kReference 包装一个字符串时,WeakHash 并没有最终确定条目。

另请注意,在线程方法中引用它之前,我正在清除主线程中的 WeakReference。

执行时,while 循环根本不会中断!

0 投票
2 回答
199 浏览

java - Java WeakHashMap 类

我想测试 Java WeakHashMap 类的功能,为此我编写了以下测试:

运行类 WeakMapTest 后,我​​很惊讶地得到以下输出:

gc 前的映射:{x=x, x1=x1, x2=x2} gc 后的映射:{x=x, x1=x1, x2=x2}

当我预计地图将为空时。

也就是说,垃圾收集器没有做它的工作。但为什么?