基本类型与包装类型
基本数据类型
可以分为三类:
-
数值类型。
-
字符类型。
-
布尔类型。
数值类型又分为:
-
整数类型。
-
浮点数类型。
-
整数类型:byte,short,int,long
-
浮点数类型:float,double
-
字符类型:char
-
布尔类型:boolean
基本类型的包装类
Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail
其中BigInteger、BigDecimal没有相对应的基本类型,主要应用于高精度的运算,BigInteger 支持任意精度的整数,
BigDecimal支持任意精度带小数点的运算。
基本类型和包装类型的主要区别
1. 初始值不同
初始值不同,基本类型的初始值如int为0,boolean为false,而包装类型的初始值为null
包装类型可以为 null,而基本类型不可以
2. 使用方式不同
包装类型可用于泛型,而基本类型不可以,泛型不能使用基本类型,因为使用基本类型时会编译出错。
3. 存储方式及位置的不同
基本类型比包装类型更高效。基本类型在栈中直接存储的具体数值,而包装类型则存储的是堆中的引用。
很显然,相比较于基本类型而言,包装类型需要占用更多的内存空间。假如没有基本类型的话,对于数值这类经常使用到的数据来说,每次都要通过 new 一个包装类型就显得非常笨重。
4. 声明方式不同
基本类型不适用new关键字,而包装类型需要使用new关键字来在堆中分配存储空间。
自动装箱和自动拆箱
既然有了基本类型和包装类型,肯定有些时候要在它们之间进行转换。把基本类型转换成包装类型的过程叫做装箱(boxing)。反之,把包装类型转换成基本类型的过程叫做拆箱(unboxing)。
在 Java SE5 之前,开发人员要手动进行装拆箱,比如说:
Integer chenmo = new Integer(10); // 手动装箱
int wanger = chenmo.intValue(); // 手动拆箱
复制代码
Java SE5 为了减少开发人员的工作,提供了自动装箱与自动拆箱的功能。
Integer chenmo = 10; // 自动装箱
int wanger = chenmo; // 自动拆箱
使用场景
见*阿里巴巴Java开发手册*
关于基本数据类型与包装数据类型的使用标准如下:
1) 【强制】所有的POJO类属性必须使用包装数据类型。
2) 【强制】RPC方法的返回值和参数必须使用包装数据类型。
3) 【推荐】所有的局部变量使用基本数据类型。
说明:POJO类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何NPE问题,或者入库检查,都由使用者来保证。
正例:数据库的查询结果可能是null,因为自动拆箱,用基本数据类型接收有NPE风险。
反例:某业务的交易报表上显示成交总额涨跌情况,即正负x%,x为基本数据类型,调用的RPC服务,调用不成功时,返回的是默认值,页面显示为0%,这是不合理的,应该显示成中划线-。所以包装数据类型的null值,能够表示额外的信息,如:远程调用失败,异常退出。