具有不可变键的Java WeakHashMap
我想使用具有不可变键的Java WeakHashMap,java,immutability,weakhashmap,Java,Immutability,Weakhashmap,我想使用WeakHashMap来表示将在内存中存在很短时间的对象 每个对象都有一个id(唯一的整数字段,它是DB的主键),所以我的第一个想法是使用该字段作为对象的键 但是,整数是不可变的,因此,如果是这样,哈希将生成另一个不可变的整数,因此只要任何其他非相关对象指向该对象,该对象就不会被gcd 有没有办法在WeakHashMap中使用整数键?正如您所说,WeakHashMap不会提供所需的功能。JavaDocs声明如下 因此,应注意确保值对象不会 直接或间接地强烈引用他们自己的密钥, 因为这样可
WeakHashMap
来表示将在内存中存在很短时间的对象
每个对象都有一个id(唯一的整数字段,它是DB的主键),所以我的第一个想法是使用该字段作为对象的键
但是,整数是不可变的,因此,如果是这样,哈希将生成另一个不可变的整数,因此只要任何其他非相关对象指向该对象,该对象就不会被gcd
有没有办法在
WeakHashMap
中使用整数键?正如您所说,WeakHashMap不会提供所需的功能。JavaDocs声明如下
因此,应注意确保值对象不会
直接或间接地强烈引用他们自己的密钥,
因为这样可以防止密钥被丢弃
因此,您可以实现一个“WeakValueMap”。但这并不像听起来那么复杂。您可以简单地将WeakReference包装在类型定义中
Map<Integer, WeakReference<YourType>> cache ...
映射缓存。。。
或者围绕它实现一个包装器实现
public class Cache<K, V> implements Map<K, V> {
private final Map<K, V> store = new HashMap<>();
// implement put, get, etc.
}
公共类缓存实现映射{
私有最终映射存储=新HashMap();
//实现放、得到等。
}
正如您所说,WeakHashMap不会提供所需的功能。JavaDocs声明如下
因此,应注意确保值对象不会
直接或间接地强烈引用他们自己的密钥,
因为这样可以防止密钥被丢弃
因此,您可以实现一个“WeakValueMap”。但这并不像听起来那么复杂。您可以简单地将WeakReference包装在类型定义中
Map<Integer, WeakReference<YourType>> cache ...
映射缓存。。。
或者围绕它实现一个包装器实现
public class Cache<K, V> implements Map<K, V> {
private final Map<K, V> store = new HashMap<>();
// implement put, get, etc.
}
公共类缓存实现映射{
私有最终映射存储=新HashMap();
//实现放、得到等。
}
在WeakHashMap
中使用整数
键不会阻止删除键。
一旦不存在对放入映射的同一Integer
实例的引用,Integer
键可能会被垃圾收集。如果存在与WeakHashMap
中的键相同的不同的整数
实例引用(即具有相同的数值),则不会阻止自动删除该键
请注意,WeakHashMap
的值不能包含对该键的强引用,否则该键永远无法自动删除。为了避免这种情况,只需按如下方式向WeakHashMap
添加值:
Integer key = new Integer(someObject.getID());
weakMap.put(key,someObject);
现在,一旦您不再保留对键
变量引用的整数
实例的引用,WeakHashMap
将自动删除它
如果put
在WeakHashMap
中放置条目而不保留对键的引用(即weakMap.put(新整数(someObject.getID()),someObject)
),则WeakHashMap
将能够立即自动删除它,我认为这不是您想要的。在WeakHashMap
中使用整数
键不会阻止删除键。
一旦不存在对放入映射的同一Integer
实例的引用,Integer
键可能会被垃圾收集。如果存在与WeakHashMap
中的键相同的不同的整数
实例引用(即具有相同的数值),则不会阻止自动删除该键
请注意,WeakHashMap
的值不能包含对该键的强引用,否则该键永远无法自动删除。为了避免这种情况,只需按如下方式向WeakHashMap
添加值:
Integer key = new Integer(someObject.getID());
weakMap.put(key,someObject);
现在,一旦您不再保留对键
变量引用的整数
实例的引用,WeakHashMap
将自动删除它
如果put
在WeakHashMap
中放置条目而不保留对键的引用(即weakMap.put(新整数(someObject.getID()),someObject)
),则WeakHashMap
将能够立即自动删除它,我认为这不是您想要的。在WeakHashMap中使用Integer作为键的问题之一是,当它映射到的值仍在内存中使用时,可以对其进行垃圾收集
如果您希望在HashMap中将这些项作为值,而不阻止它们被垃圾收集,然后,您应该将它们包装到WeakReference中,并在常规映射中将它们用作值map在WeakHashMap中使用Integer作为键的问题之一是,当它映射到的值仍在内存中使用时,可以对该整数进行垃圾收集
如果您希望在HashMap中将这些项作为值,而不阻止它们被垃圾收集,那么您应该将它们包装成WeakReference,并将它们作为常规映射中的值使用MapI不太理解这个问题,但是如果这是java.lang.Integer
的不变性问题,您可以创建自己的包装int对象。使用具有适当过期策略(最大大小或缓存期限)的内存缓存实现如何?我认为您的担心是无效的。每个新整数(…)
调用都会生成一个整数的新实例。它不会重用任何现有实例-这与Integer对象的不可变性无关。但有一个例外:范围为-128的整数实例。。127,如果它们是通过自动装箱(而不是新实例)创建的,则默认情况下会进行缓存。见例。用map.put(新整数(myId),…)填充映射应该是imo安全的。我这样做