本文主要是介绍【Java】IdentityHashMap 的使用场景,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前言
- 1. Druid 应用场景
- 2. IdentityHashMap 特性
- 3. IdentityHashMap 同步化
- 4. IdentityHashMap 处理key为空值
- 后记
前言
最近有兴趣看一下 Druid 连接池怎么做连接管理的,看到一个类 IdentityHashMap
,这里记录一下使用场景。
1. Druid 应用场景
- 定义
protected final Map<DruidPooledConnection, Object> activeConnections
= new IdentityHashMap<DruidPooledConnection, Object>();
- 最外层调用
if (url.startsWith("/activeConnectionStackTrace-") && url.endsWith(".json")) {Integer id = StringUtils.subStringToInteger(url, "activeConnectionStackTrace-", ".");// 内部从IdentityHashMap的容器中取值return returnJSONActiveConnectionStackTrace(id);}
- 用法概括
Druid 的特点就是做监控,每一个连接,也就是DruidPooledConnection
都对应一个调用栈的详情。
这些连接的调用栈信息保存到IdentityHashMap<DruidPooledConnection, Object>
中,对外提供查询服务。
2. IdentityHashMap 特性
观察一下 IdentityHashMap 的 key的hash值,来自于该对象的应用地址。
言下之意是:IdentityHashMap 的 key ,无论属性如何改变都不影响容器的寻址
Druid 就是用这个特性保留连接的堆栈记录
3. IdentityHashMap 同步化
Collections.synchronizedMap(new IdentityHashMap<Object, ObjectName>());
- Druid 内部线程安全的用法
- 外层使用
前文一直疑惑为什么把value泛型指定为 Object,这里倒是看懂了,这个容器有很多统计类型数据。感慨一下这个泛化的map也太多地方用了吧,业务代码这么写会被吐槽吧。
4. IdentityHashMap 处理key为空值
类比一下 HashMap,可以存储 null 的 key,是把 null 映射为 0
而 IdentityHashMap 将 null 映射为空对象
后记
如果有池化管理对象的需求(比如连接池),且考虑将对象作为某个容器的key,此时可以考虑使用 IdentityHashMap
这篇关于【Java】IdentityHashMap 的使用场景的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!