装箱:
把基本类型 用它们相应的引用类型 包装起来,使其具有对象的性质。(基本类型
----》 对象)
Integer i1 = 3;
拆箱:
将引用类型的对象 简化成 值类型的数据。
(对象 ----》 基本类型)
System.out.println(i1 + 4); //7
此时 i1 是 Integer对象,4 是基本类型,相加时,则i1 自动拆箱成int类型 + 4 =7。
------------------------------------------------------------------------------------------------------------------------------
延伸:
class Test
{
public static void main(String[] args)
{
String s1 = new String("abc");
String s2 = new String("abc");
Integer i2 = new Integer(10);
Integer i3 = new Integer(10);
Integer i4 = 10;
Integer i5 = 10;
Integer i6 = 137;
Integer i7 = 137;
System.out.println(s1==s2); //1、false
System.out.println(i2==i3); //2、false
System.out.println(i4==i5); //3、true
System.out.println(i6==i7); //4、false
}
}
</span>
对于这个例子,s1==s2 i2==i3 倒好理解,这4个对象都是new的对象,==比较的是引用地址,所以肯定是不相等的。
至于i4==i5 i6==i7 为什么结果不一致呢。
当小于1字节的int类型,-128~127
Integer i4 = 10; int类型的10 装箱成Integer对象,则会将10缓存在池中,
Integer i5 = 10; 当下次再次用到10装箱成Integer对象时,就会从池中获取10封装成相同的对象。
目的:节省了内存空间。因为像这种 小于1字节的数据,会经常用到,就会存在池中,如果每用到1个数据,就去开辟一个空间。将会极大浪费内存空间。没必要 每个数据对应一个对象。这就是一个设计模式:享元模式 flyweight。
很多对象都用的是相同的数据,没必要复制重复的数据,浪费空间。
比如:26英文字母,要是没输入一个字母,都生成一个字母对象,则浪费空间。所以只需要生成26个对象。
在windows中有很多文件夹图标,也是用的同一个图标。
(享元模式):有很多小的对象,具有很多相同的属性,把它们变成一个对象,称之为内部状态。,不同的(变化的)属性,变成方法的参数,称之为外部状态。test(int x,int y) .x.y就是变化的