基本类型 | 大小(字节) | 默认值 | 封装类 |
byte | 1 | (byte)0 | Byte |
short | 2 | (short)0 | Short |
int | 4 | 0 | Integer |
long | 8 | 0L | Long |
float | 4 | 0.0f | Float |
double | 8 | 0.0d | Double |
boolean | - | false | Boolean |
char | 2 | \u0000(null) | Character |
void | - | - | Void |
Java基本类型共有八种,基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。8 中类型表示范围如下:
byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。
short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。
int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
boolean:只有true和false两个取值。
char:16位,存储Unicode码,用单引号赋值。
Java决定了每种简单类型的大小,所占的存储空间是不变的。这些大小并不随着机器结构的变化而变化。这种大小的不可更改正是Java程序具有很强移植能力的原因之一。
基本数据类型是放在栈中的,直接存储值,其封装类存储在堆内存中,通过栈内存中引用来来使用,所有数值数据类型都有正负号,没有无符号的数值类型。
一、为什么Java会这么做
在Java中使用基本数据类型来存储支持的基本数据类型,这里没有采用对象,而是使用传统的面向过程语言(C语言)所采用的基本类型,主要是从性能方面考虑:因为即使最简单的数学计算,在使用对象来处理也会引起一些开销,而这些开销对于数学运算本来是毫无必要的。但是在Java中,泛型类包括预定义的集合,使用的参数都是对象类型,无法直接使用这些基本数据类型,所以Java又提供了这些基本数据类型的封装类。
二、基本数据类型与其对应的封装类由于本质的不同,具有一些区别:
1、基本数据类型只能按照值传递,而封装类按照引用传递。
2、基本类型在栈内存中创建;而对于对象类型,对象在堆内存中创建,对象的引用在栈内存中创建。基本数据类型由于在栈内存中,效率比较高,但是可能会存在内存泄漏的问题。
3、int是基本数据类型,Integer是int的封装类,是引用数据类型。int默认值是0,而Integer的默认值是null,所以Integer能区分0和null的情况。一旦Java看到null,就知道这个引用还没有指向某一个对象,在任何引用使用之前,必须为其指定对应的对象,否则会报错。
4、基本数据类型在声明时系统会自动给它们分配空间,而引用数据类型声明时只是在栈内存中分配了引用空间,必须通过实例化在堆内存中开辟数据空间之后才可以进行赋值等操作。
注:数组对象也是引用对象,将一个数组赋值给另一个数组只是在栈内存中添加了一个引用变量,而堆内存中数据并没有增加只是多了一个引用指向改数据空间。所以某个数组所做的修改在另一个数组中也可以看到。