在Java中共有8中基本类型数据,同时每种基本类型又有对应的包装类
基本类型
Java共有8种基本数据类型,它们分别如下表所示:
基本数据类型 | 类型 | 所占字节 |
byte | 数值型 | 1字节 |
short | 数值型 | 2字节 |
int | 数值型 | 4字节 |
long | 数值型 | 8字节 |
float | 数值型 | 4字节 |
double | 数值型 | 8字节 |
char | 字符型 | 2字节 |
boolean | 布尔型 | |
基本类型的占用空间大小
- byte(字节)用无符号的8位表示,它的取值范围是[-2^7, 2^7-1]。它是最小的整型类型,通常用于网络传输、文件或者其他I/O数据流。默认值是0。
- short(短整型)用有符号的16位表示,它的取值范围是[-2^15, 2^15-1]。从日常的观察来看,short类型可能是最不常用的类型了。完全可以用int来替代它,因为我们通常不需要过多地担心内存容量问题。默认值是0。
- int(整型)用有符号的32位表示,它的取值范围是[-2^31, 2^31-1],计算机中用存放的是整型数值的二进制补码。默认值是0。
- long(长整型)用有符号的64位表示,它的取值范围是[-2^63, 2^63-1]。它的字面量表示以l或者L结束,如 long a = 45454L。默认值是0L。
- float(单精度浮点型)用32位表示,遵循IEEE 754规范。如果数值精度要求不高时,可以使用这种类型。float类型字面量值通常以f或者F结束。由于整型可以自动转换为float类型,所以,我们也可以将整型字面量值直接赋予float类型变量。默认值是0F。
- double(双精度浮点型)用64位表示,遵循IEEE 754规范。它能表示比float更高精度的数值。double是Java基本类型中能达到的最高精度,如果还不能满足要求,可以使用Java中的BigDecimal类。默认值是0.0。
- char(字符)用无符号的16位表示,它的取值范围是[0, 2^16-1]。Java中使用Unicode字符集来表示字符,Unicode将人类语言的所有已知字符映射成16位数字,所以Java中的char是16位的。默认值是\u00000。
- boolean( 布尔型)只要true和false两个字面量值,可用于逻辑判断。boolean只能表示1位的信息量,但是它的大小并没有精确地定义。
类型转换
Java中除了boolean类型之外,其他7中类型相互之间可以进行转换。转换分为自动转换和强制转换。对于自动转换(隐式),无需任何操作,而强制类型转换需要显式转换,即使用转换操作符(type)。7种类型按照其占用空间大小进行排序:
byte <(short=char)< int < long < float < double
类型转换的总则是:小可直接转大、大转小会失去精度。
包装类
Java中每一种基本类型都会对应一个唯一的包装类,基本类型与其包装类都可以通过包装类中的静态或者成员方法进行转换。每种基本类型及其包装类的对应关系如下,值得注意的是,所有的包装类都是final修饰的,也就是它们都是无法被继承和重写的。
基本数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
拆箱与装箱
装箱:将基本类型转换成包装类的过程
拆箱:将包装类转换成基本类型的过程
在jdk1.5之后提供了自动拆装箱
区别
- 基本类型是直接用来存储值的,放在栈中方便快速使用,包装类型是类,其实例是对象,放在堆中
- 基本类型不是对象,因此没有方法,包装类型是类,因此有方法
- 基本类型直接赋值即可,包装类型需要使用new关键字创建
- 包装类型初始值为null,基本类型初始值不为null,是根据类型而定的
包装类型将基本类型的值包装在对象中,这样就可以使用对象的方法操作基本类型,类型之间的转换需要使用包装类型的方法才能完成,因此需要有包装类型。
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2); //①true
System.out.println(i3==i4); //②false
}
①处结果为true,②处为false
Integer i1 = 100;执行的操作是100先通过valueOf()方法进行装箱操作,Integer.valueOf()的源码如下:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Integer比较特殊,在-128到127之间,会走缓存,不在这个区间的数会走new Integer(i),也就是会创建新的对象,因此,100比较的时候是true,200比较的时候是false
基本类型和字符串之间的转换
在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换。
基本类型转换为字符串有三种方法:
- 使用包装类的 toString() 方法 Integer.toString(10)
- 使用String类的 valueOf() 方法 String.valueOf(10)
- 用一个空字符串加上基本类型,得到的就是基本类型数据对应的字符串 10 + ""
将字符串转换成基本类型有两种方法:
- 调用包装类的 parseXxx 静态方法 Integer.parseInt("10");
- 调用包装类的 valueOf() 方法转换为基本类型的包装类,会自动拆箱 Integer.valueOf("10");