您的位置:首页 > 其它

Integer类自动装箱、拆箱与享元模式

2011-04-28 15:32 288 查看
从JDK1.5开始java添加了一个新特性:自动装箱和拆箱。这极大的简化了简单类型与包装类型之间的转换,那么自动装箱和拆箱是怎么实现的呢?现来看一行源代码:Integer a = 125;[align=LEFT]用javap工具查看其字节码为:[/align][align=LEFT] 0: bipush 125
2: invokestatic #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
[/align][align=LEFT] 可以发现Integer类的自动装箱是通过调用类的静态方法valueOf实现的。[/align][align=LEFT]阅读Integer类的源代码发现该类还用到了享元模式,对于范围在-128~127的int类型数,不是新创建一个对象,而是返回内存中已有的对象,对于不在此范围里的数则新创建一个对象。可以看一段代码:[/align][align=LEFT] Integer a = 125;
Integer b = 125;
System.out.println(a == b);

Integer a1 = 128;
Integer b1 = 128;
System.out.println(a1 == b1);
[/align][align=LEFT]输出是:[/align][align=LEFT]true
false[/align][align=LEFT]这是怎么实现的呢?[/align][align=LEFT]原因就在于在Integer类里有个内隐类IntegerCache,存放-128~127范围内的对应Integer类对象。[/align][align=LEFT]该类的静态方法valueOf的实现是当数在此范围之内时直接返回内隐类IntegerCache中存放的对应的Integer类对象,否则用new新生成一个对象。这个就是设计模式中的享元模式吧。[/align][align=LEFT]
[/align][align=LEFT]那自动拆箱呢?[/align][align=LEFT]也先来看两行代码:[/align][align=LEFT]Integer a = 125;
int b = a;[/align][align=LEFT]其字节码指令为:[/align][align=LEFT] 0: bipush 125
2: invokestatic #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
6: aload_1
7: invokevirtual #22; //Method java/lang/Integer.intValue:()I
10: istore_2
11: return
[/align][align=LEFT]可以看到自动拆箱是调用Integer类的成员方法intValue()实现的,而intValue方法就一行语句”返回其value值。[/align]本文出自 “技术爱好者” 博客,请务必保留此出处http://chenqiangjsj.blog.51cto.com/2331729/555547
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: