什么是WeakHashMap--转
原文地址:http://laravel.iteye.com/blog/2303244
Java WeakHashMap 到底Weak在哪里,它真的很弱吗?WeakHashMap 的适用场景是什么,使用时需要注意些什么?弱引用和强引用对Java GC有什么不同影响?本文将给出清晰而简洁的介绍。
总体介绍
在Java集合框架系列文章的最后,笔者打算介绍一个特殊的成员:WeakHashMap,从名字可以看出它是某种 Map。它的特殊之处在于 WeakHashMap 里的entry
可能会被GC自动删除,即使程序员没有调用remove()
或者clear()
方法。
更直观的说,当使用 WeakHashMap 时,即使没有显示的添加或删除任何元素,也可能发生如下情况:
- 调用两次
size()
方法返回不同的值;- 两次调用
isEmpty()
方法,第一次返回false
,第二次返回true
;- 两次调用
containsKey()
方法,第一次返回true
,第二次返回false
,尽管两次使用的是同一个key
;- 两次调用
get()
方法,第一次返回一个value
,第二次返回null
,尽管两次使用的是同一个对象。
遇到这么奇葩的现象,你是不是觉得使用者一定会疯掉?其实不然,WeekHashMap 的这个特点特别适用于需要缓存的场景。在缓存场景下,由于内存是有限的,不能缓存所有对象;对象缓存命中可以提高系统效率,但缓存MISS也不会造成错误,因为可以通过计算重新得到。
要明白 WeekHashMap 的工作原理,还需要引入一个概念:弱引用(WeakReference)。我们都知道Java中内存是通过GC自动管理的,GC会在程序运行过程中自动判断哪些对象是可以被回收的,并在合适的时机进行内存释放。GC判断某个对象是否可被回收的依据是,是否有有效的引用指向该对象。如果没有有效引用指向该对象(基本意味着不存在访问该对象的方式),那么该对象就是可回收的。这里的“有效引用”并不包括弱引用。也就是说,虽然弱引用可以用来访问对象,但进行垃圾回收时弱引用并不会被考虑在内,仅有弱引用指向的对象仍然会被GC回收。
WeakHashMap 内部是通过弱引用来管理entry
的,弱引用的特性对应到 WeakHashMap 上意味着什么呢?将一对key, value
放入到 WeakHashMap 里并不能避免该key
值被GC回收,除非在 WeakHashMap 之外还有对该key
的强引用。
关于强引用,弱引用等概念以后再具体讲解,这里只需要知道Java中引用也是分种类的,并且不同种类的引用对GC的影响不同就够了。
具体实现
WeakHashMap的存储结构类似于HashMap,读者可自行参考前文,这里不再赘述。
关于强弱引用的管理方式,博主将会另开专题单独讲解。
Weak HashSet?
如果你看过前几篇关于 Map 和 Set 的讲解,一定会问:既然有 WeekHashMap,是否有 WeekHashSet 呢?答案是没有:( 。不过Java Collections工具类给出了解决方案,Collections.newSetFromMap(Map<E,Boolean> map)
方法可以将任何 Map包装成一个Set。通过如下方式可以快速得到一个 Weak HashSet:
Set<Object> weakHashSet = Collections.newSetFromMap(
new WeakHashMap<Object, Boolean>());
不出你所料,newSetFromMap()
方法只是对传入的 Map做了简单包装:
public static <E> Set<E> newSetFromMap(Map<E, Boolean> map) {
return new SetFromMap<>(map);
}
private static class SetFromMap<E> extends AbstractSet<E>
implements Set<E>, Serializable
{
private final Map<E, Boolean> m; // The backing map
private transient Set<E> s; // Its keySet
SetFromMap(Map<E, Boolean> map) {
if (!map.isEmpty())
throw new IllegalArgumentException("Map is non-empty");
m = map;
s = map.keySet();
}
public void clear() { m.clear(); }
public int size() { return m.size(); }
public boolean isEmpty() { return m.isEmpty(); }
public boolean contains(Object o) { return m.containsKey(o); }
public boolean remove(Object o) { return m.remove(o) != null; }
public boolean add(E e) { return m.put(e, Boolean.TRUE) == null; }
public Iterator<E> iterator() { return s.iterator(); }
public Object[] toArray() { return s.toArray(); }
public <T> T[] toArray(T[] a) { return s.toArray(a); }
public String toString() { return s.toString(); }
public int hashCode() { return s.hashCode(); }
public boolean equals(Object o) { return o == this || s.equals(o); }
public boolean containsAll(Collection<?> c) {return s.containsAll(c);}
public boolean removeAll(Collection<?> c) {return s.removeAll(c);}
public boolean retainAll(Collection<?> c) {return s.retainAll(c);}
// addAll is the only inherited implementation
}
转载于:https://www.cnblogs.com/davidwang456/p/5564023.html
什么是WeakHashMap--转相关推荐
- java weakhashmap用法_Java WeakHashMap指南
概述 在这篇文章中,我们将探索 java.util 包中的WeakHashMap. 为了理解数据结构,我们将在这里使用它来推出一个简单的缓存实现.但是,请记住,这是为了了解地图的工作原理,并且创建自己 ...
- java 弱引用 集合_java 弱引用集合类WeakHashMap
java 弱引用集合类WeakHashMap Java集合框架中的WeakHashMap类是Map接口的一种特殊实现.它实现了Map接口,继承了AbstractMap抽象类.它实现了对key的弱引用. ...
- WeakHashMap和四种引用总结:
WeakHashMap 当一个键对象被GC(垃圾回收)回收时,响应的值对象的引用从map中删除,WeakHashMap能节约存储空间,来实现缓存那些非必要的数据 四种类型的引用: 强运用(Srtron ...
- 045_引用分类和WeakHashMap
一. 引用分类 1. 强引用: StrongReference, 引用指向对象, gc(Garbage collection)运行时不回收对象. 2. 软引用: SoftReference, gc(G ...
- LinkedHashMap 实现缓存(LRU、FIFO、weakhashMap)
原文地址:https://www.jianshu.com/p/c627a30cf14a 在文中使用了LinkedHashMap实现了LRU和FIFO缓存机制.实际上在LinkedHashMap的设计上 ...
- 浅谈WeakHashMap
Java WeakHashMap 到底Weak在哪里,它真的很弱吗?WeakHashMap 的适用场景是什么,使用时需要注意些什么?弱引用和强引用对Java GC有什么不同影响?本文将给出清晰而简洁的 ...
- Java集合框架:WeakHashMap
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- WeakHashMap垃圾回收原理
介绍 WeakHashMap自然联想到的是HashMap.确实,WeakHashMap与HashMap一样是个散列表,存储内容也是键值对.与HashMap类似的功能就不展开了,本文重点关注在WeakH ...
- WeakHashMap和Java引用类型详细解析
WeakHashMap是种弱引用的HashMap,这是说,WeakHashMap里的key值如果没有外部强引用,在垃圾回收之后,WeakHashMap的对应内容也会被移除掉. 1.1 Java的引用类 ...
- weakhashmap_Java WeakHashMap values()方法与示例
weakhashmap WeakHashMap类values()方法 (WeakHashMap Class values() method) values() method is available ...
最新文章
- java icomparer_集合数据处理(C#、JavaScript 和 Java)
- SQL Server数据库备份的镜像
- 虚拟化(8)_Docker容器
- 批量删除Excel文档中的超链接
- 函数或变量 rtenslearn_c 无法识别_深度学习的数学-卷积神经网络的结构和变量关系...
- hanlp源码解析之中文分词算法
- 字节跳动java一共几面_字节跳动Java面经(已offer)
- SQL Server 日期函数
- NES模拟器[H_NES]
- Unity编辑器扩展——撤回
- 003-Xshell和Xftp连接CentOS
- 中国计算机学会高级会员资格,专业会员申请高级会员流程
- 小米手机如何更换铃声和微信提示音
- 力学知识点提要(上)
- Hyper-V新建Windows7虚拟机
- 移动端用户放大字体导致样式出问题
- Android第三方库收藏汇总
- 【Alpha版本】冲刺阶段 - Day7 - 靠泊
- C# 编译 与 CLR
- 记frp内网穿透配置
热门文章
- cron表达式 每天0点10分和30分_“提前2小时下班”:学会这10个函数,办公效率提升了10倍!...
- python黑色背景编辑器_如何更换python默认编辑器的背景色
- abaqus单位怎么设置_ABAQUS-怎样模拟塑料瓶的抗挤压能力?
- VS中查看子类对象内存分布的方法
- h5软盘占位把定位内容往上顶_安徽省计算机一级考试选择题、操作题、打字题库2012年上半年版.xls...
- vue 高德地图多边形_Vue + 高德地图画矢量图
- 安卓:安卓工程构建及第一个安卓程序运行
- php语言三个数从小到大排序,求教输入5个数,从小到大排序 的C语言程序?
- 机器学习——梯度下降算法
- unity 给图片边缘_Unity Shader 屏幕后效果——边缘检测