1. 问题描述
从数据库中取出来的Integer值,我做EXCEL合并的时候,发现并没有合并。调试后发现 判断等于的函数其实返回false;
然后我写了个测试类,看看究竟什么原因会导致 == 号判断错误
public class Test {
public static void main(String[] args) {
Integer num1 = 100;
Integer num2 = 100;
System.out.println(isEquel(num1,num2));//true
Integer start = new Integer("100");
Integer end = new Integer("100");
System.out.println(isEquel(start,end));//false
}
public static boolean isEquel(Integer start,Integer end){
if(start == null && end == null){
return true;
}
if(start != null && start == end ){
return true;
}
return false;
}
}
发现用字符串初始化,用==号判断是否相等就会输出false。
为什么会这样呢?
2. 探讨为什么出现上面的问题
2.1 Integer存储数字的成员变量 value
2.2. 看构造函数:
呃呃呃,看起来都一样。难道是==号处理不一样?
可惜看不到==号的处理,但是可以猜测 两个Integer 对象直接使用 == 号时并没有判断value值相等。
如果根据C++对==号的默认处理,判断是两个对象的地址值。(PS:当然得看java虚拟机内部怎么写的了)
我翻下一下Integer源码,换了一种方式,用equals 判断是否相等。
equals 源码是这样的
可以发现判断是基本数据类型 int ,所以结果是正确的
3. 问题总结
大概搜了一下,jvm会对小数值直接复用对象,不会创建新的对象,所以才会出现这种情况。