Java语言提供了8种基本数据类型,分别是 byte、short、int、long、float、double、boolean、char。
Java为基本类型提供语言级别的支持,即已经在Java中预定义,用相应的保留关键字表示。
基本类型是单个值,而不是复杂的对象,基本类型不是面向对象的,主要出去效率方面的考虑,但是同时也提供基本类型的对象版本,即基本类型的包装器(wrapper)。
第一类:整数类型
byte 、short 、int 、long
1.byte
- byte 数据类型是8位,用来表示 -128 – 127之间的整数
- 大小:1个字节
- 最小值是 -128(-2^7);
- 最大值是 127(2^7-1);
- 默认值是 0;
byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一。
例子:
byte a = 20;
2.short
用来表示-2^15 – 2^15-1之间的整数。
- short 数据类型是 16 位、有符号的以二进制补码表示的整数
- 大小:2个字节
- 最小值是 -32768 ( -2^15 )
- 最大值是 32767 ( 2^15 – 1 )
- short 数据类型也可以像 byte 那样节省空间,一个 short 变量是 int 型变量所占空间的二分之一
- 默认值是 0
例子:
short b = 20;
3.int
可以表示的数为-2^31 – 2^31-1。
int 数据类型是 32 位、有符号的以二进制补码表示的整数
大小:4字节
最小值是 -2,147,483,648 ( -2^31 )
最大值是 2,147,483,647 ( 2^31 – 1 )
一般地整型变量默认为 int 类型
默认值是 0
例子:
int i = 10;
4.long
可以表示的数为 -2^63 — 2^63-1,常用来表示int表示不了的整数类型。
- long 数据类型: 64 位、有符号的以二进制补码表示的整数
- 大小:8字节
- 最小值:-9,223,372,036,854,775,808 ( -2^63 )
- 最大值: 9,223,372,036,854,775,807 ( 2^63 -1 )
- long 类型主要使用在需要比较大整数的系统上
- 默认值是 0L
例如System.currentTimeMills()方法,返回的是1970.1.1到今天所经历的毫秒数。
这个数字就是int所不能表达的,必须用long来表达。如果long类型还不能表达你所要的整数,推荐用bigInteger,可以表示任意的整数。
第二类:浮点数类型
1.float
float:单精度类型,32 位,后缀 F 或 f。
- float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
- 大小:4字节
- float 在储存大型浮点数组的时候可节省内存空间;
- 默认值是 0.0f;
- 浮点数不能用来表示精确的值,如货币;
例子:
float f1 = 234.5f
2.double
常用来表示浮点数。
- double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
- 大小:8字节;
- 浮点数的默认类型为 double 类型;
- double类型同样不能表示精确的值,如货币;
- 默认值是 0.0d;
例子:
double d = 10.0d;
如果double类也无法达到你所要表示的浮点数,推荐使用BigDecimal来表示,他可以表示任意的浮点数。
第三类:布尔类型
boolean 没有什么好说的,它的取值就两个:true 、false 。
第四类、字符类型
char:2字节
char 类型是一个单一的 16 位 Unicode 字符;
最小值是 \u0000(十进制等效值为 0);
最大值是 \uffff(即为 65535);
char 数据类型可以储存任何字符;
例子:
char c = 'c';
Java包装类
Java 中为每一种基本数据类型提供了相应的包装类,如下:
- Byte <-> byte
- Short <-> short
- Integer <-> int
- Long <-> long
- Float <-> float
- Double <-> double
- Character <-> char
- Boolean <-> boolean
引入包装类的目的就是:提供一种机制,使得基本数据类型可以与引用类型互相转换。
基本数据类型与包装类型的区别:
1. 包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,基本类型不是;
2. 包装类型是引用的传递,基本类型是值的传递;
3. 声明方式不同,基本数据类型不需要new关键字,而包装类型需要new在堆内存中进行new来分配内存空间;
4. 存储位置不同,基本数据类型直接将值保存在值栈中,而包装类型是把对象放在堆中,然后通过对象的引用来调用他们,因此,包装类的效率会比基本数据类型的效率要低。
5.初始值不同,比如:int的初始值为0、boolean的初始值为false,而包装类型的初始值为null;
6. 使用方式不同,基本数据类型直接赋值使用就好,而包装类型是在集合,比如Collection、Map时会使用。
装箱和拆箱
基本数据类型与包装类的转换被称为装箱和拆箱。
装箱(boxing)是将值类型转换为引用类型。例如:int 转 Integer
装箱过程是通过调用包装类的 valueOf 方法实现的。
拆箱(unboxing)是将引用类型转换为值类型。例如:Integer 转 int
拆箱过程是通过调用包装类的 xxxValue 方法实现的。(xxx 代表对应的基本数据类型)。
例子:
Integer i = 10; //装箱 int n = i; //拆箱
一句话总结:装箱就是 自动将基本数据类型转换为包装器类型,拆箱就是 自动将包装器类型转换为基本数据类型。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》