今天自己在总结map的时候,想到了在释放Map对象空间的时候就有使用过将Map对象置null,也有时候会调用clear()将Map中的数据清除,那么它们都有什么区别呢?

Map<Integer, String> 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()返回的值:

  1.  
    map.put(1,"霍去病");
  2.  
    map.put(2,"李广");
  3.  
    map.put(3,"刘彻");
  4.  
    map.put(4,"马邑");
  5.  
    map.put(5,"桑弘基");
  6.  
    map.put(6,"苏武");
  7.  
    System.out.println("新map.hashCode:"+map.hashCode());

返回了一串数字,此时说明map中是有数据的,这个时候我们再使用clear()方法将map中的数据清空后再次输出hashCode()返回

的值,发现仍然是0。

  1.  
    map.clear();
  2.  
    System.out.println("after clear:"+map.hashCode());

如果直接将map对象置null,这个时候再次输出hashCode()则不会有输出结果,而是报空指针异常了。

到这里,就很明白了,虽然将map对象的数据都clear()了,key和value为null,但是内存中map对象还存在,并且map

具有强引用,虽然key和value为空,但是JVM的垃圾回收器并不会回收该对象的内存,如果再程序中创建很多这样子的没

有释放的对象就会造成内存泄漏,所以小伙伴们再创建map对象的时候,如果不再用到该对象的时候,要注意及时释放该对象

的内存空间。有什么写的不好的欢迎大家指出,我及时修改好不误人子弟。

Java Map释放内存置null以及调用clear()的区别的更多相关文章

  1. delphi dispose释放内存的方法 New 和 GetMem 的区别

    来自:http://blog.sina.com.cn/s/blog_4bc47d2301018trf.html -------------------------------------------- ...

  2. java基本数据类型和引用数据类型的调用传递的区别

    (1)基本数据类型:就是进行了值的传递把一份数据拷贝了之后传递过去 (2)引用数据类型:实际上也是进行了数据拷贝然后传过去,实际上也是值传递,只不过传递过去的值和原有的值指向了同一个对象 所以在调用的 ...

  3. C++ ---释放内存(new和delete)

    C++ ---释放内存(new和delete) C++动态分配和释放内存 @c.biancheng.net/view/206.html -------------------------------- ...

  4. map的erase()释放内存

    STL中的map调用erase(it),当value值为指针时,释放内存: #include <iostream> #include <map> #include <st ...

  5. 由STL map调用clear后,内存不返还给操作系统的问题出发,探讨glibc malloc/free行为(转)

    1. 问题 我们的程序有几十个线程,每个线程拥有一个std::map,每个线程都要向自己的std::map中插入大量的数据,但每个数据只有几十字节:当使用完std::map,调用map.clear() ...

  6. java方法中把对象置null,到底能不能加速垃圾回收

    今天逛脉脉,看见匿名区有人说java中把对做置null,这种做法很菜,不能加速垃圾回收,但是我看到就觉得呵呵了,我是觉得可以加速置null对象回收的. 测试的过程中,费劲的是要指定一个合理的测试堆大小 ...

  7. C++ STL map容器值为指针时怎么释放内存

    最近在使用STL中map时,遇到了一个问题,就是当map中值为指针对象时怎么释放内存? // 站点与TCP连接映射表 (key为ip_port_stationCode, value为 clientSo ...

  8. 释放内存触发断点及数组、指针的NULL初始化

    Visual Studio调试时,出现“触发一个断点”内存释放出现异常 数组和对应指针的NULL初始化 数组使用之前要先对其初始化 char Outi[4] = { NULL }; char Outj ...

  9. 由多线程引起的map取值为null的分析

    昨天写了一个多线程的程序,却发现了一个很奇特的问题,就是我的map对象明明put了,可是get的时候竟然会取到null,而且尝试多次,有时候成功,有时候取到null,并不确定. 程序代码如下: pub ...

随机推荐

  1. js的回调函数详解

    本文主要介绍了个人对于javascript中回调函数的理解和使用方法及示例,需要的朋友可以参考下   现在做native App  和Web App是主流,也就是说现在各种基于浏览器的web app框 ...

  2. SpringMVC之controller篇1

    概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...

  3. 64位Win7系统下vs2010调试无法连接oracle解决办法

    具体的解决办法如下: 1.先将WebDev.WebServer20.EXE和WebDev.WebServer40.EXE文件从Program Files (x86)目录中拷贝出来放到c:\dev目录中 ...

  4. Andriod ----配置环境变量

    注意:跟java相关的目录不要有中文和空格. 1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:D:\Java ...

  5. Python 环境安装教程(Windows 10)

    Python编程语言非常强大,非常容易上手,版本更新也不慢,在win10 x64中兼容性也很好,直接安装不需另外配置,虽然Python2和3有点异同.学习的话选择最新的 python 3.7.1版. ...

  6. [RF] 安装好Robot Framework之后怎样让启动的界面后面不带命令行窗口,且图片以机器人显示

    安装好Robot Framework之后,通过 C:\Python27\Scripts\ride.py 启动时会带上一个命令行窗口: 怎样让启动的界面后面不带这个命令行窗口,且图片以机器人显示? 方法 ...

  7. Continuous Subarray Sum LT523

    Given a list of non-negative numbers and a target integer k, write a function to check if the array ...

  8. Asterisk的type类型和身份认证

    Asterisk的type类型和身份认证 转载:http://zeevli.blog.163.com/blog/static/119591610201111745012380/ 在Asterisk中对 ...

  9. velocity 框架

    Java模板引擎 Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅使用简单的模板语言(template language)来引用由java代码定义的对象 ...

  10. Tgrocery学习及使用

    能够学习到短文本分类模型——Tgrocery,十分感谢@GavinBuildSomething把源码及测试数据分享,在此我也作为一名学习者将自己的学习过程记录下来,希望对其他人有所帮助.   1.学习 ...