java Integer的比较实践(转自blogjava)

来源:互联网 发布:php财务系统源码 编辑:程序博客网 时间:2024/05/17 08:19

package com.test;
public class 解包装包 {
   public static void main(String []args) {
     Integer a = 100;
     Integer b = 100;
     System.out.println(a==b);
   }
}
打印结果为:true
但是如果换成 128 > var >= -128 之外的整数就打false了。
这是什么原因呢?
1。java在编译的时候 Integer a = 100; 被翻译成-> Integer a = Integer.valueOf(100);
2。比较的时候仍然是对象的比较
3。在jdk源码中
。。。
public static Integer valueOf(int i) { 
final int offset = 128; 
if (i >= -128 && i <= 127) { // must cache 
return IntegerCache.cache[i + offset]; 

return new Integer(i); 

。。。

。。。
private static class IntegerCache { 
private IntegerCache(){} 
static final Integer cache[] = new Integer[-(-128) + 127 + 1]; 
static { 
for(int i = 0; i < cache.length; i++) 
cache
 = new Integer(i - 128); 


。。。
这边是java为了提高效率,初始化了-128--127之间的整数对象
所以在赋值在这个范围内都是同一个对象。

再加一句
Integer a = 100;
a++;
//这边a++是新创建了一个对象,不是以前的对象。
    public static void main(String []args) {
        Integer a = 100;
        Integer b = a;
        a++;
        System.out.println(a==b);
    }
打印就是false

对于127--128没有多大关系,但是在这范围之外就影响性能了吧,就像StringBuffer VS String一样了

 

原文地址http://www.blogjava.net/zhaochengming/archive/2007/08/13/136468.html

 

这也就解释了下面代码的结果了

 

结果: 
i1==i2 
i3!=i4 

参见

http://topic.csdn.net/u/20090523/14/443e23d0-6266-4e7d-b4c3-0fbc94aaa23b.html?seed=1562409845

 

JAVA这样做,

哦。。。是为了效率 

才想起来,java “==”就是比较引用,没有重载过 

而由于-128至127内的Interger都是同一个对象引用,所以第一个比较式true 

之外的Interger 则不是同一个对象,所以比较为false 

重载的应该是equals()方法,所以如果用equals来比较应该都为true 

学到了

原创粉丝点击