Java中有8种基本数据类型,而这8种基本数据类型又各自对应着一种包装类。包装类的引入主要是 为了解决使用泛型时发生的一些问题。
包装类的使用:
1.装箱(装包):将基本数据类型变为对应的包装类
2.拆箱(拆包):将包装类变为对应的基本数据类型
自动拆箱和自动装箱是工作在编译期间的一种机制,java提供的自动机制
int i = 10;
Integer n = i; //自动装箱 int-->Integer
Integer m = (Integer)i; //自动装箱
int o = n; //自动拆箱 Integer-->int
int p = (int) n; //自动拆箱
两个变量自动装箱后,是否相等(==)?
eg:
Integer a = 10;
Integer b = 10;
System.out.println(a == b);//true
Integer a1 = -10;
Integer b1 = -10;
System.out.println(a1 == b1);//true
Integer a2 = 128;
Integer b2 = 128;
System.out.println(a2 == b2);//false
Integer a3 = -129;
Integer b3 = -129;
System.out.println(a3 == b3);//false
从上述可看出,两个变量的值不同,它们可能会“==”,也可能不会;
通过查看源码可以了解到:对于Integer而言,在内存当中已经有[-128, 127]这固定的256个数值了,所以每次创建的数字在这个区间,都会直接返回一个该对象的引用,若创建的数字不在这个区间,则会另外新创建一个对象来存储该数字,固然,所返回的引用也是不相同的。
同理对于Byte、Short、Character、Long而言也是一样的,在固定的区间内,所创建对象的引用都是相同的;而对于Double、Float而言,则不同,因为在一个固定的区间里,浮点数的个数是无限的,所以每次创建出的对象的引用都是不相同的。Integer、Short、Long创建对象引用相同的范围是相同的。
装箱的操作会创建对象,频繁的装箱操作会消耗大量的内存,所以应尽量避免使用。