Int/Integer 基本类型与封装类型

这是CSDN上的一个帖子,问题如下: 
 

Java代码 

  1. public static void main(String[] args) {  
  2.   
  3.         Integer a = 128;  
  4.   
  5.         Integer b = 128;  
  6.   
  7.         System.out.println(a == b);  
  8.   
  9.     }  



请问输出结果是什么,并给出解释。 

------------------------------------------------------------------------------- 

输出结果为:false,分析如下: 

首先,看看Integer的封装吧: 
 

Java代码 

  1. public static Integer valueOf(int i) {  
  2.   
  3.       final int offset = 128;  
  4.   
  5.       if (i >= -128 && i <= 127) { // must cache   
  6.   
  7.          return IntegerCache.cache[i + offset];  
  8.   
  9.       }  
  10.   
  11.        return new Integer(i);  
  12.   
  13.     }  

当你直接给一个Integer对象一个int值的时候,其实它调用了valueOf方法,然后你赋的这个值很特别,是128,那么没有进行cache方法,相当于new了两个新对象。所以问题中定义a、b的两句代码就类似于: 

        Integer a = new Integer(128); 

        Integer b = new Integer(128); 
这个时候再问你,输出结果是什么?你就知道是false了。如果把这个数换成127,再执行: 

        Integer a = 127; 

        Integer b = 127; 

        System.out.println(a == b); 
结果就是:true 

由上可知,我们进行对象比较时最好还是使用equals,便于按照自己的目的进行控制。 

--------------------------------------------------补充----------------------------------------------------------------------- 

我们看一下IntegerCache这个类里面的内容: 
 

Java代码 

  1. private static class IntegerCache {  
  2.   
  3.    private IntegerCache() {  
  4.   
  5.    }  
  6.   
  7.   
  8.    static final Integer cache[] = new Integer[-(-128) + 127 + 1];  
  9.    static {  
  10.   
  11.        for (int i = 0; i < cache.length; i++)  
  12.           cache[i] = new Integer(i - 128);  
  13.    }  
  14.   
  15. }  



由于cache[]在IntegerCache类中是静态数组,也就是只需要初始化一次,即static{......}部分,所以,如果Integer对象初始化时是-128~127的范围,就不需要再重新定义申请空间,都是同一个对象---在IntegerCache.cache中,这样可以在一定程度上提高效率。 

Java代码 

  1. public static void main(String[] args) {   
  2. Integer b = 0;   
  3. int c = 0;   
  4. if (b == c) {   
  5. System.out.println(true);   
  6. } else {   
  7. System.out.println(false);   
  8. }   



输出的结果为true,但并不意味这他们两个不同类型的值就相等,是因为其过程中系统自动拆箱造成的,b==c的时候java自动拆箱了,最后比较的是两个int 

结论: 
Java中的关系操作符==和!=比较的都是对象的引用,并非对象的内容,如果想比较两个对象的实际内容是否相同,必须使用所有对象都适合的特殊方法equals(),但是,equals()默认行为也是比较引用,所以,一般需要自己重写该方法。注意:equals不适合基本类型。 

转自:https://pengjunwu.iteye.com/blog/587979

猜你喜欢

转载自blog.csdn.net/bin470398393/article/details/85697047