原生态类型中的坑(一)

原生态类型
8种:boolean、byte、short、char、int、float、long、double
作用:计算机中的运算基础都来源于简单数字,包括Java,即使是包装后的对象,在真正计算时也是通过内在的数字完成的。
它与包装后的对象的区别:
例子:
public static void main(){
Integer a=1;
Integer b=1;
Integer c=200;
Integer d=200;
System.out.println(a==b);
System.out.println(c==d);
}
结果:
true
false
说明:
在编译阶段,若将原始类型int 赋值给Integer 类型, 就会将原始类型自动编译为Integer.ValueOf(int);
如果将Integer类型赋值给int 类型,就会自动转换调用intValue()方法,若此时Integer对象为空,这
时会在自动拆箱时抛出空指针。
出现问题:即使如此,结果也应相同。
探究源码:
public static Integer valueOf( int i){
if(i>=-128&&i<=IntegerCache.high)
return IntegerCache.cache[i+128];
else
return new Integer(i);
}
注:跟踪源码可得IntegerCache.high默认值为127
总结思考:
如果传入的int值在-128~127之间,那么通过Integer.valueOf(int)得到的对象是被cache的,自然的,对
于同一个数字cache的对象是同一块内存地址。对于超过此范围的数值,则会new Integer(int)即创建一个
新的对象。

在使用“==”匹配Integer时在测试范围小时是对的,一旦超过范围就错了,而JavaAPI中未明确说明。确
实是个坑,这也体现了看源码的重要性。

猜你喜欢

转载自www.cnblogs.com/hisir/p/9877805.html
今日推荐