您的位置:首页 > 其它

Integer的自动拆装箱的陷阱(整型…

2017-10-13 16:40 295 查看
package integer;  

  

public class IntegerTest {  

  

    public static void main(String[] args) {  

        // TODO Auto-generated method stub  

        Integer a1 = 127, a2 = 127, b1 = 128, b2 = 128;  

        System.out.println(a1==a2);  

        System.out.println(a1.equals(a2));  

        System.out.println(b1==b2);  

        System.out.println(b1.equals(b2));  

    }  

  

}  

true
true
false

true

引用回答

JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer
i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer
i=128时,128不在常量池范围内,所以在自动装箱过程中需new
128,所以地址不一样。

以上是靠整型数的自动拆装箱实现的,而两者的结果却不相同。

原因在于,在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例。

2、以下是Integer.valueof()的源代码:

[java] view
plain copy

public static Integer valueOf(int i) {  

      assert IntegerCache.high >= 127;  

      if (i >= IntegerCache.low && i <= IntegerCache.high)  

          return IntegerCache.cache[i + (-IntegerCache.low)];  

      return new Integer(i);  

  }  

简单地解释这段代码,就是如果传入的int在IntegerCache.low和IntegerCache.high之间,那就尝试看前面的缓存中有没有打过包的相同的值,如果有就直接返回,否则就创建一个Integer实例。IntegerCache.low
默认是-128;IntegerCache.high默认是127.

 

注:如果要比较两个对象的内容是否相同,尽量不使用== 或者!= 来比较,可以使用equal()来实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: