定义:
Java语言是面向对象的语言,而基本数据类型的值不是对象。有时候将简单数据类型的数据进行封装,从而得到的类,就是包装类。
以上就是基本数据类型与之对应的包装类。
包装类的作用:
1、包装类是final修饰的,不能被继承。
2、包装类是不可变类,在构造包装类对象后,不允许更改包装在其中的值。
3、方便在基本数据类型与字符串之间进行转换。
4、可以更加便捷的对基本数据类型进行操作。
5、方便在集合中的存储。
包装类常用方法
包装类拆装箱:
装箱:将基本数据类型封装成包装类对象
拆箱:将包装类对象转换为基本数据类型
JDK1.5 之后可以自动拆箱装箱,也就是在进行基本数据类型和对应的包装类转换时,系统将自动进行,方便了代码的书写。
包装类中常量池:
常量池:
当包装类进行自动装箱操作时,装箱后的对象会存储在一个缓存区中,并且只能存储有且只有一个相同值的对象。这个缓存区就是包装类常量池
包装类Byte,Short,Integer,Long对应的常量池的范围是:-128~127
浮点数对应的包装类没有常量池
字符类型的包装类Character的常量池的范围:0~127
布尔类型的包装类Boolean的常量池就两个值:rue和false
Integer已经默认创建了数值 [-128-127] 的Integer缓存数据。
Integer i1=40时,JVM会直接在对象池中找到该值的引用。也就是说这种方式声明一个Integer对象时,JVM首先会在Integer对象的常量池中查找有没有值为40的对象,如果有则直接返回该对象的引用;如果没有,则新创建一个对象,并返回该对象的引用地址。
因为Java中 “= =” 比较的是两个对象是否是同一个引用(即比较内存地址),因此,根据包装类常量池,i1和i2都是引用的同一个对象,所以 i1==i2 结果为”true“;而使用new方式创建的i4=new Integer(40)、i5=new Integer(40),虽然他们的值相等,但是每次都会重新创建新的Integer对象,不会被放入到对象池中,所以他们不是同一个引用,输出"false"。
对于i1==i2+i3,i4 ==i5+i6结果为True,是因为,Java的数学计算是在内存栈里操作的,Java会对i5、i6进行拆箱操作,其实比较的是基本类型的数值之间的计算,所以他们的值相同,因此结果为"true"。
对于i7==i8返回"false",是因为Integer对应的常量池的范围是:-128~127,超过范围,所以新创建了对象
包装类与基本数据类型的区别:
基本类型存储在堆里,包装类型存储在栈里。因为栈的效率更高,所以保留了基本类型。
包装类是对象,拥有方法和字段,对象的调用是引用对象的地址。
基本类型是值传递,包装类是引用传递。