- 新建WeakHashMap,将“键值对”添加到WeakHashMap中。
将“键值对”添加到WeakHashMap中时,添加的键都是弱键。
实际上,WeakHashMap是通过数组table保存Entry(键值对);每一个Entry实际上是一个单向链表,即Entry是键值对链表。
(02) 当某“弱键”不再被其它对象引用,并被GC回收时。在GC回收该“弱键”时,这个“弱键”也同时会被添加到queue队列中。
例如,当我们在将“弱键”key添加到WeakHashMap之后;后来将key设为null。这时,便没有外部外部对象再引用该了key。
接着,当Java虚拟机的GC回收内存时,会回收key的相关内存;同时,将key添加到queue队列中。
(03) 当下一次我们需要操作WeakHashMap时,会先同步table和queue。table中保存了全部的键值对,而queue中保存被GC回收的“弱键”;同步它们,就是删除table中被GC回收的“弱键”对应的键值对。
例如,当我们“读取WeakHashMap中的元素或获取WeakReference的大小时”,它会先同步table和queue,目的是“删除table中被GC回收的‘弱键’对应的键值对”。删除的方法就是逐个比较“table中元素的‘键’和queue中的‘键’”,若它们相当,则删除“table中的该键值对”。
3.3 HashMap和WeakHashMap的比较测试程序
Java 集合系列14之 Map总结
View Code
运行结果:
Java 集合系列14之 Map总结
– HashMap –
map entry : H2 - h2
map size:1
– WeakHashMap –
map entry : W2 - w2
map size:1
– Self-def HashMap –
map entry : CompareHashmapAndWeakhashmap
S
e
l
f
@
1
f
f
9
d
c
36
−
s
4
m
a
p
s
i
z
e
:
1
−
−
S
e
l
f
−
d
e
f
W
e
a
k
H
a
s
h
M
a
p
−
−
G
C
S
e
l
f
:
i
d
=
10
a
d
d
r
=
0
x
C
o
m
p
a
r
e
H
a
s
h
m
a
p
A
n
d
W
e
a
k
h
a
s
h
m
a
p
Self@1ff9dc36 - s4 map size:1 -- Self-def WeakHashMap -- GC Self: id=10 addr=0xCompareHashmapAndWeakhashmap
Self@1ff9dc36−s4mapsize:1−−Self−defWeakHashMap−−GCSelf:id=10addr=0xCompareHashmapAndWeakhashmapSelf@12276af2)
map entry : CompareHashmapAndWeakhashmap$Self@59de3f2d - s2
map size:1
Java 集合系列14之 Map总结
欢迎工作一到五年的Java工程师朋友们加入Java架构师:697558955
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!