`
dingjob
  • 浏览: 180473 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

WeakHashMap 用法和原理

阅读更多

 在《Effective Java》一书中第六条,消除陈旧对象时,提到了weakHashMap,看了下还是适用的,即在我们使用短时间内就过期的缓存时最好使用weakHashMap,它包含了一个自动调用的方法expungeStaleEntries,这样就会在值被引用后直接执行这个隐含的方法,将不用的键清除掉。

 测试了一下

package com.alibaba.itbu.job.billing;

import java.util.Map;
import java.util.WeakHashMap;

public class WeakHashMapTest {
    static Map wMap = new WeakHashMap();
    public static void init(){
        wMap.put("1", "ding");
        wMap.put("2", "job");
    }
    public static void testWeakHashMap(){

        System.out.println("first get:"+wMap.get("1"));
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("next get:"+wMap.get("1"));
    }
    public static void main(String[] args) {
        testWeakHashMap();
    }
}

 

 

上面例子, 第一次执行时要初始化,然后在5s内是不会清除的,大概在10几秒时会清除

 

第一次执行

first get:ding

next get:ding

 

过一会再执行:

first get:null
next get:null

 

这时候已经被清除

同样,没有调用任何赋值方法的情况下,在一段时间后 size 方法也可能返回较小的值,对于 isEmpty 方法,返回 false,然后返回 true,对于给定的键,containsKey 方法返回 true 然后返回 false,对于给定的键,get 方法返回一个值,但接着返回 null,对于以前出现在映射中的键,put 方法返回 null,而 remove 方法返回 false,对于键集、值集、项集进行的检查,生成的元素数量越来越少。

 

 

注意:WeakHashMap并不是你啥也干他就能自动释放内部不用的对象的,而是在你访问它的内容的时候释放内部不用的对象。这两句话看似区别不大,但是有时候一个小小的区别就会要了命的。就是说你只put 了压根没有get过,这个值是永远都存在的

 

 

 

我们也可以看下这个移除键值的实现

private void expungeStaleEntries() {
	Entry<K,V> e;
        while ( (e = (Entry<K,V>) queue.poll()) != null) {
            int h = e.hash;
            int i = indexFor(h, table.length);

            Entry<K,V> prev = table[i];
            Entry<K,V> p = prev;
            while (p != null) {
                Entry<K,V> next = p.next;
                if (p == e) {
                    if (prev == e)
                        table[i] = next;
                    else
                        prev.next = next;
                    e.next = null;  // Help GC
                    e.value = null; //  "   "
                    size--;
                    break;
                }
                prev = p;
                p = next;
            }
        }
    }

 

 

就是使用了链表,找到这个hash值  将这个hash值移除 size减少

 

 

分享到:
评论
9 楼 szjszj 2017-06-15  
看到请麻烦修改下,以免误人子弟
8 楼 sonofelice 2016-06-04  
博主,你第一段代码怎么没有调用init方法啊~
7 楼 yun900800 2015-04-08  
这是害人啦
6 楼 fortaotao 2015-01-16  
这治学态度太不严谨了吧,贴出来的例子压根自己就没检查过。
5 楼 transist 2012-01-04  
是否WeakHashMap不适用于传递中间数据使用?经测试好像会丢掉一些key
4 楼 zhenlishiwo 2011-03-07  
因为String的特殊性,楼主的代码是不可能实现的,看下面代码
WeakHashMap wMap = new WeakHashMap();
Person p1 = new Person("张三");
Person p2 = new Person("李四");	
wMap.put(p1, "zs");
wMap.put(p2, "ls");
p1=null;
//gc,不保证运行
try {
	System.gc();
	Thread.sleep(1000);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}

for (Object o : wMap.entrySet()) {
	System.out.println(o);
}
3 楼 zhenlishiwo 2011-03-07  
WeakHashMap wMap = new WeakHashMap();
Person p1 = new Person("张三");
Person p2 = new Person("李四");
wMap.put(p1, "zs");
wMap.put(p2, "ls");
p1=null;
//gc
try {
System.gc();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

for (Object o : wMap.entrySet()) {
System.out.println(o);
}
2 楼 zhenlishiwo 2011-03-02  
经jdk1.5测试,该例子没有通过
1 楼 darrendu 2011-01-04  
楼上,你的测试不给力啊,把你的测试改下也不行,那里错了吗
my code
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.TimeUnit;

public class WeakHashMapTest {
    static Map wMap = new WeakHashMap();
    public static void init(){
        wMap.put("1", "ding");
        wMap.put("2", "job");
    }
    public static void testWeakHashMap(){

        System.out.println("first get:"+wMap.get("1"));
        try {
        	System.gc();
            TimeUnit.SECONDS.sleep(20);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("next get:"+wMap.get("1"));
    }
    public static void main(String[] args) {
    	init();
        testWeakHashMap();
    }
}

相关推荐

    WeakHashMap的使用方法详解

    主要介绍了WeakHashMap的使用方法详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下

    java集合-WeakHashMap的使用

    WeakHashMap是Java中的一种特殊的哈希表实现,它使用弱引用(Weak Reference)来保存键对象。当键对象没有被其他强引用引用时,在垃圾回收时会自动从WeakHashMap中移除对应的键值对。

    解析WeakHashMap与HashMap的区别详解

    本篇文章是对WeakHashMap与HashMap的区别进行了详细的分析介绍,需要的朋友参考下

    Java编程WeakHashMap实例解析

    主要介绍了Java编程WeakHashMap实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    Java弱引用与WeakHashMap

     《Java 理论与实践: 用弱引用堵住内存泄漏》一文也指出了使用全局的Map作为缓存容器时发生的内存泄露问题,介绍了如何使用hprof工具来找出内存泄露,并分析了如何使用弱引用来防止内存泄露,还分析了

    线程死锁CPU过高,请求原因分析

    线程死锁 CPU过高 WeakHashMap 请求原因分析

    Java 基础核心总结 +经典算法大全.rar

    基础 IO 类和相关方法InputStream OutputStream Reader 类Writer 类 InputStream 及其子类 OutputStream 及其子类Reader 及其子类Writer 及其子类 注解 关于 null 的几种处理方式大小写敏感 null 是任何引用类型的...

    疯狂JAVA讲义

    6.8.3 枚举类的属性、方法和构造器 220 6.8.4 实现接口的枚举类 223 6.8.5 包含抽象方法的枚举类 224 6.9 对象与垃圾回收 225 6.9.1 对象在内存中的状态 226 6.9.2 强制垃圾回收 227 6.9.3 finalize方法 228 ...

    清华妹子的Java仓库(进阶学习路线)

    JNA:演示了JNA的基本用法,使用Java调用C++代码。 博客目录 Java基础 Java基础学习(1)——引用 Java基础学习(2)——注解 Java基础学习(3)——泛型 Java基础学习(4)——动态代理 《Java多线程核心技术》读书笔记 ...

    picketlink-jbas-common-2.6.0.CR4.zip

    Java-WeakIdentityHashMap.zip,weakhashmap identityhashmapa独立库的组合,用于weakidantityhashmap实现内/外字段

    Java期末复习-类集框架

    Java类集框架 最大单值操作父接口Collection及其子接口、子类: List接口、ArrayList类、Vector类、栈操作类Stack、链表操作类LinkList、队列操作接口Queue、Set接口、...Comparable接口、equals()方法、hashCode()方法

    Java集合类操作优化经验总结

    并对这些接口的实现类进行详细描述,包括 LinkedList、ArrayList、Vector、Stack、Hashtable、HashMap、WeakHashMap 等,然后对一些实现类的实现方式和使用经验进行讲解,同时重点介绍 WeakHashMap。希望通过本文...

    java集合框架 解析

    java集合框架 3.6. LinkedHashSet类 4. Map接口 4.1. Map.Entry接口 ...4.4. HashMap类和TreeMap类 4.4.1. HashMap类 4.4.2. TreeMap类 4.5. LinkedHashMap类 4.6. WeakHashMap类 4.6. IdentityHashMap类

    超全Java集合框架讲解.md

    - WeakHashMap - Hashtable - Collection 集合体系详解 - Set 接口 - AbstractSet 抽象类 - SortedSet 接口 - HashSet - LinkedHashSet - TreeSet - List 接口 - AbstractList 和 AbstractSequentialList...

    各种集合的总结

    总结了集合中常用的一点点,希望可以共享 List:LinkedList,ArrayList,Vector(Stack),Set Map:Hashtable,HashMap,WeakHashMap

    WeakObjectPool:用于在对象生命周期中将对象附加到对象(即装饰器)的池

    #弱对象池问题您是否曾经想跟踪一堆对象而不直接引用它们,以免使用弱引用干扰它们的自然生命周期? 您是否曾经尝试过在运行时扩展Java对象?解决方案WeakObjectPool :用于保存和扩展[弱引用的对象]的池( “ ...

    javabitset源码-JerrySoundCode:杰瑞声码

    WeakHashMap (done) 并发集合 ArrayBlockingQueue(done) LinkedBlockingDeque (done) LinkedBlockingQueue (done) PriorityBlockingQueue (done) ConcurrentHashMap (done) ConcurrentLinkedQueue (done) C

    Java优化编程(第2版)

    15.1 用weakhashmap屏蔽内存泄漏 15.2 优化java应用大小 15.3 通过randomaccess接口优化迭代列表 15.4 合并java中的多进程与系统优化 小结 附录a together工具的使用简介 附录b j2se 5.0的新特性与性能的提升 附录c ...

    javalruleetcode-dsal:数据结构与算法个人整理

    java lru leetcode 基础算法 快速排序: 随机枢纽元快排、三路快排、三数中值快排 归并排序: 自顶向下归并、自底向上...WeakHashMap Leetcode 刷题记录 栈实现队列、队列实现栈、猫狗队列、带有最小值的栈、LRU、数据

    Thinking in Java 4th Edition

    What’s Inside Preface 1 Java SE5 and SE6 .................. 2 Java SE6 ............................................The 4th edition...........................Changes ...........................................

Global site tag (gtag.js) - Google Analytics