目录
一、概述
基本数据类型是Java语言中内置的类型,共4大类(整数类型、小数类型、字符类型、布尔类型),8小种。其中4种整型、2种浮点类型、1种用于表示Unicode编码的字符和1种用于表示真值的布尔类型。
引用数据类型是强大的数据类型,它是基于基本数据类型创建的。JavaSE中提供了一个超级类库,类库中包含了近万种引用数据类型。
类型 | 名称 | 存储所需字节 | 取值范围 |
整型 | byte | 1 | -128~127 |
short | 2 | -2^15~2^15-1(-32768~32767) | |
int(默认) | 4 | -2^31~2^31-1(-2147483648~2147483648)超过20亿 | |
long | 8 | -2^63~2^63-1 | |
浮点型 | float | 4 | -3.403E38~3.403E38(有效位数为6~7位) |
double(默认) | 8 | -1.798E308~1.798E308(有效位数为15位) | |
字符型 | char | 2 | 表示一个字符,如('a','A','0','家') |
布尔型 | boolean | 1 | 只有两个值true与false |
更加详细内容见下图。
二、基本数据类型
2.1、整数类型
由于Java的跨平台性,整型的范围与运行代码机器无关,必须确保在所有机器上运行能够取得相同的结果,因此各种数据类型取值范围必须固定。而C/C++需要针对不同的处理器选择最为高效的整型,一个运行在62位处理器上的程序很有可能在32位系统上运行时发生整数溢出(C/C++,在32位处理器上long值为4个字节,在64位处理器上则为8个字节)。
① 二进制表示方式:前缀为0b/0B,如0b1011(十进制中11)、0B1001(十进制中9)。
② 八进制表示方式:前缀为0,如01(十进制中1)、07(十进制中7)、0721(十进制中465)。显然八进制表示法很容易发生混淆,建议最好不要使用
③ 十进制表示方式:正常数字,如 13、25等。
④ 十六进制表示方式:前缀为0x/0X,数字以0-9及A-F组成, 如0x23A2(十进制中9122)、0xa(十进制中10)、0x10(十进制中16)。
附:从Java7开始,可以在数字字面量加下划线,如用1_000_000(或0b1111_0100_0010_0100_0000)来表示一百万。这些下划线只是为了更具通读性,Java编译器会去除这些下划线。
2.2、浮点类型
float类型的值需要一个后缀F/f(如,5.4F),而double类型的值可以加后缀D/d(如,5.4D)或者直接省略后缀(如,5.4),下面有三个特殊的浮点数值:
正无穷大(Double.POSITIVE_INFINITY):比如,1.0/0.0的结果就是正无穷大
负无穷大(Double.NEGATIVE_INFINITY):比如,-1.0/0.0的结果就是负无穷大
NaN(Double.NaN),不是一个数字:比如,0.0/0.0的结果就是NaN
附1:上述表示的三个特殊值,实际应用中并不常见。当需要检测一个特定值是否等于Double.NaN,必须使用其封装的方法Double.isNaN(),而不能直接去比较。无穷大可用,Double.isInfinite()去判断
错误案例:if (num == Double.NaN)
正确案例:if (Double.isNaN(num))
附2:小心浮点数值运算时的舍入误差问题! 在[0,1]区间内有无穷个小数,以float为例,float和整型int一样占用4个字节,但是由于浮点的特殊性,float的4个字节需要去表示[0,1]之间无穷个数,显示以有效个数去表示无穷个数是做不到的,必须去存在舍入误差。如,System.out.println(2.0-1.1);打印出的结果为0.8999999999999999,而不是常理中的0.9。产生这种现象的原因在于浮点数值采用二进制系统表示,而在二级制系统中无法精确的表示分数1/10。就好像十进制无法表示1/3一样。如果不允许存在舍入误差,就应该采用BigDecimal类。
2.3、字符类型
char类型原本用来表示单个字符,如'A',是编码65所对应的字符常量,System.out.println('A'==65)的打印结果为true。它与"A"不同,"A",表示一个字符A的字符串。现在,有些Unicode字符可以用一个char值表示,另外一些字符需要两个char值。char值可以表示为十六进制值,其范围从\u0000到\Uffff。例如,'\u2122',表示注册符号(™)。'\u03C0',表示希腊字母π。
2.4、布尔类型
布尔类型用来判断逻辑条件,不可与整型值相互转换。
附1:0并不代表false,非0值也不代表true。布尔值与整型没有任何关系,不可和C++中布尔值混为一谈。
三、数据类型间转换
3.1、自动转型与精度丢失
容量(数据类型的取值范围)小可以自动转换成容量大的数据类型,但当容量大数据类型向容量小数据类型转换时会可能出现精度丢失的问题。图中实心箭头,表示无信息丢失的自动类型转换。3个虚箭头,表示可能会产生精度丢失。
3.2、强制转型
当大容量数据类型A,向小容量数据类型B进行强制转换时,可能会造成精度降低或溢出。
如果A的取值在B的取值范围内,转型正常,如
int num = 115;
char ch = (char)num;
System.out.println(ch); // 打印结果为 s
如果A的取值超出了B的取值范围,就会被截断成一个完全不同的值。
int num = -115;
char ch = (char)num;
System.out.println(ch); // 打印结果为 ヘ