您的位置:首页 > 编程语言 > Java开发

Java学习之Integer封装与拆箱

2017-02-28 17:39 155 查看
我们都站在巨人的肩膀上

Integer自动封装的陷进

示例:

public static void main(String[] args) {
Integer a=1000,b=1000;
Integer c=100,d=100;

System.out.println(a==b);//false
System.out.println(c==d);//true
}


以上两个比较为什么一个true,一个false?相信很多人在实际项目中,或者学习中有遇到过,这个问题我们看Integer的源码就会一目了然:

public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
//IntegerCache.low = -128, IntegerCache.high = 127
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}


注意:此时会进行自动装箱操作,简单点说,也就是把基本数据类型转换成Integer对象,而转换成Integer对象正是调用的valueOf方法,可以看到,Integer中把-128至127 缓存了下来。官方解释是小的数字使用的频率比较高,所以为了优化性能,把这之间的数缓存了下来。这就是为什么这道题的答案回事false和ture了。当声明的Integer对象的值在-128-127之间的时候,引用的是同一个对象,所以结果是true。

Integer自动拆箱机制

public static void main(String[] args) {
Integer a = new Integer(1000);
int b = 1000;
Integer c = new Integer(10);
Integer d = new Integer(10);

System.out.println(a == b);//true
System.out.println(c == d);//false
}


注意:这里的Integer是我们自己new出来的,并不是用的缓存,所以结果是false。 当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,也就是把Integer转成int类型,所以这里进行比较的是int类型的值,所以结果即为true。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  integer 装箱 拆箱 Java