尽信书,不如无书。java的包装类Integer的深入理解及特殊情况(以及java疯狂讲义第5版170页中的错误)

1.通常情况下,两个包装类型只有在两个引用指向同一对象时,使用 == 进行比较时才会返回true

例如:

Double do1 = Double.valueOf(1.23);
Double do2 = Double.valueOf(1.23);
System.out.println(do1 == do2);
//输出false,do1和do2指向两个不同的对象
Double do3 = do1;
System.out.println(do3 == do1);
//输出true,do3指向和do1同样的对象

可以把包装类当作普通类来看待,只是它们的创建方式比较特殊。

2.特殊情况:Integer类中,数值范围在-128~127时,装箱/自动装箱产生的同值的Integer对象是同一对象

java.lang.Integer中的代码

//创建一个static final 的Integer类型的数组,长度为256
static final Integer[] cache = new Integer[-(-128)+127+1];
//执行static初始化块,初始化数组,数组元素为Integer类型的-128~127
static{
    for(int i = 0;i < cache.length; i++){
        cache[i] = new Integer(i-128);
    }
}

因为java.lang包自动加载,Integer类自动加载,而这个static的cache数组也就会自动创建。因此在虚拟机启动后,就已经存在从-128~127的Integer对象了。

如果装箱/自动装箱,产生的该范围内Integer类型的变量,都将只是指向cache数组某一元素的引用;

如果使用new关键字创建-128~127范围内的Integer对象,则将会在堆内存中重新创建Integer对象,自然与cache数组中的对应对象为不同对象,使用==运算符时,返回false。

因此会有如下结果:

var it1 = new Integer(127);
var it2 = new Integer(127);
System.out.println(it1 ==it2);  //输出false
System.out.println(Integer.valueOf(127) == it1);  //输出false
System.out.println(Integer.valueOf(127) == Integer.valueOf(127));  //输出true

3.书中错误:

《java疯狂讲义第5版》170页:

这个很明显是粗心大意造成的错误,这是不严谨的,但对于初学者(比如我)来说,可能会带来疑惑。如果读者因为懒惰不加以验证,就会种下错误的种子。

还望作者在编写时能更加严谨,读者在困惑时大胆尝试,实践出真理。

 

 

在此感谢本书作者李刚老师,您的《java疯狂讲义》在我入门java语言的初始阶段给了我莫大的帮助,多谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值