使用redisson cache来实现一个缓存功能,缓存省市县的名称,key是区域编码,integer,value是name。结果取的时候,怎么都取不出。

Map<Integer, String> regionsMap
regionsMap.get(110000) == null;

找了半天问题才发现regionsMap的key都是字符串。

for (Map.Entry<Integer, String> entry : regionsMap.entrySet()) {
int code = entry.getKey();
String name = entry.getValue();
String s = regionsMap.get(code);
System.out.println(s);
}

java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer

我加入缓存的时候明明是Integer做为key的,清空缓存直接调用没问题,当从缓存取出来fan序列化后就变成了String key.

redisson采用JsonJacksonCodec反序列化时,是用Object作为对象decode.

private final Decoder<Object> decoder = new Decoder<Object>() {
@Override
public Object decode(ByteBuf buf, State state) throws IOException {
return mapObjectMapper.readValue((InputStream) new ByteBufInputStream(buf), Object.class);
}
};

这个会默认把key设置成string。

测试

@Test
public void testMap() throws IOException {
ObjectMapper mapper = new ObjectMapper();
HashMap<Integer, String> map = new HashMap<>();
map.put(1, "a");
map.put(2, "b"); String s = mapper.writeValueAsString(map);
//{"1":"a","2":"b"}
System.out.println(s); HashMap o = (HashMap)mapper.readValue(s, Object.class);
assertEquals(o.get("1"), "a");
assertNotEquals(o.get(1), "a");
}

因此,不要用Integer做为key,如果你想使用Json序列化。

在使用json缓存的时候,同样不要将Integer当作HashMap的key类型。

不要使用Integer做HashMap的key,尤其在json序列化的时候的更多相关文章

  1. Integer做WeakHashMap的Key应注意的问题

    WeakHashMap使用弱引用来作为Map的Key,利用虚拟机的垃圾回收机制能自动释放Map中没有被使用的条目.但是WeakHashMap释放条目是有条件的:首先条目的Key在系统中没有强引用指向: ...

  2. HashMap 中 Key 类型的选择

    什么对象可以作为HashMap的key值? 从HashMap的语法上来讲,一切对象都可以作为Key值.如:Integer.Long.String.Object等.但是在实际工作中,最常用的使用Stri ...

  3. 一个关于自定义类型作为HashMap的key的问题

    在之前的项目需要用到以自定义类型作为HashMap的key,遇到一个问题:如果修改了已经存储在HashMap中的实例,会发生什么情况呢?用一段代码来试验: import java.util.HashM ...

  4. 【转】java8中谨慎使用实数作为HashMap的key!

    java8中谨慎使用实数作为HashMap的key! java8中一个hashCode()函数引发的血案java8中一个hashCode()函数引发的血案1.起因2.实数的hashCode()3.总结 ...

  5. 为什么不建议使用自定义Object作为HashMap的key?

    此前部门内的一个线上系统上线后内存一路飙高.一段时间后直接占满.协助开发人员去分析定位,发现内存中某个Object的量远远超出了预期的范围,很明显出现内存泄漏了. 结合代码分析发现,泄漏的这个对象,主 ...

  6. 指针做MAP的KEY的TEST

    用struct做map的key会需要"operator <"等等,还会出现奇怪的问题可能. 试了下用指针做key,看看效果: #include <iostream> ...

  7. 关于HashMap自定义key重写hashCode和equals的问题

     使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals() hashcode()和equals()都继承于object,在Object类中的定义为: equals( ...

  8. HashMap的key存储对象需要注意哪些

    HashMap的key最好不要存储对象,大部分环境都是String. 如果要存储对象,要注意重写下equal和hashcode方法!!

  9. JAVA - 如果hashMap的key是一个自定义的类,怎么办?

    JAVA - 如果hashMap的key是一个自定义的类,怎么办? 使用HashMap,如果key是自定义的类,就必须重写hashcode()和equals().

随机推荐

  1. 在vue-cli项目中使用bootstrap的方法示例

    在一个html页面中加入bootstrap是很方便,就是一般的将css和js文件通过Link和Script标签就行. 那么在一个用vue-cli生成的前端项目中如何加入?因为框架不一样了,略微要适应一 ...

  2. yii2上传七牛图片(超详细)

    前期准备 1.在七牛注册账号https://portal.qiniu.com/signup/choice 2.创建空间https://portal.qiniu.com/bucket(记住存储空间名称和 ...

  3. C#基础:委托之Action<T>和Func<T>的用法

  4. python-飞机大战

    效果图 main.py import time import pygame from EnemyPlane import EnemyPlane from HeroPlane import HeroPl ...

  5. 【python】廖雪峰python教程学习--基础

     No1: 目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的 No2: 用r''表示''内部的字符串默认不转义 No3: 以'''开头,敲回车可以换行 No4: 布尔 ...

  6. PHP环境配置错误处理

    [Linux apt-get 更换源] 1.问题描述:按照网上的教程编辑源列表文件后发现apt-get update 出现各种错误,导致更新失败 sudo vim /etc/apt/sources.l ...

  7. 笔记-JS高级程序设计-BOM篇

    BOM提供了很多对象,用于访问浏览器的功能.这些功能与任何网页无关. 1BOM的核心对象是window,它代表浏览器的一个实例,它是通过JS访问浏览器窗口的一个借口,同时又是ECMAScript规定的 ...

  8. Django基础(三)

    知识预览 Ajax前戏:json Ajax简介 jquery实现的ajax JS实现的ajax 回到顶部 Ajax前戏:json 什么是json? 定义: JSON(JavaScript Object ...

  9. 【Excel】SUMIF 或用 筛选器 实现挑选含有某些字段的值,然后把这些值所对应的后面某列上的值相加

    Background: 挑选含有某些字段的值,然后把这些值所对应的后面某列上的值相加.比如挑选下表中,所有带有“MX104”这个字段的值,然后把它的后面total那一列的值相加. Solution: ...

  10. AGC 007D.Shik and Game(DP)

    题目链接 \(Description\) 数轴上有一个人,从\(0\)出发到\(E\),速度为\(1\).数轴上还有\(n\)只熊,每只熊会在经过后的\(T\)时刻后产生一个金币.给定\(E,T\)以 ...