java dispose null_Java Map释放内存置null以及调用clear()的区别
Map map = new HashMap<>();
首先,在创建一个map对象时,map指向堆中新创建的对象,这时候的map是一个没有key和value的空对象。众所周知,
map.hashCode()某种意义上相当返回了对象的地址。所以在用刚创建的map对象调用hashCode()方法:
System.out.println("map.hashCode:"+map.hashCode());
输出结果如下:
再看看hashCode()的源码:
通过源码可以发现,hashCode()方法通过获取key和value返回的哈希值进行异或运算后返回结果值,如果key和value值为空则返
回0。此时我们给map对象put值进去,然后再输出一个hashCode()返回的值:
map.put(1,"霍去病");
map.put(2,"李广");
map.put(3,"刘彻");
map.put(4,"马邑");
map.put(5,"桑弘基");
map.put(6,"苏武");
System.out.println("新map.hashCode:"+map.hashCode());
返回了一串数字,此时说明map中是有数据的,这个时候我们再使用clear()方法将map中的数据清空后再次输出hashCode()返回
的值,发现仍然是0。
map.clear();
System.out.println("after clear:"+map.hashCode());
如果直接将map对象置null,这个时候再次输出hashCode()则不会有输出结果,而是报空指针异常了。
到这里,就很明白了,虽然将map对象的数据都clear()了,key和value为null,但是内存中map对象还存在,并且map
具有强引用,虽然key和value为空,但是JVM的垃圾回收器并不会回收该对象的内存,如果再程序中创建很多这样子的没
有释放的对象就会造成内存泄漏,所以小伙伴们再创建map对象的时候,如果不再用到该对象的时候,要注意及时释放该对象
的内存空间。有什么写的不好的欢迎大家指出,我及时修改好不误人子弟。
java dispose null_Java Map释放内存置null以及调用clear()的区别相关推荐
- 指针作为函数参数 进行内存释放 并置NULL
author:张继飞 写在前面,前面写了代码封装free函数,但是调用封装并退出后,指针并不为NULL,导致接下来以此作为判断条件的时候就出现问题了.先前封装函数为void _free_p_(void ...
- java get null_java 获取对象中为null的字段实例代码
下面一段简单的代码给大家分享java 获取对象中为null的字段,具体代码如下所述: private static String[] getNullPropertyNames(Object sourc ...
- java dispose null_java – 为什么在调用setVisible(false)和dispose...
我看到的区别是(在JDK 1.7上运行): setVisible(false), invokes componentHidden but not windowClosed (The API state ...
- 【Java集合之Map】HashMap、HashTable、TreeMap、LinkedHashMap区别
Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap.HashTable.LinkedHashMap和TreeMap.本节实例主要介绍这4中实例的用 ...
- C++ 之new和delete释放内存
C++ -释放内存(new和delete) C++动态分配和释放内存 @c.biancheng.net/view/206.html 在C语言中,动态分配内存用 malloc() 函数,释放内存用 fr ...
- C/C++申请和释放内存
new 和 delete 是 C++ 用于管理堆内存的两个运算符,对应于C语言中的 malloc 和 free,但是 malloc 和 free 是函数,而new 和 delete 是运算符.除此之外 ...
- java 垃圾回收 null_java方法中把对象置null,到底能不能加速垃圾回收
今天逛脉脉,看见匿名区有人说java中把对做置null,这种做法很菜,不能加速垃圾回收,但是我看到就觉得呵呵了,我是觉得可以加速置null对象回收的. 测试的过程中,费劲的是要指定一个合理的测试堆大小 ...
- java一个接口执行结束释放内存_java的灵魂--JVM虚拟机
JVM是运行在操作系统之上的,它与硬件没有直接的交互 JVM体系结构 1.类加载器 负责加载class文件,class文件在文件开头有特定的文件标示, 并且ClassLoader只负责class文件的 ...
- 释放内存触发断点及数组、指针的NULL初始化
Visual Studio调试时,出现"触发一个断点"内存释放出现异常 数组和对应指针的NULL初始化 数组使用之前要先对其初始化 char Outi[4] = { NULL }; ...
最新文章
- LeetCode中等题之两两交换链表中的节点
- JavaScript初学者编程题(3)
- 一种实时轻量级3D人脸对齐方法
- Linux下的inode记录
- SAP Spartacus root.scss里的变量层级引用
- mvc 视图和模型的对应_通过在酒吧订购饮料来解释模型视图控制器(MVC)
- Java 数组的拷贝(复制一个相同数组)
- kali安装后的基本配置
- restlet使用_使用Restlet Framework构建联网汽车
- [一分钟先生]涂勇:通过跳槽走上管理岗位不可取
- 华为机试HJ105:记负均正II
- post 和 get 网站
- DFS ZOJ 1002/HDOJ 1045 Fire Net
- 移动支付变巨头掘金地,银盒子手握SaaS成新宠
- Android Study 之 聊聊有关SVG那些事儿
- 农村信用社招聘计算机类进去干啥,2008年山东农村信用社招聘考试计算机类的范围有知道的吗?...
- 移动网关贝尔G-140W-C 修改wifi前缀去掉CMCC
- 互联网公司,产品和测试的那些人和事
- 贝叶斯视角下的机器学习
- James Gosling : Java之父
热门文章
- U盘安装Linux安装报错及解决方案
- 获得一个日期在当周是否有节日并返回日期
- linux X11窗口转发配置简记
- Cannot load 64-bit SWT libraries on 32-bit JVM 解决方法
- OpenCV-获取图像中直线上的数据
- linux同步某台服务器,linux 两台服务器之间开机自动同步指定目录下的文件
- linux调用线程函数,作为线程调用的C函数-Linux Userland程序
- Shell脚本基本用法
- git21天打卡day12切换分支修改文件
- c语言语法sc,适合于嵌入式系统的C语言单元测试框架:SCUNIT