问题标签 [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.
java - 设置等效于 WeakHashMap?
相当于? _ HashSet<WeakReference<T>>
_ 也就是说,条目不再被引用时会被自动删除吗?Set
WeakHashMap<T>
如果不是,什么是等价物?
java - WeakReferences、Weakhashmaps、软引用有什么用?
请解释 WeakReferences 的用途。我通常确实了解 Java 概念,但这给我带来了麻烦。
我确实理解什么是弱引用,但它们的用法和性质在我脑海中有点模糊。我无法想象一个正确的场景,其中使用 WeakReferences 成为必要。
我也知道 WeakHashMap 与 WeakReferences 相关,其中包含空键的行会被自动删除。我无法想象这是怎么回事,我在某处有一个 WeakHashMap,而其他一些进程使一个键无效,然后 WeakHashMap 通过删除该行来节省一天的时间。
此外,每个人都参考的这篇文章没有提供可以帮助我理解的案例研究。
如果有人能想出一个场景并让我对此有所了解,我将不胜感激。
java - WeakHashMap 的用法?
WeakHashMap 是 Map 接口的一个实现,如果相应的键不再被程序的任何部分引用,则 Grabage Collector 可以回收值对象的内存。因此,如果程序中不再使用密钥。无论其用途如何,它的 Entry 对象都将被垃圾回收。到这里为止很清楚
这与 HashMap 不同,其中值对象保留在 HashMap 中,即使不再引用 key。我们需要在 HashMap 对象上显式调用 remove() 方法来删除该值。调用 remove 只会从地图中删除条目。它对 GC 的准备情况将取决于它是否仍在程序中的某个地方使用。
根据我的理解,在 HashMap 上使用 WeakHashMap
我的理解是,只有当我们想要确保在程序的任何部分不再引用键时,Grabage Collector 回收值对象时,我们才应该使用 WeakHashMap。这使程序内存高效我的理解在这里正确吗?
根据JavaDocs使用 WeakHashMap ,我可以发现这个语句
此类主要用于关键对象,其 equals 方法使用 == 运算符测试对象身份。
我没有明白上述陈述的含义以及它与我对 WeakHashMap 用法的理解有何不同。实际上我没有明白这个声明与 WeakHashMap 的使用有什么关系?
更新:- 在进一步仔细阅读下面的声明 javadocs
WeakHashMap 中的条目在其键不再常用时将被自动删除。更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,也就是说,使其可终结,最终确定,然后回收。当一个键被丢弃时,它的条目被有效地从映射中删除,所以这个类的行为与其他映射实现有些不同。
为了我和他人的利益,我正在修改我的理解
根据我修改后的理解,在 HashMap 上使用 WeakHashMap
仅当我们想要确保在 GC 运行时从 map 中删除键值对时,我们才应该使用 WeakHashMap,此时键不再被普通使用,而不是 map 本身。
例子是:-
java - 如何防止一个值强引用它的键?
一个比我优秀得多的程序员告诉我,他WebSocket
在WeakHashMap
. 我自己查看了该地图,它看起来很完美,因为连接将关闭,而负责保持地图的线程不会立即意识到,从而允许对关闭的连接进行垃圾收集。
在文档中,我注意到“WeakHashMap 中的值对象由普通的强引用保存。因此应注意确保值对象不会直接或间接地强引用它们自己的键,因为这会阻止密钥被丢弃。”。
这是否意味着一个值根本不应该引用它的或任何其他键,WeakHashMap
以免阻止垃圾收集?
值对它的键的强引用究竟是如何产生的?
例如,我需要保存与密钥(连接)关联的 IP 和 DNS 地址列表。我如何确保那些不是对密钥的强引用InetSocketAddress
then InetAddress
?
java - 如何在 Java 中有效地使用 String 作为 WeakHashMap 键,或替代解决方案
我正在用 Java 管理一个存储用户数据的项目。用户可以在线,也可以离线。当用户在线时,他们的数据被加载到数据对象中以便于访问,并在他们注销时卸载。
但是对于离线用户,为了防止多个命令同时操作数据导致数据丢失,我存储了一个weakhashmap作为加载的用户数据对象的缓存。如果有任何东西需要访问离线数据对象来修改它,系统将在从文件加载它之前首先检查缓存。
我唯一能想到的如何存储它们是一个字符串键,它代表用户的用户名。但是由于 java 的工作方式,由于 VM 的字符串缓存系统,这似乎并不总是有效。
最初我想使用字符串包装器,但同样由于哈希图的工作方式(通过使用哈希码),创建一个新的字符串包装器不会得到我需要的值,如果我存储了字符串包装器,那会破坏目的通过始终存储对密钥的强引用(防止从弱哈希图中删除密钥)。
也许我只是不明白应该如何使用弱哈希图:S 如果这不是弱哈希图应该被使用的方式,我愿意接受其他关于如何做我想做的事情的想法。
java - Java 能否保证 WeakHashMap 项检查后不会消失
我想在WeakHashMap中存储一些数据,但是有一个问题。假设我们有一个代码:
输出将是
这是合乎逻辑的。
但还有另一种情况:
结果不太好:
我怎样才能避免这种误导性的结果?请记住,值和键可以为空。
java - 带有字符串文字和字符串对象的弱哈希映射的行为
我正在理解 WeakhashMap 的概念。字符串文字和字符串对象让人难以理解。
以下是代码:
输出是:
但是当 String hkey = new String("hashkey"); 字符串 wkey = new String("weakkey");
替换为以下代码,输出更改。
输出是:
问题:在 WeakHashMap 中以不同的方式使字符串字面量和字符串对象“空”产生影响。是什么原因?
java - Android:使用接口和 WeakHashMap
经过一整夜的测试(没有任何运气),我的界面需要一些支持。我直接在 Android 框架上工作,我创建了一个类,它作为一个带有 WeakHashMap 的 Binder 来控制回调。
这是代码:
我的回调:
我的活页夹:
这 2 个类被写入框架,所以我用一个实现我的接口的简单类创建了 2 个测试应用程序:
好的,此时我又做了一个类(所有这3个类,所以实现接口的2个和下面的一个被写到不同的包中)
在这第三堂课中,我只是调用: MyBinder.letsgo();
我面临的问题,以及我试图解决的问题...... 8/9 小时是:如果我在第三个包上运行letsgo(),则回调WeakHashMap 大小的日志显示为0。如果我在第二个包上运行letsgo()它可以工作,但它只会触发同一个包中的回调。如果我在第一个包上运行它也是一样的。
我也尝试使用 HashMap 而不是 WeakHashMap,因为我认为必须引用对象但没有任何运气。我想知道是否有人可以帮助我让我去睡觉 :D 谢谢!
java - 为什么 WeakHashMap 没有删除 WeakReferenced 对象
我最近尝试了解 java.util.WeakHashMap。
但是当我使用 WeakReference 包装一个字符串时,WeakHash 并没有最终确定条目。
另请注意,在线程方法中引用它之前,我正在清除主线程中的 WeakReference。
执行时,while 循环根本不会中断!
java - Java WeakHashMap 类
我想测试 Java WeakHashMap 类的功能,为此我编写了以下测试:
运行类 WeakMapTest 后,我很惊讶地得到以下输出:
gc 前的映射:{x=x, x1=x1, x2=x2} gc 后的映射:{x=x, x1=x1, x2=x2}
当我预计地图将为空时。
也就是说,垃圾收集器没有做它的工作。但为什么?