问题:
Map<Long,String> 定义的map,用Long的key查询为null。
代码:
public static void main(String[] args) {
Map<Long,String> map1 = new HashMap<>();
map1.put(1L,"001");
map1.put(2L,"001");
map1.put(12345678900000L,"12345678900000L");
String json = JSONObject.toJSONString(map1);
Map<Long,String> map2 = JSON.parseObject(json, HashMap.class);
Long val1 = 1L;
boolean existLong = map2.containsKey(val1);
System.out.println("existLong=" + existLong);
}
打印结果:
existLong=false
问题:
我们想理想的结果是 true ,结果是 false,百思不得其姐。
改造代码:
public static void main(String[] args) {
Map<Long,String> map1 = new HashMap<>();
map1.put(1L,"001");
map1.put(2L,"001");
map1.put(12345678900000L,"12345678900000L");
String json = JSONObject.toJSONString(map1);
Map<Long,String> map2 = JSON.parseObject(json, HashMap.class);
Long val1 = 1L;
Integer val2 = 1;
boolean existLong = map2.containsKey(val1);
boolean existInt = map2.containsKey(val2);
System.out.println("existLong=" + existLong);
System.out.println("existInt=" + existInt);
}
输出结果:
existLong=false
existInt=true
脑袋瓜嗡嗡的吧,剧情完全不是我们想象的样子。
再看看:
似乎明白了所以然,问题出现在 json转map,虽然泛型里限制了Long,而实际上map的key是fastjson默认的类型。这里泛型的知识可自行百度一下:
Map<Long,String> map2 = JSON.parseObject(json, HashMap.class);
总结:
Map还是尽量用String来做key,不然类型能搞死人,而且不报任何错误。
正确的用法:Map<Long,String> map2 = JSON.parseObject(json, new TypeReference<Map<Long,String>>(){});