简述
1.什么是基本类型包装类,以及为什么要有包装类?
2.演示包装类,装箱和拆箱操作。
3.包装类的常用操作方法。
4.包装类中的缓存设计
一、什么是基本类型包装类,以及为什么要有包装类?
1.我们先来看这样几个问题
- 问题1:面向对象中,一切皆对象,但基本类型变量不是对象,集合框架中只能存储对象类型,那怎么办呢?
- 问题2: 怎样给一个复杂十进制迅速转换成2进制、8进制、16进制?
- 问题3:使用一种数据类型表示成绩,若用double来表示,但是怎么表示一个人缺考和得0分?
上述问题因为基本数据类型缺少对象,如果需要对象,必须先有类。
所以这就是我们包装类的意义,把基本数据类型转换成对象。
2.8种基本类型包装类
其中,Byte、Short、Integer、Long、Float、Double都是Number的子类。
八大基本数据类型的包装类都是final修饰,都是最终类无法被继承
二、演示包装类,装箱和拆箱。
既然包装类是一个类,那就可以实例化一个对象,既然可以实例化对象,那就一定有构造方法。
我们在来看问题1:集合框架中只能存储对象类型,那是不是我们每次都要先用包装类把基本数据类型给装箱再把它存储到集合框架中呢?
那这样是不是太麻烦了,如果它要能自动进行这个操作该多好,对,可以的
我们再来看下边这段代码
编译器竟然没有给我们报错! 不是switch支持的数据类型:byte,short,char,int,怎么会Integer也可以呢?
原来是编译器在底层自动给我们手动拆箱了
自动装箱和拆箱,也是一个语法糖/编译器级别新特性,底层依然是手动装箱和拆箱,但是装箱操作使用的是valueof的方式而不是直接new。
三、包装类的常用操作方法
1.包装类中的常量
2.xxxValue:表示把当前对象转换为xxx类型
示例:将Long类型转换成其他类型
3.String和基本类型/包装类型之间的转换操作:
4.Boolean类型的包装类底层只认true/True,其他的都是false
四、包装类中的缓存设计
我们先来看个例子
public class BaoZhuangHuanCun { public static void main(String[] args) { Integer i1=new Integer(123); Integer i2=new Integer(123); System.out.println(i1==i2); System.out.println(i1.equals(i2)); Integer i3=Integer.valueOf(123); Integer i4=Integer.valueOf(123); System.out.println(i3==i4); Integer i5=123;//自动装箱,底层:Integer.valueOf(123) Integer i6=123;//自动装箱,底层:Integer.valueOf(123) System.out.println(i5==i6); System.out.println("--------------------------------"); Integer i11=new Integer(520); Integer i21=new Integer(520); System.out.println(i11==i21); System.out.println(i11.equals(i21)); Integer i31=Integer.valueOf(520); Integer i41=Integer.valueOf(520); System.out.println(i31==i41); Integer i51=520; Integer i61=520; System.out.println(i51==i61); } }
分割线两侧的代码几乎一模一样,只是变量名和数值更改了一下
我们来看输出结果
这是为什么呢?
包装类中的缓存设计(享元模式):本质就是缓存设计
Byte、Short、Integer、Long:缓存[-128,127]区间的数据;
Character:缓存[0,127]区间的数据;
提高了性能。
包装类型对象之间的比较操作:统统使用equals来比较,比较的是包装数据
注意:Integer和int类型的区别
1.默认值:
int的默认值是0,Integer默认值为null
* 推论:Integer既可以表示null,又可以表示0
2.包装类中提供了该类型相关的很多算法操作方法
* 转换成10进制、8进制、2进制、16进制的方法
3.在集合框架中只能存储对象类型,不能存储基本数据类型值
*
4.请问Integer和int是相同的数据类型吗?
* 肯定不是
* public void ooxx(int val){};
* 共存
* public void ooxx(Integer val){};
* 开发中建议使用包装类型
5.方法中的基本类型变量主要存储在栈中,包装类存放在堆中