记redis做缓存,反序列化后String类型使用==无法判断

博客探讨了从Redis缓存中获取的String对象在使用==进行比较时返回false的原因,指出这可能与反序列化有关。测试显示,反序列化后的String并未直接放入常量池,而是通过newString引用,导致比较失败。同时,对于Integer类型的比较,展示了基本类型装箱后的相等判断。结论强调了在进行对象比较时应使用equals方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般的我们都知道我们通过直接引用得到的string字符串是存放在常量池中,可以通过==来比较,但是当我从redis缓存中得到的对象的字符串属性,使用==比较为false,只能使用重写的equals

测试:

测试使用的springboot和若依框架的序列化方法。

附上若依官网:http://www.ruoyi.vip/

上代码:

   @Test
    void test3(){
            // 从redis中序列化得到集合
        List<Blog> cacheList = redisService.getCacheList(BlogEnum.BLOGLIST.getValue());
        // 构建一个和数据库中集合相同的对象
        Blog blog = new Blog();
        blog.setBid("123").setId(12).setAuthorId("yyy1");

        // 比较String类型
        System.out.println(cacheList.stream().anyMatch(k -> k.getBid() == blog.getBid()));
        System.out.println(cacheList.stream().anyMatch(k -> Objects.equals(k.getBid(),blog.getBid())));

        // 比较Integer类型
        System.out.println(cacheList.stream().anyMatch(k -> k.getId() == blog.getId()));
        System.out.println(cacheList.stream().anyMatch(k -> Objects.equals(k.getId(), blog.getId())));

        // 再次比较String,排除流式计算的问题
        System.out.println(cacheList.get(0).getBid()==blog.getBid());
        System.out.println(cacheList.get(0).getBid().equals(blog.getBid()));// 这里确保取出来的值不为空

        // 直接比较字符串
        Object name = redisService.getCacheObject("name");
        System.out.println(name == "yyy");
        System.out.println(name.equals("yyy"));

        // 比较Integer
        Integer age = redisService.getCacheObject("age");
        System.out.println((12 == age));
        System.out.println(new Integer(12)==age);
        System.out.println((new Integer(12).equals(age)));
    }

结果:

 

结论:

应该是反序列化的问题,反序列化后,String类型不是直接放在常量池中,而是通过new String()引用到对象中,通过最后一组数据我们可以看出,反序列化后基本类型也会被装箱。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值