基本类型有默认值,而包装类型初始为null。然后再根据这两个特性进行分业务使用,在阿里巴巴的规范里所有的POJO类必须使用包装类型,而在本地变量推荐使用基本类型。
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
1、整数:包括int、short、byte、long初始值为0。
2、浮点型:float、double初始值为0.0
3、字符:char初始值为空格,即'' ",如果输出,在Console上是看不到效果的。
4、布尔:boolean初始值为false
基本型别 | 大小 | 最小值 | 最大值 |
boolean | ----- | ----- | ------ |
char | 16-bit | Unicode 0 | Unicode 2^16-1 |
byte | 8-bit | -128 | +127 |
short | 16-bit | -2^15 | +2^15-1 |
int | 32-bit | -2^31 | +2^31-1 |
long | 64-bit | -2^63 | +2^63-1 |
float | 32-bit | IEEE754 | IEEE754 |
double | 64-bit | IEEE754 | IEEE754 |
void |
注意:
表格里的^代表的是次方
Java采用unicode,2个字节来表示一个字符,1个字节等于16位。
基本类型的包装类
Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail
其中BigInteger、BigDecimal没有相对应的基本类型,主要应用于高精度的运算,BigInteger 支持任意精度的整数,
BigDecimal支持任意精度带小数点的运算
基本类型:int 、double、float、long、byte、boolean、char
封装类型: integer 、Double、Float、Long、Byte、Boolean、Char基本类型的特点
1、基本数据类型在进行参数传递时,使用的是值传递
2、基本类型的创建是在堆栈上创建的(有泄漏问题)
3、创建不是通过new进行的
封装类型的特点
1、通过new进行创建,也可以直接进行赋值
2、进行参数传递的时候是使用的“引用传递”既地址传递的方式
3、创建是在堆上创建的
4、数据类型包装类的值是不可变的
封装类型的优势:
创建封装类型是可以使用一些基本类型不具备的方法,比如valueOf(),toString()等等。还有你如果想传递一个int对象的引用,而不是值,那只能用封装类
基本类型与包装类型的异同:
1、在Java中,一切皆对象,但八大基本类型却不是对象。
2、声明方式的不同,基本类型无需通过new关键字来创建,而封装类型则需new关键字。
3、存储方式及位置的不同,基本类型是直接存储变量的值,保存在堆栈中能高效的存取;封装类型需要通过引用指向实例,具体的实例保存在堆中;
4、初始值的不同,封装类型的初始值为null,基本类型的的初始值视具体的类型而定,比如int类型的初始值为0,boolean类型为false;
5、使用方式的不同,比如与集合类合作使用时只能使用包装类型。
6、什么时候该用包装类,什么时候该用基本类型,看基本的业务来定:这个字段允不允许null值,如果允许,则必然要用封装类;否则,基本类型就可以了。如果用到比如泛型和反射调用函数,就需要用包装类!
源码
看看 Boolean
的属性和构造方法,了解一下它如何包装 boolean
// final boolean类型的属性,通过构造方法注入值
private final boolean value;
// 构造方法 Boolean a = true 实际上就是调用这个方法
public Boolean(boolean value) {
this.value = value;
}
// 构造方法
public Boolean(String s) {
this(parseBoolean(s));
}
简单来说就是,boolean 定义的属性一定要有值,如果 Boolean
对象值为 null
,解包过程中就会出现NPE
基本数据类型和包装类型使用标准
注:
包装类的赋值方法是valueof但是从Java5.0(1.5)开始,JAVA虚拟机(Java Virtual Machine)可以完成基本类型和它们对应包装类之间的自动转换。因此我们在赋值、参数传递以及数学运算的时候像使用基本类型一样使用它们的包装类,但这并不意味着你可以通过基本类型调用它们的包装类才具有的方法。另外,所有基本类型(包括void)的包装类都使用了final修饰,因此我们无法继承它们扩展新的类,也无法重写它们的任何方法。
看一下valueof的源码了解缓存机制
public static Integer valueOf(int i) {
assert IntegerCache.high>= 127;
if (i >= IntegerCache.low&& i <= IntegerCache.high)
return IntegerCache.cache[i+ (-IntegerCache.low)];
return new Integer(i);
}
各个包装类缓存值范围 :
boolean:true和false
byte:-128~127
char:0~127
short:-128~127
int:-128~127
long:-128~127
float和double没有缓存
在缓存范围内的值相当于已经开辟好了一块空间,或者是已经new好了对象