3.2 Java基本数据类型
由于Java程序必须保证在所有机器上都能够得到相同的运行结果,所以每一种数据类型的取值范围必须固定。
Java中一共有8种基本类型,分别如下:
类别 | 用途 | 类型 | 存储需求 | 取值范围/有效位数 | 常量后缀 | 备注 |
整 型 | 用于表示没有小数部分的数值,它允许是负数 | byte | 1字节(8位) | -128~127 |
| 主要用于特定的应用场合 |
short | 2字节(16位) | -32768~32767 |
| |||
int | 4字节(32位) | -231~231-1(超过20亿) |
| 最常用 | ||
long | 8字节(64位) | -263~263-1(超过922337万亿) | L,如4000L |
| ||
浮点型 | 用于表示有小数部分的数值 | float | 4字节(32位) | 有效位数6-7位 | F | 没有后缀F的浮点数值默认为double类型 |
double | 8字节(64位) | 有效位数15位 | D | |||
字符型 | 表示单个字符 | char | 2字节(16位) | Unicode编码字符 |
|
|
布尔型 | 表示真假值 | boolean | 1位 | true或false |
|
|
注意:与C/C++不同,Java没有任何无符号类型。
(1) 整型
通常情况下,int类型最常用。但如果表示星球上的居住人数,就需要使用long类型了。byte和short类型主要用于特定的应用场合,例如底层的文件处理或者需要控制占用存储空间量的大数组。
例:长整型数值后面必须加L或l
public class FirstSample
{
public static void main(String[] args)
{
long i=9223372036854775807L; //必须加后缀L
System.out.println(i);
}
}
如果写成long i=9223372036854775807;编译时会出错:
---------- 编译Java源程序 ----------
FirstSample.java:5: 过大的整数: 9223372036854775807
long i=9223372036854775807;
^ 1 错误
(2) 浮点类型
double表示这种类型的数值精度是float类型的两倍(双精度数值)。绝大部分应用程序都采用double类型,因为在很多情况下float类型的精度很难满足需求,因为它只有7位有效数字。特别注意浮点数值不适用于禁止出现舍入误差的金融计算中。
实际上,只有很少的情况下适合使用float类型,例如需要快速地处理单精度数据,或者需要存储大量数据时。
所有的浮点数值计算都遵循IEEE 754规范,下面是用于表示溢出和出错情况的三个特殊的浮点数值:
Ø 正无穷大:Doulbe.POSITIVE_INFINITY,例如一个正整数除以0的结果就是正无穷大;
Ø 负无穷大:Doulbe.POSITIVE_INFINITY
Ø NaN(不是一个数字):Double.NaN,例如计算0/0或求一个负数的平方根的结果就是Nan;
注:Doulbe.POSITIVE_INFINITY、Doulbe.POSITIVE_INFINITY、Double.NaN与相应的Float类型的常量一样分别表示三个特殊的值,但在实际应用中很少遇到。另外,所有“非数值”的值都认为是不相同的,因此不能使用“==”来检测一个特定值是否等于Double.NaN,可以使用Double.isNan方法。例如:
if (x == Double.NaN) // is ERROR
if (Double.isNan(x))// check whether x is “not a number”,is RIGHT
特别注意:
浮点数值不适用于金融计算中,因为浮点型数值存在舍入误差,例如:
System.out.println( 2.0 – 1.1) 打印出的是0.8999999999999999(没有后缀默认为double类型),而不是人们想象的0.9。其主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确的表示分数1/10,这就好像十进制无法精确地表示1/3一样。
如果需要在数值计算中不含有任何舍入误差(精确表示),应该使用BigDecimal类(大数值)。“大数值”是一个能够表示任意精度的算术包,它并不是一种新的Java类型,而是一个Java对象。
(3)字符类型(char)
char类型用于表示单个字符(Unicode字符),因此需要2个字节的存储长度。字符类型数值用单引号表示,如‘A’表示编码为65所对应的字符常量,与“A”不同,采用双引号表示一个包含字符A的字符串。
Unicode编码单元可以表示为十六进制值,其范围从/u0000到/uffff,例如/u2122表示注册符号,/u03C0表示希腊字母π。因此也可采用转义序列符/u表示Unicode字符,特别是表示一些不易输入的字符时。
另外还有一些用于表示特殊字符的转义序列符,如:
转义序列 | 名 称 | Unicode值 | 转义序列 | 名 称 | Unicode值 |
/b | 退格 | /u0008 | /” | 双引号 | /u0022 |
/t | 制表 | /u0009 | /’ | 单引号 | /u0027 |
/n | 换行 | /u000a | // | 反斜杠 | /u005c |
/r | 回车 | /u000d |
|
|
|
所有这些转义序列符都可以出现在字符常量或字符串的引号内,例如 ‘/u2122’或“Hello/n”。不同的是/u还可以出现在字符常量或字符串的引号之外,而其他转义序列不可以。
例如:public static void main (String[] args)也可以写成public static void main (String/u005B/u005D args)
或char a='A'; 等价于char a='/u0041';
char a='A'; 等价于char a=65; //用ASCII值表示
java与unicode编码:
在Java中,char类型用UTF-16编码描述一个代码单元。
在Unicode编码出现之前,已经有许多种不同的标准,如美国的ASCII、西欧的ISO8859-1、台湾的BIG5、中国大陆的GB118030和gbk等,这就产生了以下两个问题:
n 一个代码值在不同编码方案下可能对应不同的字符;
n 采用大字符集的语言其编码长度可能不同,例如有的采用单字节编码,有的采用2个或更多的字节;
设计Unicode编码的目的就是解决这些问题。在设计Java时采用了16位的Unicode字符集,但是现在随着增加了大量的汉语、日语和韩国语言中的表意文字,Unicode字符超过了65536个,16位的char类型已经不能满足描述所有Unicode字符的需要了。因此建议不要在程序中使用char类型,除非确实需要对UTF-16代码单元进行操作。最好将需要处理的字符串用抽象数据类型表示。
UTF-16编码可参考以下网址:
http://en.wikipe-dia.org/wiki/UTF-16
(4)boolean类型
boolean类型有两个值:true和false,用来判定逻辑条件。与C/C++不同,在java中整型值与布尔值之间不能进行相互转换,而在C/C++中,数值或指针可以代替boolean值。