Integer 与 int 数值比较?
Integer b1 = 100;
Integer b2 = 100;
Integer c1 = 1501;
Integer c2 = 1501;
if(b1==b2) {
System.out.println("相等");//相等
}else {
System.out.println("不相等");
}
if(c1==c2) {
System.out.println("相等");
}else {
System.out.println("不相等");//不相等
}
乍一看结果是相等的,其实不然。
1,Integer 和 Integer 100 相比较是相等?
2,Integer 和 Integer 127以上 相比较是相等?
答案:
相等
不相等
为什么会这样子?原因是什么?我是不是学了假的Java?
通过查看Integer源代码发现?
你会发现Integer类内部 通过静态内部类提供了一个缓存池,范围在-128~127之间,如果超过这个范围 Integer 值都是new出来的对象,比较的话肯定会出错!
疑问?为什么这么写Integer源码?
Integer缓存了-128~127之间的数,这是在类加载期间就完成的。以后需要的时候直接指向它就可以了,省去了构造对象的开支,提高了效率。
只能采用equals 比较!
查看源码Integer equals方法你会发现
所以
或者
同理Long也是一样
同理
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
Integer i3 = Integer.valueOf(10);
Integer i4 = Integer.valueOf(10);
Integer i5 = new Integer(130);
Integer i6 = Integer.valueOf(130);
Integer i5 = new Integer(130); //直接new Integer i6 = Integer.valueOf(130); //从缓存去拿,但是130大于127 所以new 一个 System.out.println(i6 == i5); //两次都是new 的 所以是fasle
System.out.println(i1 == i2); // false
System.out.println(i2 == i3); // false
System.out.println(i3 == i4); //true
new Integer(10) 每次都会创建一个新对象,Integer.valueOf(10) 则会使用缓存池中的对象。
所以大对象比较值相等使用 equals 比较