是否有C#类提供带有弱键或/和弱值的映射?或者至少是类似WeakHashMap的功能。 最佳答案 在.Net3.5及以下版本中,没有这样的结构可用。但是我为一个副项目写了一个并将代码发布在followinglocation.从.NET4.0开始,有一个名为ConditionalWeakTable的可用结构。在Runtime.CompilerServices命名空间中也可以解决问题。 关于c#-C#中的JavaWeakHashMap类是否有等效项?,我们在StackOverflow上找到一
我正在寻找与等价的WeakHashMap类,除了它把多个键映射到一个值,所以真的更像WeakHashMapWeakHashMapetc.get和set条目的方式类似于数据库中的多列主键:您使用多个键放置项目,例如(K1,K2),要取回该项目,您需要提供所有您用来放入它的相同key。鉴于这些get和set语义,GC语义将是:一个条目将在不再可达时被GC,这意味着它的任何键不再可达。以前有其他人需要这样的东西吗?您将如何处理这样的要求?将元组存储为键,就像您在非弱HashMap中所做的那样,是行不通的(元组几乎立即得到GC,没有人指向它)。如果在我很乐意使用它之前已经制作了这样的东西,但只
这个问题在这里已经有了答案:WhenwouldyouuseaWeakHashMaporaWeakReference?(10个答案)关闭4年前。WeakHashMap是Map接口(interface)的实现,值对象的内存可以通过GrabageCollector回收如果程序的任何部分不再引用相应的键。因此,如果程序中不再使用key。它的条目对象将被垃圾收集,无论其用途如何。到这里为止都清楚这与HashMap不同,后者的值对象保留在HashMap中,即使不再引用键也是如此。我们需要显式调用HashMap对象上的remove()方法删除值。调用remove只会从map中删除条目。它的GC准备就
我们有一个Scala服务器,它通过套接字使用ProtocolBuffers获取节点树,我们需要将额外的数据附加到每个节点。在单线程上下文中,当节点树和关联数据将同时删除它们的强引用时(由于超出范围),是否有任何理由将GoogleGuava的MapMaker与weakKeys()一起使用过度使用WeakHashMap?似乎使用MapMaker,需要为同步访问付费,在这种情况下不需要。顺便说一句,如果MapMaker允许访问等价设置,那么人们可以选择引用相等而不关心弱引用或软引用,这将很有用。 最佳答案 WeakHashMap的一个
WeakHashMap中的关键对象变得弱可达。并且map应该在GC之后删除条目。但是对值对象的强引用仍然存在。为什么?使用Guava弱键映射观察到相同的行为。预期输出:...refKey.get=nullrefValue.get=null但是我得到了输出:map.keys=[]map.values=[]map.size=0refKey.get=nullrefValue.get=(123)代码:importjava.lang.ref.WeakReference;importjava.util.Map;importjava.util.WeakHashMap;importcom.google
因此,JavaWeakHashMap允许创建一个映射,如果其键变弱,其条目将被删除。但是,本地图中的值变弱时,如何创建一个条目被删除的map?我想使用map的原因是作为一个全局哈希表,它根据对象的ID跟踪对象。ID--->ObjectAddressKey--->Value(其中ID是一个文本字符串)我希望在对象地址变弱时删除键值对,而不是指向它们的字符串。有人对此有任何想法吗? 最佳答案 支持这样的map,例如Guava:Mapm=newMapMaker().weakValues().makeMap();
在Java中有一种称为WeakHashMap的数据结构,它将弱引用存储为键。每当弱引用从内存中取出时,条目就会从map中删除。如果我有一个存储弱引用的数据结构,例如Stack或Set,当弱引用从内存中取出时,它们的条目是否会自动删除?下面是一个存储弱引用的Stack的例子。Stack>objStack=newStack>(); 最佳答案 是的。您所描述的是一般的弱引用的属性,而不是WeakHashMap具体的。来自theAPI:Supposethatthegarbagecollectordeterminesatacertainpoi
Javadocs说“当一个键被丢弃时,它的条目被有效地从map中移除”。但除非有另一个线程偶尔会删除这样的Map.Entry条目,值对象不会被map强引用吗?但是因为没有这样的线程在运行,所以只有get方法调用可以删除此类条目-一次一个。我几乎总是使用WeakHashMap>是因为。他们为什么不将其设为默认行为-值也作为弱引用? 最佳答案 引用队列用于自动删除条目。http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/ReferenceQueue.htmlReferen
我正在用Java管理一个存储用户数据的项目。用户可以在线,也可以离线。当用户在线时,他们的数据会加载到数据对象中以便于访问,并在他们注销时卸载。但是,对于离线用户,为了防止同时操作数据的多个命令并发访问数据而丢失数据,我存储了一个weakhashmap作为加载的用户数据对象的缓存。如果任何东西需要访问离线数据对象来修改它,系统将首先检查缓存,然后再从文件加载它。我唯一能想到如何存储它们的是字符串键,代表用户的用户名。但由于Java的工作方式,由于VM的字符串缓存系统,这似乎并不总是有效。最初我想使用字符串包装器,但再次由于HashMap的工作方式(通过使用哈希码),创建新的字符串包装器
如果我遍历WeakHashMap的键集,是否需要检查空值?WeakHashMap>hm=newWeakHashMap>();for(MyObjectitem:hm.keySet()){if(item!=null){//换句话说,WeakHashMap的元素可以在我迭代它们时被收集吗?编辑为了这个问题,可以假设没有null条目被添加到HashMap中。 最佳答案 我不熟悉WeakHashMap,但您可能有一个空对象。看这个例子:publicstaticvoidmain(String[]args){WeakHashMap>hm=newW