基本类型和包装类型的思考
首先想到基本数据类型和包装类就提出几点问题:
- 什么时候使用包装类型?
- 定义集合对象的时候为什么要选择包装类型?
- 定义pojo的时候,如何选择基本类型和包装类型
- 为什么会有包装类型?
- 为什么会有基本类型?
前言:
在Java语言中,new一个对象存储在堆里,我们通过栈中的引用来使用这些对象。但是对于经常用到的一系列类型如int、boolean… 如果我们用new将其存储在堆里就不是很高效——特别是简单的小的变量。所以,同C++ 一样Java也采用了相似的做法,决定基本数据类型不是用new关键字来创建,而是直接将变量的值存储在栈中,方法执行时创建,结束时销毁,因此更加高效
最简单的理解,基本类型有默认值,而包装类型初始为null。然后再根据这两个特性进行分业务使用,在阿里巴巴的规范里所有的POJO类必须使用包装类型,而在本地变量推荐使用基本类型。
八种基本类型:六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
基本类型 | 字节数 | 位数 | 最大值 | 最小值 |
---|---|---|---|---|
byte | 1byte | 8bit | 2^7 - 1 | -2^7 |
short | 2byte | 16bit | 2^15 - 1 | -2^15 |
int | 4byte | 32bit | 2^31 - 1 | -2^31 |
long | 8byte | 64bit | 2^63 - 1 | -2^63 |
float(单精度) | 4byte | 32bit | 3.4028235E38 | 1.4E - 45 |
double(双精度) | 8byte | 64bit | 1.7976931348623157E308 | 4.9E - 324 |
char | 2byte | 16bit | 2^16 - 1 | 0 |
bolean |
基本类型的包装类:Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail
其中BigInteger、BigDecimal没有相对应的基本类型,主要应用于高精度的运算,BigInteger 支持任意精度的整数,
BigDecimal支持任意精度带小数点的运算。
基本类型与包装类型的异同:
- 在Java中,一切皆对象,但八大基本类型却不是对象。并不具有对象的性质
而包装类型就是未来让基本类型具有对象的特性,具有属性和方法,丰富了基本类型的操作。 - 声明方式的不同,基本类型无需通过new关键字来创建,而包装类型需new关键字。
- 存储方式及位置的不同,基本类型是直接存储变量的值保存在堆栈中能高效的存取,包装类型需要通过引用指向实例,具体的实例保存在堆中。
- 初始值的不同,包装类型的初始值为null,基本类型的的初始值视具体的类型而定,比如int类型的初始值为0,boolean类型为false.
- 使用方式的不同,比如与集合类合作使用时只能使用包装类型。
- 什么时候该用包装类,什么时候用基本类型,看基本的业务来定:这个字段允不允许null值,如果允许null值,则必然要用包装类,否则值类型就可以了,用到比如泛型和反射调用函数.,就需要用包装类!
总结
再回到最初的思考:
- 什么时候使用包装类型:除了局部变量和运算以及需要使用初始值时其他时候都建议使用包装类型。
- 集合类型为什么需要使用包装类型?因为集合属于容器,是用来存储对象类型的,基本数据类型不适合,可以自己创建集合来试下.
- 定义pojo的使用如何选择?建议都适用包装类型,默认是null。但是要注意空值的考虑。 参考:https://blog.csdn.net/ztchun/article/details/79561835
- 为什么会有包装类型?扩展基本数据类型的操作和方法等,集合等使用时需要。
- 为什么会有基本类型?数据存储,存取快捷,使用方便。