基本数据的自动拆装箱及享元设计模式
自动拆装箱:
自动拆箱:把引用类型转变为值类型
自动装箱:把值类型转变为引用类型
享元模式:
很多小的对象,他们有很多相同的属性,那么我们把它们作为一个对象,他们相同的属性我们叫内部状态;若他们很多对象的属性不同,那我们把它们的属性作为方法的参数,我们叫这些属性为外部状态
例:
- public class AutoBox {
- public static void main(String[] args) {
- Integer iObj = 3;
- System.out.println(iObj + 12); //自动拆箱
- String s1 = "abc";
- String s2 = "abc";
- System.out.println("s1和s2是否指向同一对象:" + (s1 == s2));
- Integer i1 = 13; //自动装箱,将int类型13自动封装成Ingeger类型
- Integer i2 = 13;
- System.out.println("i1和i2是否指向同一对象:" + (i1 == i2));
- Integer i1a = 133;
- Integer i2a = 133;
- System.out.println("i1a和i2a是否指向同一对象:" + (i1a == i2a));
- Integer i3 = Integer.valueOf(3);
- Integer i4 = Integer.valueOf(3);
- System.out.println("i3和i4是否指向同一对象:" + (i3 == i4));
- Integer i3a = Integer.valueOf(423);
- Integer i4a = Integer.valueOf(423);
- System.out.println("i3a和i4a是否指向同一对象:" + (i3a == i4a));
- }
- }
复制代码
运行结果:
15
s1和s2是否指向同一对象:true
i1和i2是否指向同一对象:true
i1a和i2a是否指向同一对象:false
i3和i4是否指向同一对象:true
i3a和i4a是否指向同一对象:false
这里可以看得到i1和i2比较,地址值相同,但i1a和i2a比较,地址值都不同!在这里用到了享元设计模式,当i1值与i2基本数值要装箱成Integer类型时,如果这个值在一个字节之内(-128~127),系统就会将这个数值存起来,放在一个缓冲池里,当要创建下一个数对象时,会到缓冲池中搜索这个值,如果有这个值,值引用指向这个对象,这样就能节省对象空间,降低系统消耗。
当超过了一个字节所能表示的范围,就会成为false,因为可能一个字节里值了出现的频率比较高!
|