[Java]JDK源码学习(2)Integer
2011-09-14 16:04
357 查看
首先看一段代码
这段代码比较了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 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一样
相关文章推荐
- java核心基础--jdk源码分析学习--Integer
- java学习之旅63常用类_包装类_Integer_Number_JDK源码分析
- JDK 1.7 java.io 源码学习之AutoCloseable接口和try-with-resources语法
- Java源码学习之Integer类(一)
- java核心基础--jdk源码分析学习--ArrayList
- JDK源码学习(6)-java.util.HashSet & java.util.LinkedHashSet & java.util.TreeSet
- JDK 1.7 java.io 源码学习之InputStream和OutputStream
- java源码学习2-Integer
- Java容器类源码学习——jdk1.8版本下的ArrayList扩容
- JDK源码学习(3)-java.util.ArrayList与LinkedList
- Java源码学习之Integer类(二)——1.8新增的几个函数和变量
- JDK1.8源码学习之Map.java
- Integer源码学习(JAVA)
- JDK 1.7 java.io 源码学习之ObjectInputStream和ObjectOutputStream
- 【JDK】:java.lang.Integer源码解析
- java核心基础--jdk源码分析学习--HashMap
- java的String学习加JDK源码的学习
- JDK源码-java.lang.instrument-第一部分-源码学习
- JAVA源码之JDK(二)——Integer、Long、Double - 韩某
- java核心基础--jdk源码分析学习--String