首页 > 其他分享 >WeakHashMap和HashMap的区别

WeakHashMap和HashMap的区别

时间:2022-09-29 19:33:26浏览次数:78  
标签:WeakHashMap HashMap map 区别 Map null String

看Java源码的时候,看到了 WeakHashMap ,我一直以来使用的 都是 HashMap,于是查了一下两者的区别

(一) 查看API文档,WeakHashmap要点如下:

1. 以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除

2. WeakHashMap 类的行为部分取决于垃圾回收器的动作。因为垃圾回收器在任何时候都可能丢弃键,WeakHashMap 就像是一个被悄悄移除条目的未知线程。特别地,即使对 WeakHashMap 实例进行同步,并且没有调用任何赋值方法,在一段时间后 size 方法也可能返回较小的值,对于 isEmpty 方法,返回 false,然后返回true,对于给定的键,containsKey 方法返回 true 然后返回 false,对于给定的键,get 方法返回一个值,但接着返回 null,对于以前出现在映射中的键,put 方法返回 null,而 remove 方法返回 false,对于键 set、值 collection 和条目 set 进行的检查,生成的元素数量越来越少。

3. WeakHashMap 中的每个键对象间接地存储为一个弱引用的指示对象。因此,不管是在映射内还是在映射之外,只有在垃圾回收器清除某个键的弱引用之后,该键才会自动移除。

简而言之,WeakHashMap,此种Map的特点是,当除了自身有对key的引用外,此key没有其他引用那么此map会自动丢弃此值

Hashmap要点如下:

基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null

(二) 示例演示

声明两个Map对象,一个是HashMap,一个是WeakHashMap,同时向两个map中放入a、b、c 三个对象,当HashMap  remove掉a ,当WeakHashMap  remove掉c,并且将a、b、c都指向null时,WeakHashMap中的a将自动被回收掉,HashMap中的c 依然存在。

出现这个状况的原因是,对于a对象而言,当HashMap  remove掉并且将a指向null后,除了WeakHashMap中还保存a外已经没有指向a的指针了,所以WeakHashMap会自动舍弃掉a,而对于b对象虽然指向了null,但HashMap中还有指向b的指针,所以

WeakHashMap将会保留。

代码:

package com.panie.db.utils;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.WeakHashMap;

public class Test2
{
public static void main(String[] args)
{
String a = new String("a");
String b = new String("b");
String c = new String("c");
Map weakmap = new WeakHashMap();
Map map = new HashMap();
map.put(a, "aaa");
map.put(b, "bbb");
map.put(c, "ccc");

weakmap.put(a, "aaa");
weakmap.put(b, "bbb");
weakmap.put(c, "ccc");
map.remove(a);
weakmap.remove(c);
a=null;
b=null;
c=null;

System.gc();
Iterator i = map.entrySet().iterator();
while (i.hasNext()) {
Map.Entry en = (Map.Entry)i.next();
System.out.println("map:"+en.getKey()+":"+en.getValue());
}

Iterator j = weakmap.entrySet().iterator();
while (j.hasNext()) {
Map.Entry en = (Map.Entry)j.next();
System.out.println("weakmap:"+en.getKey()+":"+en.getValue());

}
}
}

  结果:

map:b:bbb
map:c:ccc
weakmap:b:bbb

  

(三) 实际中的问题

在排查一个java heap溢出问题的时候,发现HashMap对象占用很多一直无法释放。

应用背景:读取一个大文件,每次读取处理10m数据,将数据放到HashMap中。

解决方式:尝试调用了map.clear();map=null;还告知System.gc()需要进行内存回收都没有办法,运行一段时间后heap中有大量HashMap对象无法回收。于是分析了下HashMap和WeakHashMap。采用WeakHashMap就可以了或者遍历hashmap把值都置为null。

 

参考:WeakHashMap和HashMap的区别

​深入理解WeakHashmap​

java内存泄露与weakhashmap


​作者:panie



标签:WeakHashMap,HashMap,map,区别,Map,null,String
From: https://blog.51cto.com/u_15812342/5723971

相关文章

  • SAP License:ERP系统和电商系统的区别?
    互联网时代的到来,使得电商企业发展逐渐兴起,企业的多样化发展,企业的管理也在不断的改进,那么​​ERP系统​​​也将随之不断发展,那么ERP系统和​​电商系统​​到底有什么相同......
  • join、left join、right join、full join的区别
    join:内连接leftjoin:左外连接rightjoin:右外连接fulljoin/fullouterjoin:全外连接例如有A表数据如下:B表数据如下:join:取两表相同的部分select*fromtest.test_......
  • Java中抽象类和接口的介绍及二者间的区别
    转载自Java中抽象类和接口的介绍及二者间的区别 接口(Interface)和抽象类(AbstractClass)是支持抽象类定义的两种机制。一、抽象类在Java中被abstract关键字修......
  • preventDefault()、stopPropagation()、return false 之间的区别
    “returnfalse”之所以被误用的如此厉害,是因为它看起来像是完成了我们交给它的工作,浏览器不会再将我们重定向到href中的链接,表单也不会被继续提交,但这么做到底有什么不对呢......
  • React函数组件和类组件的区别
    区别函数组件的性能比类组件的性能要高,因为类组件使用的时候要实例化,而函数组件直接执行函数取返回结果即可。为了提高性能,尽量使用函数组件。区别函数组件类组件是否有 ​......
  • O2O、C2C、B2B、B2C、C2B的区别
    C2C就是我卖东西你来买B2C就是我成立个公司卖东西,你来买京东、当当、亚马逊、天猫、聚美优品、唯品会O2O就是我成立个公司卖东西你来买但是要你自己来拿B2B就是你也成立了公......
  • const, var, let的区别 1.10
    js中三种定义变量的方式const,var,let的区别。1.const定义的变量不可以修改,而且必须初始化。1constb=2;//正确2//constb;//错误,必须初始化3console.log('函数外const定......
  • jQuery 中 attr() 和 prop() 方法的区别
    结论 具有true和false两个属性的属性,如checked,selected或者disabled使用prop(),其他的使用attr(),具体见下表:分析前几天,有人给 ​​MultipleSelect插件​​ ......
  • Python元组常用方法 || 元组和列表的区别
    Python元组常用方法前言①通过()创建元组。小括号可以省略。a=(10,20,30)或者a=10,20,30【注意】:如果元组只有一个元素,则必须后面加逗号。这是因为python解释器会把 ......
  • 比较运算符compareTo()、equals()、==之间的区别与应用总结
    在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,ja......