什么是什么WeakHashMap时候应该使用它?a WeakHashMap和a 之间有什么区别HashMap?
是否可以使用Collections.synchronizedMap()并发保持正确性来重写下面的代码片段?
Collections.synchronizedMap(new WeakHashMap<Class, Object>());
Run Code Online (Sandbox Code Playgroud)
即是否可以使用java.util.concurrent中的东西?请注意,仅替换为
new ConcurrentHashMap<Class, Object>(new WeakHashMap<Class, Object>()));
Run Code Online (Sandbox Code Playgroud)
显然不行
我创建一个WeakHashMap作为
WeakHashMap<Employee,String> map = new WeakHashMap<Employee,String>();
map.put(emp,"hello");
Run Code Online (Sandbox Code Playgroud)
其中emp是Employee对象.现在,如果我执行emp = null或者说不再引用emp对象,那么是否将从WeakHashMap中删除该条目,即Map的大小是否为零?
在HashMap的情况下反之亦然?
我对WeakHashMap的理解是否正确?
是HashSet<WeakReference<T>>的Set等效WeakHashMap<T>?也就是说,当条目不再被引用时会自动删除吗?
如果没有,那相当于什么?
我最近发现了WeakHashMapJava中的数据结构.
但是,我不明白它的意思是垃圾收集不再正常使用时的映射.数据结构如何知道我将不再使用我的程序中的密钥?如果我长时间没有提到钥匙怎么办?
在以下代码示例中,将键设置为null和 System.gc()调用时,将WeakHashMap丢失所有映射并清空.
class WeakHashMapExample {
public static void main(String[] args) {
Key k1 = new Key("Hello");
Key k2 = new Key("World");
Key k3 = new Key("Java");
Key k4 = new Key("Programming");
Map<Key, String> wm = new WeakHashMap<Key, String>();
wm.put(k1, "Hello");
wm.put(k2, "World");
wm.put(k3, "Java");
wm.put(k4, "Programming");
k1=null;
k2=null;
k3=null;
k4=null;
System.gc();
System.out.println("Weak Hash Map :"+wm.toString());
}
}
class Key{
private String key;
public Key(String key) {
this.key=key;
}
@Override
public boolean equals(Object obj) {
return this.key.equals((String)obj);
} …Run Code Online (Sandbox Code Playgroud) 如果我遍历WeakHashMap的密钥集,我是否需要检查空值?
WeakHashMap<MyObject, WeakReference<MyObject>> hm
= new WeakHashMap<MyObject, WeakReference<MyObject>>();
for ( MyObject item : hm.keySet() ) {
if ( item != null ) { // <- Is this test necessary?
// Do something...
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,当我迭代它们时,是否可以收集WeakHashMap的元素?
编辑
为了这个问题,可以假设null在哈希映射中没有添加任何条目.
我需要将一些数据与密钥关联起来,因此我使用的是WeakHashMap.但是,另外我需要通过其相应的值获取密钥.简单的方法是在创建值时保持引用:
public class Key {}
public class Value {
final public Key key;
public Value(Key k) {
key = k;
}
}
Run Code Online (Sandbox Code Playgroud)
当然,当我Value在我的程序中使用时,它key不会消失.但是,如果在地图外没有对任何一个键或其值的引用,它是否会被垃圾收集?或者价值中幸存的强大参考是否会阻止它?
在Java中,有一个名为WeakHashMap的数据结构,它将弱引用存储为键.每当弱引用从内存中取出时,该条目将从地图中删除.
如果我有一个数据结构,如Stack或Set,我存储弱引用,当弱引用从内存中取出时,它们的条目会被自动删除吗?
下面是存储弱引用的Stack的示例.
Stack<WeakReference<Object>> objStack = new Stack<WeakReference<Object>>();
Run Code Online (Sandbox Code Playgroud) 我正在用Java管理一个存储用户数据的项目.用户可以在线或离线.当用户在线时,他们的数据被加载到数据对象中以便于访问,并在他们注销时卸载.
但是,对于离线用户,为了防止数据同时访问来自同时操作数据的多个命令的数据,我将weakhashmap存储为加载的用户数据对象的缓存.如果需要访问脱机数据对象以进行修改,系统将在从文件加载之前先检查缓存.
我能想到如何存储它们的唯一方法是使用字符串键,它代表用户的用户名.但是由于java的工作原理,由于VM的字符串缓存系统,这似乎并不总是有效.
最初我想过使用字符串包装器,但是再次因为hashmaps如何工作(通过使用hashcode),创建一个新的字符串包装器不会得到我需要的值,如果我存储了字符串包装器,那将失败目的通过始终存储对密钥的强引用(防止从weakhashmap中删除密钥).
也许我只是不理解如何使用weakhashmap:S如果不是如何使用weakhashmap,我愿意接受其他如何做我想做的想法.
java ×10
weakhashmap ×10
collections ×3
caching ×1
data-loss ×1
data-storage ×1
guava ×1
hashset ×1
iteration ×1
keyset ×1
null ×1
set ×1
stack ×1