[Java]JDK源码学习(2)Integer

首先看一段代码

Integer a1 = Integer.valueOf(10);
Integer a2 = Integer.valueOf(10);
System.out.println(a1==a2);

Integer i1 = new Integer(10);
Integer i2 = new Integer(10); 
System.out.println(i1==i2);
System.out.println(a1==i1);

Integer k1 = 10 ,k2 = 10;
System.out.println(k1==k2);
System.out.println(a1==k1);
System.out.println(i1==k1);
		
Integer j1 =177 ,j2 =177;
System.out.println(j1==j2);

这段代码比较了Integer的静态化方法valueOf, 利用java1.5增加的autoboxing将int赋值给Integer和Integer构造方法的区别

代码运行的结果是:
true
false
false
true
true
false

false


下面我们来分析一下为什么是这个结果

1.首先我们来看一下Integer的静态化方法valueOf,Integer类里定义了一个IntegerCache静态类,IntegerCache里有一个cache静态数组,将值在-128-127范围内的Integer缓存好,我们调用valueOf方法时,如果参数在-128-127范围内,则从cache里取得对应的Integer,否则调用构造函数新建一个Integer,所以a1和a2取得是同一个值,不难理解第一个比较结果是true


2.接下来i1,i2都是采用Integer的构造函数来得到的,返回了两个不同的instance,所以第二、三个结果是false


3.接下来这一段是最有争议的,我也看了好多人写的bolg,采用autoboxing没有问题,但他们都认为是Integer k1 = 10编译成Integer k1 = new Integer(10),如果这样的话第四、五、六个结果都应该是false,但实际上却是true、true、false。这说明这句话应该被编译成Integer k1 = Integer.valueOf(10),可以参考一下这个讨论http://stackoverflow.com/questions/766468/autoboxing-so-i-can-write-integer-i-0-instead-of-integer-i-new-integer0


4.通过1和3的分析,我们就可以知道这里用到了autoboxing和valueOf,只是177大于127,所以结果和2一样


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值