WeakHashMap使用弱引用来作为Map的Key,利用虚拟机的垃圾回收机制能自动释放Map中没有被使用的条目。但是WeakHashMap释放条目是有条件的:首先条目的Key在系统中没有强引用指向;另外,条目的释放是在垃圾回收之后第一次访问这个WeakHashMap时完成的。

而当我们想要获取一个Integer对象时,为了利用Integer类本身的缓存,减少堆中Integer对象的重复申请和释放,我们通常会采用Ingeter.valueOf(int)方法来获取Integer对象,而不是直接使用new Integer(int)。 Integer类会将0~127的整数对象缓存在一个Map中,而这个Map中保存的是这些Integer对象的强引用,如果我们想要使用Integer作为WeakHashMap的Key,那就需要注意不能再使用Integer.valueOf(int)方法获取WeakHashMap中Key的对象,否则所有以0~127作为Key的条目不会被自动释放。

下面一段代码比较了三种方式获取到的Integer对象分别作为WeakHashMap的Key的区别,三种方式分别是:1.使用Integer.valueOf(int);2.使用new Integer(int);3.使用Java的自动装箱。

public static void main(String[] args) {
// TODO Auto-generated method stub
Map<Integer, String> wmap = new WeakHashMap<Integer, String>();
for(int i = 0; i <= 160; i += 20){
wmap.put(Integer.valueOf(i), "" + i);
} System.out.println("Before GC1: ");
System.out.println(wmap);
System.gc();
System.out.println("After GC1: ");
System.out.println(wmap); wmap.clear();
for(int i = 0; i <= 160; i += 20){
wmap.put(new Integer(i), "" + i);
}
System.out.println("Before GC2: ");
System.out.println(wmap);
System.gc();
System.out.println("After GC2: ");
System.out.println(wmap); wmap.clear();
for(int i = 0; i <= 160; i += 20){
wmap.put(i, "" + i);
}
System.out.println("Before GC3: ");
System.out.println(wmap);
System.gc();
System.out.println("After GC3: ");
System.out.println(wmap); }

运行结果如下:

Before GC1:
{120=120, 60=60, 160=160, 40=40, 140=140, 80=80, 20=20, 100=100, 0=0}
After GC1:
{120=120, 60=60, 40=40, 80=80, 20=20, 100=100, 0=0}
Before GC2:
{120=120, 60=60, 160=160, 40=40, 140=140, 80=80, 20=20, 100=100, 0=0}
After GC2:
{}
Before GC3:
{120=120, 60=60, 160=160, 40=40, 140=140, 80=80, 20=20, 100=100, 0=0}
After GC3:
{120=120, 60=60, 40=40, 80=80, 20=20, 100=100, 0=0}

  可以看到第一种方式使用Integer.valueOf(int)得到的Key,垃圾回收之后只释放了140和160两个条目,128一下都仍然保留;使用new Integer(int)得到的Key垃圾回收之后全部被释放。值得注意的是,我们利用自动装箱得到的Integer对象和使用Integer.valueOf(int)结果一样,说明自动装箱也会利用Integer类的缓存。在使用Integer或类似的存在缓存的对象作为WeakHashMap的Key的时候,一定要注意对象缓存中对Key对象是否存在无法释放的强引用,否则WeakHashMap自动释放不使用条目的效果无法达到。

Integer做WeakHashMap的Key应注意的问题的更多相关文章

  1. 不要使用Integer做HashMap的key,尤其在json序列化的时候

    使用redisson cache来实现一个缓存功能,缓存省市县的名称,key是区域编码,integer,value是name.结果取的时候,怎么都取不出. Map<Integer, String ...

  2. 指针做MAP的KEY的TEST

    用struct做map的key会需要"operator <"等等,还会出现奇怪的问题可能. 试了下用指针做key,看看效果: #include <iostream> ...

  3. nodejs以对象做对象的key导致value一直被覆盖

      问题描述 在开发中,实现技能状态的事件监听功能时,将状态对象作为key,存入事件管理器的监听列表,如下图: 实现后,运行程序,并没有报错,但是当某个事件发生时,只有一个状态被触发监听,而大多数状态 ...

  4. 使用 HttpWebRequest 类做 POST 请求没有应反

    这几天给系统做第三方集成, 需要调用另一个软件的一个接口, 通过 HTTP 的方式调用,调用代码也挺简单的: string serviceUrl = string.Format("{0}/{ ...

  5. 集合框架之Map接口

    Map是将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. Map 接口提供三种collection视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序定 ...

  6. 201521123074 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 Q1.List中指定元素的删除(题目4-1) 1.1 实验总结 用Arrar ...

  7. java使用Map做缓存你真的用对了吗?弱引用WeakHashMap了解一下

    目录 关于缓存我们应该考虑什么?-intsmaze WeakHashMap弱引用-intsmaze 线程安全问题-intsmaze Collections-intsmaze ThreadLocal-i ...

  8. JAVA提高十九:WeakHashMap&EnumMap&LinkedHashMap&LinkedHashSet深入分析

    因为最近工作太忙了,连续的晚上支撑和上班,因此没有精力来写下这篇博客,今天上午正好有一点空,因此来复习一下不太常用的集合体系大家族中的几个类:WeakHashMap&EnumMap&L ...

  9. SQLite做为本地缓存的应用需要注意的地方

    原文:SQLite做为本地缓存的应用需要注意的地方 今天看到了园友陆敏计的一篇文章<<C#数据本地存储方案之SQLite>>, 写到了SQLite的诸多优点,尤其适应于本地数据 ...

随机推荐

  1. lintcode :数组剔除元素后的乘积

    题目: 数组剔除元素后的乘积 给定一个整数数组A. 定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法. 样例 给出 ...

  2. *[topcoder]TheMatrix

    http://community.topcoder.com/stat?c=problem_statement&pm=13035 矩阵棋盘的题,比较典型.可以定两条column夹住,然后上下扫, ...

  3. 【Linux高频命令专题(2)】awk

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  4. sqlserver防止数据库挂马新尝试

    想法不错,放着以后应该会有用 网站挂马非常让人头痛,每次的安全措施都是治标不治本,想找到根本原因,只能去分析你的程序源代码,由于很多网站不是一个程序员开发,很多的注入漏洞很难发现,曾经通过公共文件加入 ...

  5. C#6.0 VS2015

    https://msdn.microsoft.com/en-us/library/hh156499(v=vs.140).aspx This page lists key feature names f ...

  6. Ubuntu使用总结

    错误 鼠标闪烁解决 系统设置->显示—>未知显示器->关闭->应用->选择当前配置 提示sudo: unable to resolve host ,亦即无法解析主机. 原 ...

  7. git push default

    今天使用git push的时候出现了如下提示: warning: push.default is unset; its implicit value is changing in Git 2.0 fr ...

  8. 3D开发--CopperCube

    CopperCube的常用接口,以及如何用javascript语言控制场景中的人物动作,或者获取任务的位置等信息

  9. Qt之QTableView添加复选框(QAbstractItemDelegate)

    简述 上节分享了使用自定义模型QAbstractTableModel来实现复选框.下面我们来介绍另外一种方式: 自定义委托-QAbstractItemDelegate. 简述 效果 QAbstract ...

  10. 04day2

    中位数 排序 [问题描述] 给出 1~n 的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是 b.中位数是指把所有元素从小到大排列后,位于中间的数.n<=100000 [输入] 第一 ...