Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有不可变键的Java WeakHashMap_Java_Immutability_Weakhashmap - Fatal编程技术网

具有不可变键的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安全的。我这样做