首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java学习札记:装箱和拆箱,包装器和缓冲池

2012-10-17 
java学习笔记:装箱和拆箱,包装器和缓冲池jdk1.5以后用Integer举例Integer a 3????????????? 这是自动装

java学习笔记:装箱和拆箱,包装器和缓冲池

jdk1.5以后
用Integer举例
Integer a = 3;????????????? 这是自动装箱
int???? i = new Integer(2); 这是自动拆箱
就是基本类型和其对应的包装类型在需要的时候可以互相转换,具体过程由编译器完成
比如自动装箱:
Integer a=3;
其实编译器调用的是static Integer valueOf(int i)这个方法
查阅JDK知道,
valueOf(int i)返回一个表示指定的 int 值的 Integer 对象
那么就变成这样: Integer a=3;?? =>??? Integer a=Integer.valueOf(3);

?

对应的? int intValue()? 返回该 Integer对象的int值,是拆箱

?

我们再来看Integer缓存,?
下面是IntegerCache类的源码,我加上了注释,便于讨论

知道了这些原理

我们再来看一些网上关于java的有趣问题,就能知道答案了

下面我们对一网友帖子中的问题的做解答,我当时也是看到这个帖子才baidu学到这些内容的

http://xiaoyu1985ban.iteye.com/blog/1384191

主题:java迷题:等于,还是不等于?

代码片段1

public static void main(final String[] args) {??

??? Integer a = new Integer(100);??

??? Integer b = 100;??

??? System.out.println(a == b);???

}?

解答:

结果输出 false

因为new Integer(100)是指明了再堆内存中创建对象

而Integer b = 100; 这句是自动装箱,

得到的是Integer缓冲池中的对象,是这句代码return IntegerCache.cache[100 + 128]

明显a和b的地址是不一样的,不是同一个对象

?

代码片段2

public static void main(final String[] args) {??

??? Integer a = 100;??

??? Integer b = 100;??

??? System.out.println(a == b);???

}?

解答:

结果输出 true

a和b指向了同一个对象,都是IntegerCache.cache[100 + 128]

?

代码片段3

public static void main(final String[] args) {??

??? Integer a = 156;??

??? Integer b = 156;??

??? System.out.println(a == b);???

}?

解答:

结果输出 false

由于156大于128,它的包装对象不在缓冲池中,而是执行 return new Integer(156);

new了2次,都在堆内存中,但地址不一样

?

代码片段4

public static void main(final String[] args) {??

??? Integer a = Integer.valueOf(100);??

??? Integer b = 100;??

??? System.out.println(a == b);???

}

解答:

结果输出 true

我们上面说过了,Integer b = 100 就相当于Integer b=Integer.valueOf(100)

所以a和b指向缓冲池中的同一对象

?

?

?

能说为啥莫 能说为啥莫
这2句话,我也是在网上看到的,我查了下java文档源码
    public static Double valueOf(double d) {
        return new Double(d);
    }
它确实没有用到缓冲池
对比Integer的valueOf方法,是不一样的,所以才有这个结论的吧!
你认为呢?
能说为啥莫
这2句话,我也是在网上看到的,我查了下java文档源码
    public static Double valueOf(double d) {
        return new Double(d);
    }
它确实没有用到缓冲池
对比Integer的valueOf方法,是不一样的,所以才有这个结论的吧!
你认为呢?

我不是很清楚,

热点排行