当前位置: 首页 > news >正文

java哈希映射干什么的,java 弱哈希映射表WeakHashMap原理

弱哈希映射表的原理其實很好理解,首先我們要知道HashMap的原理。如果我們將一個對象a以及他的引用A作為一個key值關聯某個Value值后put入HashMap中,那么這個a對象的引用不僅僅有A,而且有一個HashMap中持有的引用,一共兩個引用。WeakHashMap的原理也相同,此時在WeakHashMap中的a也持有兩個引用,一個是A,另一個是WeakHashMap的散列表持有的引用。

那么現在分析弱哈希映射表的原理:WeakHashMap散列表持有所有key的引用是弱引用。弱引用的概念是:如果一個對象僅有一個弱引用指向它,那么在下次GC進行回收時會將其回收。所以說,上述的a對象,如果A引用不再指向它,而且也沒有其他的地方使用到a對象形成它的引用的話,在下一次垃圾回收時a對象表示的k-v對將被從WeakHashMap中刪除。

下面的例子表示當A變為null時,WeakHashMap中的a被回收:package Test;

import java.util.*;

public class test {

public static void main(String[] args) throws Exception {

String a = new String("a");

Map weakmap = new WeakHashMap();

weakmap.put(a, "aaa");

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中的a已經被回收。

下面例子表示當A變為null時,但是HashMap中仍然保存着a的一個引用,不能滿足回收條件,WeakHashMap中的a不被回收:package Test;

import java.util.*;

public class test {

public static void main(String[] args) throws Exception {

String a = new String("a");

Map weakmap = new WeakHashMap();

Map map = new HashMap();

map.put(a, "aaa");

weakmap.put(a, "aaa");

//map.remove(a);

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:a:aaa

如果我們將上面代碼中的注釋行:map.remove(a);加入其中,那么最后會沒有任何輸出,因為HashMap中保存着a的最后一個非弱引用,如果此引用也被刪除則a被回收。

相关文章:

  • Java多线程Jdbc,java - jdbctemplate.batchupdate是多线程还是并发? - 堆栈内存溢出
  • 微软禇诚云:软件安全漏洞与软件开发
  • php怎么将二维数组倒置,如何在PHP中旋转二维数组90度
  • php小项目实例试题,lamp小项目实施题目及参考答案
  • 中移动为何惧怕Nokia和iPhone
  • 男人30学php,科学网—男人30岁之前要学的16件事 - 刘石泉的博文
  • php动态远吗怎么修改,PHP动态修改GD库扩展问题
  • 猫扑视频未被处罚,此猫扑非彼猫扑
  • php解json字符串,如何解码PHP中的JSON字符串?
  • 吴石:几种软件缺陷的可能利用方法
  • oracle表如何用函数,利用函数返回oracle对象表的三种方法
  • 吴鲁加:企业如何进行数据安全防御
  • oracle普通用户提权,oracle 10g 漏洞--低权限用户提权方法
  • oracle 输出到output,[20190603]关于dbms_output输出问题.txt
  • 微软安全服务提供专家方兴:Web2.0安全研究
  • 07.Android之多媒体问题
  • js正则,这点儿就够用了
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Node 版本管理
  • Promise初体验
  • Python语法速览与机器学习开发环境搭建
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Shell编程
  • TypeScript迭代器
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue-router的history模式发布配置
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 从重复到重用
  • 多线程事务回滚
  • 给Prometheus造假数据的方法
  • 给新手的新浪微博 SDK 集成教程【一】
  • 基于 Babel 的 npm 包最小化设置
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 聚类分析——Kmeans
  • 免费小说阅读小程序
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 我是如何设计 Upload 上传组件的
  • 异步
  • 异常机制详解
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • AI算硅基生命吗,为什么?
  • Mac 上flink的安装与启动
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #13 yum、编译安装与sed命令的使用
  • #QT(TCP网络编程-服务端)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (4)(4.6) Triducer
  • (k8s中)docker netty OOM问题记录
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot码头作业管理系统 毕业设计 341654