WeakHashMap-阿里云开发者社区

开发者社区> 技术mix呢> 正文

WeakHashMap

简介:
+关注继续查看

WeakHashMap
今天在具体业务的时候看到HashMap和WeakHashMap的区别。因为PHP语言并没有这种概念。所以很好奇做了一下研究。

WeakHashMap
WeakHashMap所谓的“弱”是针对GC来说的。换句话说,GC操作的时候,会不会自动去回收掉WeakHashMap中已经没有被引用的数据?它的规则是这样的:如果WeakHashMap中的key是一个变量,并且这个变量没有被引用了。那么这个时候,系统gc的时候,就会把这个没有引用的HashMap的key,value删除。

具体看下面的代码:

/*

  • To change this license header, choose License Headers in Project Properties.
  • To change this template file, choose Tools | Templates
  • and open the template in the editor.
    */

package com.mycompany.demo;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.WeakHashMap;

/**
*

  • @author yejianfeng
    */

public class hashmap {

public static void main(String[] args){
    String a = new String("a");  
    String b = new String("b");  
    Map weakmap = new WeakHashMap();  

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

    a=null;  

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

    }  
}  

}
上面的只是把a对象去掉引用,就相当于告诉gc可以进行回收了。

WeakHashMap中的具体Entry实现了WeakReference的接口,在put数据进入HashMap的时候把queue传递进去了。ReferenceQueue是WeakHashMap创建的一个Reference队列。当gc回收Entry的key的时候,就会把消息通知到这个队列中,然后这个hash就知道了这个key被删除了,同时就会把这个key对应的Entry进行删除了。

本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/7413236.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用注解开发| 学习笔记
快速学习 使用注解开发
17 0
案例_点菜| 学习笔记
快速学习案例_点菜
13 0
我为什么要放弃 RESTful,选择拥抱 GraphQL
REST作为一种现代网络应用非常流行的软件架构风格,自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性,可扩展性,伸缩性受到广大Web开发者的喜爱。
3 0
这样统计代码执行耗时,才足够优雅!
代码耗时统计在日常开发中算是一个十分常见的需求,特别是在需要找出代码性能瓶颈时。 可能也是受限于 Java 的语言特性,总觉得代码写起来不够优雅,大量的耗时统计代码,干扰了业务逻辑。特别是开发功能的时候,有个感受就是刚刚开发完代码很清爽优雅,结果加了一大堆辅助代码后,整个代码就变得臃肿了,自己看着都挺难受。因此总想着能不能把这块写的更优雅一点,今天本文就尝试探讨下“代码耗时统计”这一块。
6 0
Slf4j 包老冲突,每次排查半天,是什么原因?怎么解决?
一、前言 在进行 Java 开发时,通常我们会选择 Slf4j 作为日志门面,但日志实现却不尽相同。如果系统运行中同时存在多个日志实现,就会出现类似下图的 Warning。
7 0
Google 开源的依赖注入库,比 Spring 更小更快!
Guice是Google开源的一个依赖注入类库,相比于Spring IoC来说更小更快。Elasticsearch大量使用了Guice,本文简单的介绍下Guice的基本概念和使用方式。
9 0
听说 Spring AOP 有坑?那就来踩一踩
前言 前几日,有朋友分享了这样一个案例: 原来的项目一直都正常运行,突然
5 0
我为什么要放弃 RESTful,选择拥抱 GraphQL
REST作为一种现代网络应用非常流行的软件架构风格,自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性,可扩展性,伸缩性受到广大Web开发者的喜爱。
5 0
【保姆级教程】Spring Boot 单元测试
【保姆级教程】Spring Boot 单元测试 一、 单元测试的概念 概念: \1. 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。在Java中单元测试的最小单元是类。
6 0
+关注
2969
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载