bug代码1
public boolean func1() {
int i1 = 1;
int i2 = 2;
if (i1 == i2) {
logger.info("true");
} else {
logger.info("false");
}
}
// 含坑的代码
public boolean func2() {
Integer i1 = 1;
integer i2 = 2;
if (i1 == i2) { // 重点
logger.info("true");
} else {
logger.info("false");
}
}
public boolean func3() {
Integer i1 = 1;
integer i2 = 2;
if ((int)i1 == (int)i2) { // 重点
logger.info("true");
} else {
logger.info("false");
}
}
运行以上三个函数,打印结果分别是true, false和true.
问:为什么func2的执行结果是false不是1,
答:这是因为这里的i1和i2都是引用数据类型,使用 “==” 这个运算符比较的是他们的内存地址,而不是数值。 所以如果我们想要使func2返回true就要在使用 “==” 前对i1和i2进行基本的数据类型转换。
bug代码2
// case1
public Long func1() {
Map<Long, Long> map = new HashMap<>();
map.put(1L, 1L); // 这里的key,value必须是long/Long型数据
map.put(2L, 2L); // 这里的key,value必须是long/Long型数据
return map.get(1);
}
问:为什么case1的map.get(1)返回的是null对象,而不是1呢?
答;这是因为map.get(1)的数值是int类型而不是long/Long类型,int类型占32位而long型占64位,这就决定了输入到map中的比特数不一样,则哈希后得到的值也不同
改进后的代码:将map.get()的输入参数强制转为long类型的数据
// case2
public Long func1() {
Map<Long, Long> map = new HashMap<>();
map.put(1L, 1L); // 这里的key,value必须是long/Long型数据
map.put(2L, 2L); // 这里的key,value必须是long/Long型数据
return map.get(1L);
}