Java中的WeakHashMap简析

 更新时间:2023年09月06日 09:16:10   作者:JFS_Study  
这篇文章主要介绍了Java中的WeakHashMap简析,Map 的子类常见的有 HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 等,WeakHashMap,直译就是,虚弱的 HashMap,从名字可得知其和 HashMap 有关,需要的朋友可以参考下

一、什么是 WeakHashMap

Map 的子类常见的有 HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 等。

WeakHashMap,直译就是:虚弱的 HashMap。

从名字可得知其和 HashMap 有关,确实如此,WeakHashMap 功能几乎和 HashMap 一致。

Weak,联想java.lang.ref包下的弱引用(WeakReference),由此这里面还牵扯到了一种弱引用结构。

二、HashMap 和 WeakHashMap 的区别

先看下 WeakHashMap 和 HashMap 中单个对象的组成:

WeakHashMap.Entry 和 HashMap.Node 的不同点在于,WeakHashMap.Entry 继承了WeakReference

弱引用的生存期特别短。垃圾回收的时候,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。

想象一下如下场景:

  1. 调用两次 size():第一次为 10,第二次就为 8 了。
  2. 两次调用 isEmpty():第一次返回 false,第二次返回 true。
  3. 两次调用 containsKey():第一次返回 true,第二次返回 false。
  4. 两次调用 get():第一次返回一个 value,第二次返回 null。

三、使用场景

在如今的并发泛滥的大环境下,大家应该都用过缓存,缓存都是放在内存中的,而内存几乎是计算机中最宝贵也是最稀缺的资源,所以需要谨慎的使用,不然很容易就出现 OOM。

缓存的主要作用是为了更快的处理业务、降低服务器的压力,那么就要保证缓存命中率,这里假设整个缓存是一个 key-value 结构的(以键值对缓存为例),HashMap 作为强引用对象在没有主动将 key 删除时是不会被 JVM 回收的,这样 HashMap 中的对象就会越积越多直到 OOM 错误;

那么如何做到既让缓存的命中率高又不占用那么多的内存,这里就可以采用 WeakHashMap,当然不会有 HashMap 100% 的命中率(假设内存足够),但是在保证程序正常的前提下更好的实现了缓存这套解决方案。

WeakHashMap 内部是通过弱引用来管理 Entry 的,弱引用的特性对应到 WeakHashMap 上意味着什么呢?

将一对 key-value 放入到 WeakHashMap 里并不能避免该 key 值被 GC 回收(除非在 WeakHashMap 之外还有对该 key 的强引用),故内存问题也可以解决。

到此这篇关于Java中的WeakHashMap简析的文章就介绍到这了,更多相关Java的WeakHashMap内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GraphQL入门总体创建教程

    GraphQL入门总体创建教程

    这篇文章主要为大家介绍了GraphQL入门总体创建教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • springmvc处理模型数据Map过程解析

    springmvc处理模型数据Map过程解析

    这篇文章主要介绍了springmvc处理模型数据Map过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java禁止使用finalize方法

    Java禁止使用finalize方法

    这篇文章主要介绍了Java禁止使用finalize方法,需要的朋友可以参考下
    2017-10-10
  • Java自定义线程池的实现示例

    Java自定义线程池的实现示例

    本文主要介绍了Java自定义线程池的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java使用UTF-8或GBK编码后还是乱码问题的解决办法

    Java使用UTF-8或GBK编码后还是乱码问题的解决办法

    在java中处理字符时,经常会发生乱码,下面这篇文章主要给大家介绍了关于Java使用UTF-8或GBK编码后还是乱码问题的解决办法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 配置tjxCold(idea效率插件)的模版教程详解

    配置tjxCold(idea效率插件)的模版教程详解

    这篇文章主要介绍了配置tjxCold(idea效率插件)的模版教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • java8中定时任务最佳实现方式(实现原理)

    java8中定时任务最佳实现方式(实现原理)

    这篇文章主要介绍了java8中定时任务最佳实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-12-12
  • Java Agents代理是什么

    Java Agents代理是什么

    Java代理Agents通过提供使我们能够侵入JVM中正在运行的Java程序的服务,在最底层工作。Java的这一强大但不可思议的部分具有在错误操作时使JVM崩溃的能力。本文简要介绍了这个概念,并介绍了它的工作原理。需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • Java线程组操作实例分析

    Java线程组操作实例分析

    这篇文章主要介绍了Java线程组操作,结合实例形式分析了ThreadGroup类创建与使用线程组相关操作技巧,需要的朋友可以参考下
    2019-09-09
  • Java实现图片淡入淡出效果

    Java实现图片淡入淡出效果

    在现代图形用户界面和游戏开发中,**图片淡入淡出(Fade In/Out)**是一种常见且实用的视觉过渡效果,它可以用于启动画面、场景切换、轮播图、提示框弹出等场景,通过本项目,您将全面了解 Java 上实现淡入淡出效果的各个要点,需要的朋友可以参考下
    2025-05-05

最新评论