Long包装类型采坑记录
说明:一般面试中会问到基本类型和包装类型的区别,还有就是Integer的在java8中的缓存值得范围是哪里到哪里
公布答案吧,-128~127,这是面试基本都会问到的,可以搜索一下关于这个特性的解答,很容易问道
情景再现
最近在网上看到一篇贴子封装的是redis工具类,判断redis过期时间或者删除是否成功,redis操作的返回值都是数值类型
所以需要进行判断
代码如下
/**
* 删除指定key
*/
@Test
public void test6() {
// redisUtil.set("k11","v11");
// redisUtil.set("k22","v22");
redisUtil.set("k33", "v33");
redisUtil.set("k44", "v44");
Long delete = redisUtil.delete("k11", "k22");
System.out.println("如果不存在指定的key,那么返回值long类型的值为: " + delete);
if (delete.equals(0)) {
System.out.println("删除的指定的key就不存在");
}
if (delete > 0) {
System.out.println("删除指定的多个key成功");
}
Long delete2 = redisUtil.delete("k33");
if (delete2 > 0) {
System.out.println("删除指定的一个key成功");
}
}
问题就是出在
if (delete.equals(0)) ,其实就是一个简单的判断,但是使用Long类型==和equals比较的结果就是不同
测试
代码如下
public class App {
public static void main(String[] args) {
Long l1 = 0L;
System.out.println(l1 == 0);
System.out.println(l1.equals(0));
System.out.println(l1.equals(0L));
}
}
控制台打印:
true
false
true
总结
1.技术总结
有的一些小的技术点,容易在项目中出bug,我们有时候发现不了,其实就是一些细节和原理我们之前没有采坑,所以很容易忽视,想到之前我在工作中字符窜比较使用的是==,当时这个bug最后发现真的是伤脑筋,后面关于string的比较我都是使用的equals方法
为什么l1.equals(0)为false,因为0默认使用的是Integer,所以比较当然是false
2.使用总结
以后我们使用包装类型时候使用==比较,因为它会先进行拆箱之后再进行比较
3,自己总结
我们以后如果确定不了使用==和equals,我们可以写个测试案列进行测试,况且浪费不了多少时间,一分钟作用,这样避免以后出bug