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
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
相关文章推荐
- Integer类自动装箱、拆箱与享元模式
- Java深入(高新技术)(二):开发环境、静态导入、可变参数、增强for循环、基本数据类型的自动拆箱与装箱、享元模式
- 黑马程序员_ java高新之自动装箱与拆箱(引入设计模式:享元模式)
- jdk1.5新特性4之自动装箱和自动拆箱与享元模式
- jdk1.5新特性4之自动装箱和自动拆箱与享元模式
- 黑马程序员——Java1.5新特性之享元模式、增强for循环、可变参数、静态导入、自动装箱和拆箱
- 《黑马程序员》自动装箱拆箱 (享元模式)
- Java中Integer类的自动装箱和自动拆箱
- 自动装箱与拆箱------->引出享元模式
- 自动装箱拆箱_享元模式
- 黑马程序员_加强11_基本数据类型的自动拆箱与装箱+享元模式
- 基本数据的自动拆箱与装箱及享元模式
- JDK1.5新特性:静态导入、可变参数、增强for循环、自动装箱拆箱(享元设计模式)、枚举、注解、泛型、
- 2017年9月22日 自动装箱和自动拆箱
- java自动装箱和拆箱
- java 自动装箱与拆箱
- java 之自动装箱自动拆箱
- 自动装箱与自动拆箱
- java-基础入门-自动装箱与自动拆箱留给我们的坑
- Java 自动装箱与拆箱(Autoboxing and unboxing)