注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

罔少年

QQ 332256483

 
 
 

日志

 
 

WeakHashMap  

2017-01-06 09:49:19|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
什么是WeakHashMap?

Java中哈希表有HashTable、HashMap、WeakHashMap三类,他们的区别如下:

1.HashTable的键和值都不允许是null,而HashMap、WeakHashMap可以;

2.HashTable支持同步机制,多个线程对同一个HashTable实例操作时,HashTable可以保证操作的正确性,而HashMap、WeakHashMap没有同步机制;

3.WeakHashMap会检查各元素是否“常用”,如果“不常用”会自动从WeakHashMap对象中删除,而HashTable、HashMap没有这种自动检查、删除机制;


WeakHashMap 里的 entry 可能会被GC自动删除,即使程序员没有调用 remove() 或者 clear() 方法。

更直观的说,当使用 WeakHashMap 时,即使没有显示的添加或删除任何元素,也可能发生如下情况:

  • 调用两次 size() 方法返回不同的值;
  • 两次调用 isEmpty() 方法,第一次返回 false ,第二次返回 true ;
  • 两次调用 containsKey() 方法,第一次返回 true ,第二次返回 false ,尽管两次使用的是同一个 key ;
  • 两次调用 get() 方法,第一次返回一个 value ,第二次返回 null ,尽管两次使用的是同一个对象。

代码应用
第一种不加GC
public class TestClass {
static WeakHashMap wMap = new WeakHashMap();
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
wMap.put(p1, "张三");
wMap.put(p2, "李四");
p1=null;
try {
// System.gc();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Iterator i = wMap.entrySet().iterator();
while (i.hasNext()) {
Map.Entry en = (Map.Entry) i.next();
System.out.println(en.getValue());
}
}
    public static class Person {
public Person() {
}
}
}
输出结果:
张三
李四
--------------------------------------------------------------------------------------------------------------------------------------------------
第二种加上GC
public class TestClass {
static WeakHashMap wMap = new WeakHashMap();
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
wMap.put(p1, "张三");
wMap.put(p2, "李四");
p1=null;
try {
System.gc();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Iterator i = wMap.entrySet().iterator();
while (i.hasNext()) {
Map.Entry en = (Map.Entry) i.next();
System.out.println(en.getValue());
}
}
    public static class Person {
public Person() {
}
}
}
输出结果:
李四
  评论这张
 
阅读(5)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017