Java中,数据类型总体可以分为两大类:基本数据类型(值类型)&类类型(数据引用类型)。
基本数据类型的数据不是对象,不能作为对象调用其toString(), hashCode() ,equail(),getClass()等等。
所以Java就专门针对8大基本类型封装了类:
包装类:short Short,byte Byte,int Integer,long Long,double Double,float Filoat,char Char,boolean Boolean。
所谓的装箱:就是把基本类型用他们相应的引用类型包起来,是他们具有对象的特质。如int封装成Integer等
所谓的拆箱:正好和装箱相反,就是把Integer的这种引用类型的对象重新简化为基本类型数据。
知识扩展:
包装类的缓存:
包装类是不可变的,就像String类一样,String类的对象以及创建,便不可改变,所以多个引用指向同一个String对象也不会有什么危险,因此,在编译阶段将String常量置入字符串常量池中,当下次使用时就可以直接从字符串常量池中提取。对于包装类,其对象同样是不可改变的,所以对于某些频繁使用的值,系统提供了包装类的缓存(即预先创建了经常使用的包装类对象,可以参考包装类的valueOf方法),当需要时直接从缓存中提取,而不再创建一个新的包装类对象,这些缓存的包装类的值如下:
boolean的所有值(true和false)
byte的所有值(-128~127)
char值的(0~127)
short值的(-128~127)
int值的(-128~127)
long值的(-128~127)
对于浮点类型的float与double,包装类没有缓存。
对以上的数值进行封箱的时候,并不是创建一个新的对象,而是使用缓存中的对象,这样当重复使用的时候就可以避免重复创建对象造成浪费,因为与String类对象一样,包装类对象时不可变的,因此使用多个引用指向一个包装类时也不会有什么影响。
所以, character c1=127; character c2=127;不论是“equal”还是“==”c1和c2的运算结果都是true.
character c3=128; character c4=128;c3和c4的“equal”运算时true,“==”运算时false。
Interger i1= new Integer(20);
Interger i2= new Integer(20);
System.out.println(i1==i2); 结果是false而不是true;请仔细体会之。
参考文献地址:http://hi.baidu.com/smilehaha/item/
http://changwu0101.blog.163.com/blog/static/