weakHashMap 用法

weakHashMap 用法WeakHashMap,此种Map的特点是:当除了自身有对key的引用外,此key没有其他引用,那么GC之后此map会自动丢弃此值举例来说:声明了两个Map对象,一个是HashMap,一个是WeakHashMap,同时向两个map中放入a、b两个对象,当HashMapremove掉a并且将a、b都指向null时,WeakHashMap中的a将自动被回收掉。出现这个状况的原因是,对于a对象…

大家好,又见面了,我是你们的朋友全栈君。

WeakHashMap,此种Map的特点是:

当除了自身有对key的引用外,此key没有其他引用,那么GC之后此map会自动丢弃此值

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

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

举例来说:声明了两个Map对象,一个是HashMap,一个是WeakHashMap,同时向两个map中放入a、b两个对象,当HashMap remove掉a 并且将a、b都指向null时,WeakHashMap中的a将自动被回收掉。出现这个状况的原因是,对于a对象而言,当HashMap remove掉并且将a指向null后,除了WeakHashMap中还保存a外已经没有指向a的指针了,所以WeakHashMap会自动舍弃掉a,而对于b对象虽然指向了null,但HashMap中还有指向b的指针,所以WeakHashMap将会保留。

public class Weakmap { 
     
          public static void main(String[] args) throws Exception { 
     
            String a = new String("a");  
            String b = new String("b");  
            Map weakmap = new WeakHashMap();  
            Map map = new HashMap();  
            map.put(a, "aaa");  
            map.put(b, "bbb");  

            weakmap.put(a, "aaa");  
            weakmap.put(b, "bbb");  

            map.remove(a);  

            a=null;
            b=null;  

            System.gc();  
            Iterator i = map.entrySet().iterator();  
            while (i.hasNext()) { 
     
                Map.Entry en = (Map.Entry)i.next();  
                System.out.println("map:"+en.getKey()+":"+en.getValue());  
            }  

            Iterator j = weakmap.entrySet().iterator();  
            while (j.hasNext()) { 
     
                Map.Entry en = (Map.Entry)j.next();  
                System.out.println("weakmap:"+en.getKey()+":"+en.getValue());    
            }  
        }   

弱引用(WeakReference)。我们都知道Java中内存是通过GC自动管理的,GC会在程序运行过程中自动判断哪些对象是可以被回收的,并在合适的时机进行内存释放。GC判断某个对象是否可被回收的依据是,是否有有效的引用指向该对象。如果没有有效引用指向该对象(基本意味着不存在访问该对象的方式),那么该对象就是可回收的。这里的“有效引用”并不包括弱引用。也就是说,虽然弱引用可以用来访问对象,但进行垃圾回收时弱引用并不会被考虑在内,仅有弱引用指向的对象仍然会被GC回收。

WeakHashMap 内部是通过弱引用来管理entry的,弱引用的特性对应到 WeakHashMap 上意味着什么呢?将一对key, value放入到 WeakHashMap 里并不能避免该key值被GC回收,除非在 WeakHashMap 之外还有对该key的强引用。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138431.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 设置ASP页的Session过期时间的问题

    设置ASP页的Session过期时间的问题保持Session的方法:有人说设session.timeout=-1,或小于0的数。这种方法肯定是不行的,session计算时间以分钟为单位,必须是大于等于1的整数。又有人说设session.timeout=99999。这种同样不行,session有最大时间限制。我经过测试发现最大值为24小时,也就是说你最大可以session.timeout=1440,1441都是不可以有,呵呵。本人测试环境:

    2022年7月16日
  • 购买虚拟服务器(服务器与虚拟服务器)

    【新挑战】十二职业虚拟机整合一键端图文架设修改教程封面.jpg(62.69KB,下载次数:19)2019-5-2119:52上传十几年前的视频没有高清的,那时候觉得妹纸很漂亮,不过唱的就…原来游戏里可以开播放器有这歌,很燃很暴力【游戏设置】源端只有服务端没有配套客户端,所以我整合了一个能用的客户端,但不是很匹配,任务可以接不能完成支持64位WIN7\WIN10整合服务端,虚拟机一键…

    2022年4月11日
  • 网关 gateway_gateway网关集群

    网关 gateway_gateway网关集群GateWay网关管理GateWayCloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关;但在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关替代Zuul,那就是SpringCloudGatewayGateway是在Spring生态系统之上构建的API网关服务,基于Spring5,SpringBoot2和ProjectReactor等技术。Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤

    2022年10月11日
  • c语言中的异或运算_java中的异或运算符

    c语言中的异或运算_java中的异或运算符今天看到一位大神的博客,深受感触。决定也发一篇博客,证明一下我还活着。于是我翻看以前学习时做的一些笔记,整理了一下,得到了一个关于异或运算交换变量变量值的笔记。首先来看下面三组表达式,看起来他们都能实现交换两个变量的值。a=a^b;b=a^b;a=a^b;a=a^(b=b^(a=a^b));a^=b^=a^=b;可实际的情况是,前面2组表…

    2022年9月27日
  • C#中DllImport用法汇总

    最近使用DllImport,从网上google后发现,大部分内容都是相同,又从MSDN中搜集下,现将内容汇总,与大家分享。大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码

    2022年4月9日
  • 4.pycharm添加第三方库[通俗易懂]

    4.pycharm添加第三方库[通俗易懂]网络爬虫的第一步就是根据URL,获取网页的HTML信息。在Python3中,可以使用urllib.request和requests进行网页爬取。(1)准备所需库我们需要准备一款名为BeautifulSoup(网页解析)的开源库,用于对下载的网页进行解析,我们是用的是PyCharm编译环境所以可以直接下载该开源库。urllib库是python内置的,无需我们额外安装,只要安装了Python就可以使用这个库。requests库是第三方库,需要我们自己安装。第三方库安装步骤如下:选择File-&g

    2022年8月29日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号