首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java的WeakHashMap和缓存:为什么它引用了键而不是值?

在Java中,WeakHashMap是一种特殊的HashMap实现,它的键是弱引用,这意味着当一个键不再有强引用指向它时,它将被垃圾回收器回收。WeakHashMap通常用于缓存,因为它可以在内存不足时自动清除不再使用的缓存条目。

WeakHashMap引用键而不是值的原因是,它的主要目的是在内存不足时自动清除不再使用的缓存条目。如果WeakHashMap引用值而不是键,那么当值不再被使用时,它将被垃圾回收器回收,而WeakHashMap将无法自动清除这些条目。因此,WeakHashMap引用键而不是值,以便在内存不足时自动清除不再使用的缓存条目。

WeakHashMap的优势在于它可以自动清除不再使用的缓存条目,从而节省内存空间。它通常用于缓存,因为缓存中的数据通常是临时的,并且在内存不足时可以被清除。

WeakHashMap的应用场景包括缓存、实现LRU缓存、实现对象池等。

推荐的腾讯云相关产品和产品介绍链接地址:

这些产品都可以用于缓存数据,从而提高应用程序的性能和可扩展性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JVM中对象回收过程

如果有一个,对应已经不再 使用了, 将会出现什么情况呢? 假定对某个最后一次引用已经消亡,不再有任何途径 用这个对象了。...但是,由于在程序中任何部分没有再出现这个,所以,这个 / 对无法从映射中删除。为什么垃圾回收器不能够删除呢? 难道删除无用对象不是垃圾回 收器工作吗?...或者使用 WeakHashMap完成这件事情。当对唯一用来自散列条目时, 这一数据结构将与垃圾回收器协同工作一起删除 / 对。 下面是这种机制内部运行情况。...除了WeakHashMap使用了弱引用,ThreadLocal类中也是用了弱引用,可以自行了解下。...虚拟机可以对满足上述3个条件无用类进行回收,这里说仅仅是“可以”,不是对象一样,不使用了就必然会回收。

52120

滚雪球学Java(65-2):弱引用,强实现:探索JavaWeakHashMap

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 前言   在Java开发中,有时我们需要保存大量对象,但是这些对象又不是一直都需要被内存中持有,比如一些缓存数据或者对象池中对象等...为了实现这个功能,内部使用了一个 HashMap 一个队列。队列中存储了已经被垃圾回收弱引用,每次操作时都会先清理队列中已经被回收键值对。   ...put public V put(K key, V value) 将指定映射到此映射中指定都可以为null。返回value。...总结   在此,我们来做个小小总结,本文深入探讨了JavaWeakHashMap,这是一种特殊HashMap实现,使用弱引用作为,允许在内存不足时自动回收不再被引用键值对。...文章还提供了WeakHashMap几个典型应用场景,如缓存实现、对象关联事件监听,并分析了使用WeakHashMap优点,例如内存管理高效性自动维护特性,同时也指出了性能和易误用性等缺点

6410

译文:理解Java弱引用

解决上述widget序列数记录问题,最简单办法就是使用Java内置WeakHashMap类。WeakHashMapHashMap几乎一样,唯一区别就是不是!!!)...当WeakHashMap标记为垃圾时候,这个对应条目就会自动被移除。这就避免了上面不需要Widget对象手动删除问题。...其get方法一直返回null就是为了阻止其指向几乎被销毁对象重新复活。 虚引用使用场景主要由两个。允许你知道具体何时其引用对象从内存中移除。实际上这是Java中唯一方式。...使用虚引用,上述情况将解,当一个虚引用加入到引用队列时,你绝对没有办法得到一个销毁了对象。因为这时候,对象已经从内存中销毁了。...总结 我想看到这里,很多人开始发牢骚了,为什么你要讲一个过去十年老古董API呢,好吧,以我经验看,很多Java程序员并不是很了解这个知识,我认为有一些深入理解是很必要,同时我希望大家能从本文中收获一些东西

74720

WeakHashMap原理

简介 WeakHashMapHashMap一样,WeakHashMap也是一个散列表,存储内容也是键值对(key-value)映射,而且都可以为null。...因此,WeakHashMap使用了弱引用作为内部数据存储方案,,WeakHashMap可以作为简单缓存解决方案,当系统内存不足时,垃圾收集器会自动清除没有在任何其他地方被引用键值对。...在WeakHashMap实现中,借用了ReferenceQueue这个“监听器”来保存被GC回收”弱”,然后在每次使用WeakHashMap时,就在WeakHashMap中删除ReferenceQueue...Java引用Reference学习 WeakHashMap是通过数组table保存Entry(键值对);每个Entry实际上就是一个链表来实现。...当下一步我们需要操作WeakHashMap时,会先同步table、queue,table中保存了全部键值对,queue中保存是GC回收键值对;同步他们,就是删除table中被GC回收键值对。

23520

Java WeakHashMap深度解析:如何利用弱引用实现弱缓存策略?

WeakHashMapJava中WeakHashMap类是一种基于弱引用实现Map集合。特点是:当Map中某个键值对不再被强引用指向时,该键值对就会被自动清除。...当一个缓存项中不再被强引用指向时,该缓存项就会被自动清除。当某个对应已经被清除时,我们就需要重新创建这个,并将其放入缓存中。3....使用弱缓存策略时,我们需要注意以下几点:缓存只能是弱引用对象,可以是强引用对象。当缓存被垃圾回收器回收时,该对应也会被自动清除。...当从缓存中获取某个对应时,如果该已经被清除,就需要重新创建该,并将其放入缓存中。4....小结在本文中,我们深入研究了Java中利用WeakHashMap实现弱缓存策略原理方法。我们首先介绍了弱引用概念,然后讲解了WeakHashMap实现原理使用方式。

43582

WeakHashMap,源码解读

value则赋予了强引用,但这并不影响,我们在稍后会介绍一个WeakHashMap.expungeStaleEntries方法,该方法会把弱对应key-value整个赋为null,以帮助GC将其回收...源码中我们看到,weak keys会被保存到引用队列中,该方法就说将引用队列中保存对应Entry从单链表中删除,即删除哈希表中被GC回收了键值对。...如果你正好要实现这样缓存:只要在缓存之外存在对某个项引用,该项就有意义,那么就可以用WeakHashMap代表缓存。...当缓存项过期之后,它们就会自动被删除(要注意是,只有当所要缓存生命周期是由该外部引用不是决定时,WeakHashMap才有用处)。...Tomcat就用WeakHashMap实现了并发缓存ConcurrentCache,源码如下: package org.apache.tomcat.util.collections; import

37210

Java集合类型详解

这个方法集合了Java 5自动装箱无参变量特性,来实现将一个变量快速地传给 Arrays.hashcode方法——只是传进去,不是对象。...IdentityHashMap:这是一个特殊Map版本,违背了一般Map规则:使用 “==” 来比较引用不是调用Object.equals来判断相等。...这就是为什么迭代LinkedHashMap条目(entry)、时候总是遵循插入顺序。在JDK中,这是每元素消耗内存最大集合。 TreeMap:一种基于已排序且带导向信息Map红黑树。...WeakHashMap:这种Map通常用在数据缓存中。它将存储在WeakReference中,就是说,如果没有强引用指向对象的话,这些就可以被垃圾回收线程回收。被保存在强引用中。...多数并发集合是在Java 1.5

73820

Java入门提高篇】Day34 Java容器类详解(十五)WeakHashMap详解

源码详解系列均基于JDK8进行解析 说明 在Java容器详解系列文章最后,介绍一个相对特殊成员:WeakHashMap,从名字可以看出它是一个 Map。...WeakHashMap探秘 从说明可以看出,WeakHashMap特殊之处便在于Entry与众不同,里面的Entry会被垃圾回收器自动回收,那么问题来了,为什么会被自动回收呢?...存储结构 WeakHashMap数据结构是数组+链表形式,这一点跟HashMap也是一致,但不同是,在JDK8中,当发生较多key冲突时候,HashMap中会由链表转为红黑树,WeakHashMap...别着急,看看构造函数就可以发现,用了父类构造函数。...这样设计好处是,能将相对常用对象都能在eden缓存中找到,不常用则存入longterm缓存,并且由于WeakHashMap能自动清除Entry,所以不用担心longterm中键值对过多导致OOM

50340

JavaWeakHashMap:理解弱引用与垃圾回收

JavaWeakHashMap:理解弱引用与垃圾回收 摘要 JavaWeakHashMap是一种特殊Map实现,使用弱引用来存储,使得在适当时机垃圾回收可以自动移除键值对。...本文将介绍WeakHashMap原理用途,并结合代码示例演示如何在Java中利用WeakHashMap实现自动资源管理和缓存清理。 1....然而,有些场景下我们需要在不再使用某个时,自动将其从Map中移除,不是手动调用remove()方法。这就是WeakHashMap用武之地。...WeakHashMap原理 WeakHashMapjava.util包下一个特殊Map实现,(key)是使用弱引用(WeakReference)来存储。...这意味着,如果某个只有WeakHashMap弱引用在引用它,没有其他强引用指向,那么在垃圾回收器执行回收时,该键值对会被自动移除,从而节省内存空间。 3.

45630

WeakHashMap,源码解读

value则赋予了强引用,但这并不影响,我们在稍后会介绍一个WeakHashMap.expungeStaleEntries方法,该方法会把弱对应key-value整个赋为null,以帮助GC将其回收...源码中我们看到,weak keys会被保存到引用队列中,该方法就说将引用队列中保存对应Entry从单链表中删除,即删除哈希表中被GC回收了键值对。...如果你正好要实现这样缓存:只要在缓存之外存在对某个项引用,该项就有意义,那么就可以用WeakHashMap代表缓存。...当缓存项过期之后,它们就会自动被删除(要注意是,只有当所要缓存生命周期是由该外部引用不是决定时,WeakHashMap才有用处)。...Tomcat就用WeakHashMap实现了并发缓存ConcurrentCache,源码如下: package org.apache.tomcat.util.collections; import

90030

Java引用类型具体解释

JVM  垃圾收集对不同类型引用有一种不同方法。java对于对象。仅仅存在有。它会一直存在于内存中。假设越来越多这样对象,外JVM内存量。JVM抛出OutOfMemory错。...哈希表接口同意使用不论什么Java对象作为来使用。当一个键值对被放入到哈希表中之后。哈希表  对象本身就有了对这些对象引用。...假设这样引用是强引用的话,那么仅仅要哈希表对象本身还存活,当中所包括对象是不会被回收。假设某个存活  时间非常长哈希表中包括键值对非常多,终于就有可能消耗掉JVM中所有的内存。...对于这样情况解决方法就是使用弱引用来引用这些对象,这样哈希表中对象都能被垃圾回收。 Java中提供了 WeakHashMap来满足这一常见需求。...可是还须要对引用本身做一些处理。典型情景是在哈希表中。引用对象是作为WeakHashMap对象。当其引用实际对象被垃圾回收之后。就须要把该键值对从哈希表中删除。

29720

Java集合总览

这个方法集合了Java 5自动装箱无参变量特性,来实现将一个变量快速地传给 Arrays.hashcode方法——只是传进去,不是对象。...IdentityHashMap:这是一个特殊Map版本,违背了一般Map规则:使用 “==” 来比较引用不是调用Object.equals来判断相等。...这就是为什么迭代LinkedHashMap条目(entry)、时候总是遵循插入顺序。在JDK中,这是每元素消耗内存最大集合。 TreeMap:一种基于已排序且带导向信息Map红黑树。...WeakHashMap:这种Map通常用在数据缓存中。它将存储在WeakReference中,就是说,如果没有强引用指向对象的话,这些就可以被垃圾回收线程回收。被保存在强引用中。...多数并发集合是在Java 1.5

1.1K70

一文读懂《Effective Java》第6条:消除GC触及不到过期对象引用

数组(对象引用单元,不是对象本身)元素。...解决方法:使用 WeakHashMap 代表缓存,当缓存过期后会被自动删除。参考《弱引用是什么》 在Java集合中有一种特殊Map类型:WeakHashMap。...HashMap一样,WeakHashMap 也是一个散列表,存储内容也是键值对(key-value)映射,而且都可以是null。...不过WeakHashMap是“弱”,里面存放了对象弱引用,当某个不再正常使用时,会从WeakHashMap中被自动移除。当一个对象被垃圾回收,那么相应对象引用会从Map中删除。...解决方法:同样将它们服务调用对象保存为弱引用(weak reference),例如 WeakHashMap 。 总结 上文总结了3种常见Java 内存泄露场景对应解决办法。

29210

WeakHashMap理解

二、为什么需要WeakHashMap WeakHashMap正是由于使用是弱引用,因此对象可能被随时回收。...更直观说,当使用 WeakHashMap 时,即使没有删除任何元素,尺寸、get方法也可能不一样。比如: (1)调用两次size()方法返回不同;第一次为10,第二次就为8了。...:Entry通过传入keyqueue调用了父类WeakReference构造函数,那么key就成为了这个弱引用所引用对象,并把这个弱引用注册到了引用队列上。...3、static就不在gc之列,所以key也就不会被gc,所以value,也就不会被设为null,不会被回收。...只有通过remove方法才能删除null所关联value,建议在使用WeakHashMap时候尽量避免使用null作为

48620

易犯Java内存泄漏代码

不是将基本数据类型用于求和,我采用了Long(包装类),这是内存泄漏原因。由于自动装箱,sum = sum + l;在每次迭代中创建一个新对象,因此将创建1000个不必要对象。...请避免在基本数据类型包装类之间进行混合使用。 尽可能地使用基本数据类型。 示例2:使用缓存 ? 在这里,由于内部map数据结构发生内存泄漏。此类用于显示缓存员工值。...关于WeakHashMap需要谨慎使用,如果要重新使用存储在缓存,可能是key不被任何其他对象引用,因此该条目将被GC回收并且该奇迹般地消失了。 示例3:关闭连接 ?...在CustomKey中,我们忘记提供equals()hashcode()实现,因此映射get()方法检查hashcode()equals()时,不能再检索存储在map中。...但是这个条目不能被GC回收,因为map引用了,但应用程序无法访问。绝对是内存泄漏。 所以当你做自定义key时,总是提供一个equalshashcode()实现。

1.7K70

Java WeakHashMap

从类定义上来看,普通HashMap一样,继承了AbstractMap类实现了Map接口,也就是说它有着与HashMap差不多功能。...那么既然jdk已经提供了HashMap,为什么还要再提供一个WeakHashMap呢? 黑格尔曾经说过,存在必合理,接下来我们来看下为什么WeakHashMap。   ...没错WeakHashMap就是能实现这种功能东西,这也是普通HashMap不同地方——它有自清理机制。   如果让你实现一种自清理HashMap,你怎么做?...1.阿里Arthas   在阿里开源Java诊断工具中使用了WeakHashMap做类-字节码缓存。...3.ThreadLocalMap   ThreadLocal中用ThreadLocalMap存储Thread对象,虽然ThreadLocalMapWeakHashMap不是一个东西,但ThreadLocalMap

64320

java weakhashmap_解析WeakHashMap与HashMap区别详解

总结来说:WeakHashMap不是你啥也干他就能自动释放内部不用对象,而是在你访问内容时候释放内部不用对象 问题讲清楚了,现在我们来梳理一下.了解清楚其中奥秘....丢弃某个时,其条目从映射中有效地移除,因此,该类行为与其他 Map 实现有所不同。 null null 都被支持。..., remove 方法返回 false, 对于集、集、项集进行检查,生成元素数量越来越少。...因此,面对并发修改,迭代器很快就完全失败, 不是冒着在将来不确定时间任意发生不确定行为风险。...因此,编写依赖于此异常程序方式是错误, 正确做法是:迭代器快速失败行为应该仅用于检测 bug。注意1:null null 都被支持。 注意2:不是线程安全

60610

对象强, 软, 弱虚引用

在别人源码中看到对SoftReference使用,不是很了解,在网上搜到一篇很好文章,优化了排版,分享之 本文介绍对象强、软、弱虚引用概念、应用及其在UML中表示。...在这两条路径之间取最强引用,于是对象5是一个软可及对象。 3.使用软引用构建敏感数据缓存 3.1 为什么需要使用软引用 首先,我们看一个雇员信息查询系统实例。...4.2如何使用WeakHashMapJava集合中有一种特殊Map类型—WeakHashMap,在这种Map中存放了对象弱引用,当一个对象被垃圾回收器回收时,那么相应对象引用会从Map...当映射生命周期必须与生命周期联系在一起时,可以使用这种方法。用WeakHashMap修复 SocketManager。...用弱引用承载映射,这使得应用程序不再使用对象时它们可以被垃圾收集,get() 实现可以根据WeakReference.get() 是否返回 null 来区分死映射映射。

67010

Java基础 之软引用、弱引用、虚引用

6、相关应用   在java.lang.ref包中提供了三个类:SoftReference类、WeakReference类PhantomReference类, 们分别代表软引用、弱引用虚引用。...集合中有一种特殊Map类型:WeakHashMap, 在这种Map中存放了对象弱引用,当一个对象被垃圾回收,那么相应对象引用会从Map中删除。...WeakHashMap能够节约存储空间,可用来缓存那些非必须存在数据。     ...id可以被3整数Key对象持有强引用,因此不会被回收。 7、使用软引用构建敏感数据缓存     7.1 为什么需要使用软引用     首先,我们看一个雇员信息查询系统实例。...8.2如何使用WeakHashMap      在Java集合中有一种特殊Map类型—WeakHashMap,在这种Map中存放了对象弱引用,当一个对象被垃圾回收器回收时,那么相应 对象引用会从

93640
领券