Java面试八股之WeakHashMap的工作原理

  1. 简述WeakHashMap的工作原理

弱键(Weak Keys):

WeakHashMap 的键(keys)是通过 WeakReference 弱引用进行封装的。弱引用是一种特殊的引用类型,它不会阻止所引用的对象被垃圾收集器回收。这意味着,如果一个键对象除了作为 WeakHashMap 的键之外没有任何强引用指向它,那么在进行垃圾回收时,这个键对象可以被当作垃圾回收,即使它还在 WeakHashMap 中。

键值对存储:

WeakHashMap 内部采用类似于 HashMap 的数据结构来存储键值对,即一个哈希表(数组加链表/红黑树)结构。每个键值对(Entry)被封装在一个 Entry 对象中,其中键是通过 WeakReference 引用的,而值则是直接引用的。这样设计使得值的生命周期不受键的影响,即使键被垃圾回收,只要还有其他强引用持有值,值本身不会被回收。

引用队列(ReferenceQueue):

当 WeakHashMap 创建键值对时,不仅为键创建了一个 WeakReference,还将其关联到一个 ReferenceQueue 上。当键对象因为没有其他强引用而被垃圾收集器回收时,其对应的 WeakReference 将被添加到这个引用队列中。

自动清理机制:

WeakHashMap 在进行诸如 get()、put() 等操作时,会检查引用队列中是否有被回收的键的 WeakReference。如果有,说明相应的键值对已经失去了键的引用,此时 WeakHashMap 会从内部哈希表中移除对应的 Entry,释放相关资源。这个过程通常称为“清理”或“整理”。

操作与同步:

与 HashMap 类似,WeakHashMap 的基本操作(如 put()、get()、remove())遵循类似的时间复杂度,即平均情况下接近 O(1),最坏情况下 O(n)。由于清理操作涉及到内部数据结构的修改,因此在多线程环境下,对 WeakHashMap 的操作通常需要适当的同步控制,尽管在 Java 8 及之后版本,JDK 提供了并发友好的 ConcurrentHashMap,但在某些特定场景下,开发者仍可能选择使用 WeakHashMap 并自行管理同步。

 如果大家需要视频版本的讲解,欢迎关注我的B站:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/630057.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器人操作系统ROS2学习—控制小海龟运动

将Ubuntu系统和ROS2安装完成后,就可以进行调用小海龟运动了。 一、打开Ubuntu系统后,调用终端窗口。有3 种方法可以打开启动终端: 1、通过快捷键CtrAItT; 2、桌面左下角有个显示应用的菜单,点击后找到终端“Terminal”图标,打…

kubernetes二进制多master部署

文章目录 一、master02 节点部署(在上期博客部署完成的情况下)1、准备master02节点需要的文件2、修改配置文件kube-apiserver中的IP3、启动各服务并设置开机自启4、查看node节点状态 二、负载均衡部署1、配置load balancer集群双机热备负载均衡1.1 准备n…

英飞凌SiC模块为小米电动车提供动力

至2027年之际,SiC功率模块与裸片产品将荣耀登场,助力小米电动汽车新品SU7璀璨问世。英飞凌,这家业界翘楚,将倾其所能,为小米SU7 Max提供两颗HybridPACK Drive G2 CoolSiC 1200 V模块,如同给电动汽车的心脏注…

万字长文破解 AI 图片生成算法-Stable diffusion (第一篇)

想象一下:你闭上眼睛,脑海中构思一个场景,用简短的语言描述出来,然后“啪”的一声,一张栩栩如生的图片就出现在你眼前。这不再是科幻小说里才有的情节,而是Stable Diffusion——一种前沿的AI图片生成算法—…

OpenHarmony 实战开发——ArkUI容器类API介绍

容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法。在 ArkUI 开发框架中,容器类采用了类似静态的语言来实现,并通过 NAPI 框架对外提供。通过对存储位置以及属性的限制&#x…

Signal 即将成为JavaScript的一部分

什么是响应性? 在过去的几年中,响应性成为了所有现代前端框架以及React库的核心。 对于不熟悉前端开发的人来说,起初这可能是一个令人困惑的概念,因为它改变了常规的、自上而下的、从调用者到被调用者的顺序工作流。 在响应性范…

OpenAI春季发布会速览,盘点近30天AI大事件

OpenAI发布会速览 北京时间5月14日凌晨1点,OpenAI在官网举行了"春季更新"活动,推出了全新的旗舰模型“GPT-4o”, 这款模型具备处理文本、图片、视频、语音的全能处理能力,能实时响应用户需求,并进行语音回应…

Altium Designer封装库和元器件符号库下载与导入教程(SnapEDA 、Ultra Librarian、Alldatasheetcn)

1.AD封装库和元器件符号库下载网址 以下是一些全球热门的Altium Designer封装库和元器件符号库下载网址推荐: Altium Content Vault (现称为Altium Manufacturer Part Search):这是Altium官方提供的元器件库,可以直接在Altium Designer中使用…

腾讯开源混元DiT文生图模型,消费级单卡可推理

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备面试攻略、面试常考点等热门话题进行了深入的讨论。 总结链接…

层次式体系结构概述

1.软件体系结构 软件体系结构可定义为:软件体系结构为软件系统提供了结构、行为和属性的高级抽象,由构成系统的元素描述、这些元素的相互作用、指导元素集成的模式以及这些模式的约束组成。软件体系结构不仅指定了系统的组织结构和拓扑结构,并…

速度与激情:Redis如何以核心数据结构驱动极致性能

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达! 引言 Redis是一个开源的内存数据结构存储系统,它支持多种类型的数据结构,如字符串、散列、列表、集合、有序集合等。Redis以其出色的性能和低延迟特性而闻名&#xf…

最小质数对-第12届蓝桥杯国赛Python真题解析

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第63讲。 最小质数对&#…

【软考】模拟考卷错题本2024-05-14

1 活动图-计算时间差 审题,第几天~选的3、10是结束了上一次的活动并未开始呢 !所以记得按照正常的语序表达哦! 2 队列-算长度 代入法,设计一个开始为0,结尾为9 ,容量为10即M的队列;带入计算当前…

【车载开发系列】AutoSar中的Port

【车载开发系列】AutoSar中的Port 一. Port概念 AutoSAR 接口定义了 SWC 之间、BSW 模块之间以及 SWC 和 BSW 模块之间交互的信息。AutoSAR 接口通过 SWC 和/或 BSW 模块端口(Port)的形式实现。通过这些端口,SWC 和 BSW 模块之间实现了数据…

MYSQL SQL3

1.DCL:Global level 所有库,所有表的权限 Database level:某个数据库中所有表的权限 Table level: 库中某个表的权限 Column level:表中的某个字段的权限 管理:创建用户create user 用户名localhost(ip地址,“%”除了本机登录其他的都可以登录…

iOS ------ 多线程基础

一,进程和线程 1,进程 定义: 进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专有的且受保护的内存进程是系统进行资源分配和调度的一个独立单位 补充:iOS系统是相对封闭的系统&a…

(C语言)队列实现与用队列实现栈

目录 1.队列 1.1队列的概念及结构 1.2 队列的实际应用联想 1.3队列的实现 2. 队列应用——队列实现栈 主要思路 1.队列 1.1队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进…

内网渗透瑞士军刀-impacket工具解析(二)

impacket工具解析之Kerberos认证协议 上一期我们介绍了impacket中ntlm协议的实现,在Windows认证中除了使用ntlm认证,还支持Kerberos认证协议,Kerberos认证也是Windows 活动目录中占比最高的认证方式。 什么是Kerberos协议? Kerb…

什么?你设计接口什么都不考虑?

如果让你设计一个接口,你会考虑哪些问题? 1.接口参数校验 接口的入参和返回值都需要进行校验。 入参是否不能为空,入参的长度限制是多少,入参的格式限制,如邮箱格式限制 返回值是否为空,如果为空的时候是…

第 397 场 LeetCode 周赛题解

A 两个字符串的排列差 模拟&#xff1a;遍历 s s s 记录各字符出现的位置&#xff0c;然后遍历 t t t 计算排列差 class Solution {public:int findPermutationDifference(string s, string t) {int n s.size();vector<int> loc(26);for (int i 0; i < n; i)loc[s…