【踩坑篇】代码中使用 Long 作为 Map的Key存在的问题

本周的工作结束,详述一些在项目代码中实际遇到的一些坑。

代码中遇到这样一个场景:

有个业务接口,接口返回的值是一个JSON格式的字符串,通过JSON解析的方式,解析为格式为:

Map<Long, Map<String, Object>> 的数据格式。

然后,根据业务keyId,去上面接口返回的map取值,发现一直为null。

场景复现代码如下所示:

java 复制代码
		Long key = 89765487L;
		String returnStr = "{89765487:{\"uid\":\"2\",\"uname\":\"张三\"}}";
		Map<Long, Map<String, Object>> strMap = JSON.parseObject(returnStr, Map.class);
		System.out.println("strMap = " + strMap);
		Map<String, Object> valueMap = strMap.get(key);
		System.out.println("valueMap = " + valueMap);
java 复制代码
strMap = {10003={"uid":"2","uname":"张三"}}
valueMap = null

解决方案:

发现转化成的Map的key变为String类型的了,此时get Long类型返回为null。

为了由于类型不一致导致的取值问题,现在统一把Map中的key使用string类型。

java 复制代码
        String key = "89765487";
		String returnStr = "{89765487:{\"uid\":\"2\",\"uname\":\"张三\"}}";
		Map<String, Map<String, Object>> strMap = JSON.parseObject(returnStr, Map.class);
		System.out.println("strMap = " + strMap);
		Map<String, Object> valueMap = strMap.get(key);
		System.out.println("valueMap = " + valueMap);
java 复制代码
strMap = {89765487={"uid":"2","uname":"张三"}}
valueMap = {"uid":"2","uname":"张三"}
相关推荐
长谷深风1116 天前
ConcurrentHashMap线程安全机制解析【个人八股】
哈希算法·cas·线程安全·hashmap·多线程并发·分段锁·桶锁
长谷深风1117 天前
JDK8 HashMap底层结构解析
线程安全·红黑树·hashmap·哈希冲突·负载因子·数组链表·哈希扰动
深蓝轨迹8 天前
Java 集合框架超全解 · 底层源码|集合对比|HashMap 扩容原理
java·hashmap·集合框架·arraylist·linkedlist
likerhood19 天前
ConcurrentHashMap底层数据结构和面试常见问题
java·数据结构·面试·hashmap
阿冰冰呀1 个月前
互联网大厂Java求职面试实录:谢飞机的“水货”之路
java·mybatis·dubbo·springboot·线程池·多线程·hashmap
阿维的博客日记1 个月前
Java8 为什么这里把key的hashcode取出来,然后把它右移16位,然后取异或?
hashmap
苏渡苇2 个月前
ConcurrentHashMap.computeIfAbsent():高并发下安全初始化的终极方案
java·安全·jdk·高并发·hashmap·concurrent
aygh2 个月前
互联网大厂Java面试场景:技术问答实录
mybatis·springboot·多线程·hashmap·java面试·arraylist·技术总结
weisian1512 个月前
Java并发编程--16-ConcurrentHashMap演进:从分段锁到CAS+synchronized
java·hashmap·分段锁·cas+同步·longaddr思想
予枫的编程笔记3 个月前
【面试专栏|Java并发编程】ConcurrentHashMap并发原理详解:JDK7 vs JDK8 核心对比
java·并发编程·hashmap·java面试·集合框架·jdk8·jdk7