、基本数据的自动拆装箱及享元设计模式
自动拆装箱:
自动拆箱:把引用类型转变为值类型
自动装箱:把值类型转变为引用类型
享元模式:
很多小的对象,他们有很多相同的属性,那么我们把它们作为一个对象,他们相同的属性我们叫内部状态;若他们很多对象的属性不同,那我们把它们的属性作为方法的参数,我们叫这些属性为外部状态
例:
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,因为可能一个字节里值了出现的频率比较高!