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

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

2011-09-14 16:04 357 查看
首先看一段代码

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一样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  integer java jdk cache