Java语言的数据类型是Java语言中最基础也是最重要的知识,参加Java笔试的时候应该是必考的,参加面试的时候也有可能会问到,以此考察面试者对Java基础知识的掌握程度。
Java语言的数据类型可以分为:基本数据类型和引用数据类型。在Java中,引用数据类型的变量非常类似于C/C++的指针,对象、数组都是引用数据类型。本文重点介绍Java的基本数据类型。
Java语言内置的基本数据类型共有8种,可以分为四类:
整数类型
四种整数类型分别有不同的位数:
有符号数是指数值有正负号的区别。计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
二进制补码:正整数的补码是其二进制表示;0的补码就是全0;负整数的补码是除符号位外的所有位取反后加1。
比如byte类型-5的补码:-5带符号位是10000101,除符号位全部取反是11111010,再加1就是11111011,就得到了-5的补码。
浮点类型
float 数据类型是单精度32位、符合IEEE 754标准的浮点数;double 数据类型是双精度64 位、符合IEEE 754标准的浮点数。IEEE 754标准是一种浮点数的表示形式,篇幅有限,本文暂不做详细描述。
float 比 double 更节省空间,double可以存储精度更高的浮点数。两者均不建议用来表示货币,货币应该用整数类型表示。
字符类型
char类型是一个16 位 Unicode 字符,最小值是 u0000(即为 0);最大值是 uffff(即为65535)。
布尔类型
boolean数据类型只有两种取值,true(真)或false(假)。
默认值和取值范围
每一种基本数据类型都有系统默认值,在JVM为其分配内存的时候就会以系统默认值初始化。现将每一种数据类型的默认值和取值范围总结如下。
基本数据类型的默认值和取值范围
对于每一种数据类型的取值范围,我们不需要刻意记忆,这些取值范围都已经以常量的形式定义在基本数据类型对应的包装类中。
基本类型与对应包装类
每一种基本类型,在java.lang中都有对应的包装类,比如boolean类型对应的包装类是 java.lang.Boolean。将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法来操作该数据。比如包装类的 toString() 方法用于基本数据类型与字符串之间的转换。
类型转换
基本数据类型的类型转换分为自动类型转换 和 强制类型转换。
自动类型转换,也称隐式类型转换,是指不需要书写代码,由系统自动完成的类型转换。转换规则:从存储范围小的类型到存储范围大的类型。
byte b = 10;
short sh = b;
因为 b 是byte型,存储范围比short型小,所以JVM可以自动把 b 转换为short型,并赋值给 sh.
强制类型转换,也称显式类型转换,是指必须书写代码才能完成的类型转换。转换规则:从存储范围大的类型到存储范围小的类型。可能会造成精度损失。
double pi = 3.14;
int p = (int) pi; //这里就是强制转换
因为 double型的存储范围比 int型大,所以必须使用强制类型转换 把 pi 转换为 int型。
基本数据类型的存储
那么在程序中定义的基本数据类型,JVM会如何存储呢?这个要看情况。
Java方法中定义的基本数据类型,属于局部变量,存放在虚拟机栈(VM Stack)中。
Java类中定义的基本数据类型,如果是非静态成员变量,其所在类被实例化后,是放在堆内存(Heap)中的。如果是静态成员变量,那么在类加载以后,就会在方法区内为其分配内存。
基本数据类型的内存分配
关于JVM内存如何划分,可以参考前文《Java面试必考问题:JVM内存区域如何划分? 》。
基本数据类型的传递
基本数据类型可以作为传递方法的参数,这里要注意和引用数据类型作为方法参数之间的区别。
当方法参数类型是基本数据类型时,方法是不能修改基本数据类型的数值;当传递方法参数类型是引用类型时,比如对象或数组,方法是可以修改引用所指向的对象的状态的。
关于Java基本数据类型的话题基本聊得差不多了,掌握这些基础知识,对于我们参加面试还是非常有帮助的。