一般的我们都知道我们通过直接引用得到的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()引用到对象中,通过最后一组数据我们可以看出,反序列化后基本类型也会被装箱。