目录
一、为啥还要引入包装类?
1、一是Java是万物皆对象的,基本数据类型并不是对象;
2、二是很多方法的入参都是Object类型,基本数据类型并不能满足;
3、三是很多时候我们获取到对象后会去get它的值,如果是基本数据类型就容易出现NPE,也是就是空指针异常,如果是包装类就不会出现NPE,而是null;
例:可以想象一个场景,比如记录一场考试,假如有一个分数为0,那么他是没来考试呢,还是他考了0分了,就不好区分,需要额外的字段开销去维护。如果为包装类,那么为null的是没来考试的,为0的是考0分的,就比较好区分。
二、基本数据类型和包装类的存储
基本数据类型
基本数据类型的值直接存储在变量的内存空间中,且有固定的大小和表示范围。在栈内存中分配存储空间,变量的生命周期随着作用域的结束而结束,也就是说基本数据类型用完就释放了。
包装类
而包装类引用变量存储在栈中,其对象存储在堆中,他们的生命周期由程序控制,当没有引用指向的时候会被Java的垃圾回收机制自动回收。还有一点就是,Integer中-128到127是存储在常量池Integer Cache里面的,在我们int自动装箱的时候,如果值是这个范围里面的,会直接从常量池里去获取,而不是new一个。
如下图:
三、什么时候用?
这里简单的推荐一下,
基本数据类型
我们在局部变量使用,通常在局部变量定义的我们也不会去get和set,就解决了可能出现的NPE,而且局部变量用完就释放也是非常契合。再就是在循环中,不需要考虑空,需要大量迭代中去使用,因为基本数据类型的效率相对于包装类高。
包装类
1、rpc方法中使用,即需要被远程调用的方法入参。
2、pojo类,像我们的数据库表映射成类,用包装类型就可以处理某些字段为空的情况,而且包装类也可以提供各种工具方法,比如数据格式化,拆分等等。
注:可能很多人不太懂这个pojo类的意思,pojo类就是简单的对象,只用来装载数据,不涉及任何的业务操作,它没有实现接口也没有继承,它与Javabean有一个区别就是不用实现序列化接口和提供无参构造。