- Java版本: Java8
- 系统版本: Windows10
- 开发工具: intellij idea
后续文章,如无特殊声明均采用以上环境
数据类型
Java中一共有八种基本数据类型,其中有4种整型,2种浮点类型,1用字符类型char
,1种表示boolean
类型
整型
整型用于表示没有小数部分的数值,它允许是负数。
类型 | 存储要求 | 取值范围 |
---|---|---|
int | 4字节 | -2147483648(-231)~2147483647(231-1)(整好超过20亿) |
short | 2字节 | -32768(-215)~32767(215-1) |
long | 8字节 | -9223372036854775808(-263)~9223372036854775807(263-1) |
byte | 1字节 | -128(-27)~127(27-1) |
通常情况下int
类型最常用。但如果表示星球上的居住人数,就需要使用long
类型。byte
和short
类型主要用于特定的应用场合。例如:底层文件的处理或者需要控制占用存储空间量的大数组。
- 在Java中,整型的范围与运行Java代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中的不同操作系统之间进行移植带来的诸多问题。
长整型long
数值有一个后缀L
或者l
小写的L
(如4000000000L
)。十六进制数值有一个前缀0x
或者0X
(如0xCAFE
)。八进制有一个前缀0
,例如,010
对应八进制中的8
。很显然,8进制表示法比较容易混淆,所以建议最好不要使用进制常数。
从Java7开始,加上前缀0b
或者0B
就可以写二进制数。例如,0b1001
就是9
。另外同样从Java7开始,还可以为数字字面量加下划线,如用1_000_000
(或者0b111_0100_0010_0100_0000
)表示一百万。这些下划线只是为了让人更易读。Java编译器会去除这些下滑线。
浮点类型
浮点类型用于用于表示有小数部分的数值。
类型 | 存储需求 | 取值范围 |
---|---|---|
float | 4字节 | 大约±3.40282347E+38F (有效位数为6~7) |
double | 8字节 | 大约±1.79769313486231570E+308 (有效位数为15位) |
double
表示这种类型的数据精度是float
类型的两倍(有人称之为双精度数值)。大部分应用程序都采用double
类型。在很多情况下,float
类型的精度很难满足需求。只有在很少的i情况下适合使用float
类型,例如,需要单精度数据的库,或者需要存储大量数据。
float
类型的数值有一个后缀F
或f
(例如,3.14F
)。没有后缀F
的浮点数值(如3.14
)默认未double
类型。也可以在浮点数值后面添加后缀D
或d
(例如,3.14D
)。
所有的浮点数值计算都遵循IEEE 754
规范。具体来说,下命是用于表示溢出和出错情况的三个特殊的浮点数值:
- 正无穷大
- 负无穷大
- NaN(不是一个数字)
例如,一个正整数除以0
的结果为正无穷大。计算0/0
或者负数的平方根结果为NaN
.
常量
Double.POSITIVE_INFINITY
(正无穷大)、Double.NEGATIVE_INFINITY
(负无穷大)和Double.NaN
(不是一个数字)以及相对应的Float
类型的常量,分别表示这三个特殊的值,但在实际应用中很少遇到。特别说明:不能这样检测一个特定的值是否等于
Double.NaN
:if (x == Double.NaN) //永远为false
所有“非数值”的值都认为是不相同的。然而可用使用
Double.isNaN
方法:if (Double.isNaN(x)) //验证x是否不是数字
浮点数值不适用与无法接受舍入误差的金融计算中。例如,命令System.out.println(2.0-1.1);
将打印出0.8999999999999999
,而不是0.9
。这种舍入的误差主要原因是浮点数值采用二进制系统表示,而在二进制中系统无法准确地表示分数1/10
。如果在数值计算中不允许有任何舍入误差,就应该使用BigDecimal
类。
char类型
char
类型原本用于表示单个字符。不过, 现在情况已经有所变化 。如今, 有些Unicode字符
可以用一个char
值描述,另外一些Unicode字
符则需要两个char
值。
char
类型的字面量值要用单引号括起来。例如:'A'
是编码值为65
所对应的字符常量 。它与 " A "
不同,"A"
是包含一个字符A
的字符串 , char
类型的值可以表示为十六进制值,其范围从 \u0000
到\Uffff
。例如:\u2122
表示注册符号(™
) ,\u03C0
表示希腊字母π
。
除了转义序列\u
之外 ,还有一些用于表示特殊字符的转义序列,请参考下表。所有这些转义序列都可以出现在加引号的字符字面量或字符串中。例如 , '\02122'
或 "Hello\n"
。转义序列\u
还可以出现在加引号的字符常量或字符串之外(而其他所有转义序列不可以)。例如 :
public static void main (String \u005B\u005D args)
就完全符合语法规则 , \u005B
和\u005D
是 [
和 ]
的编码 。
转义序列 | 名称 | Unicode值 |
---|---|---|
\b | 退格 | \u0008 |
\t | 制表 | \u0009 |
\n | 换行 | \u000a |
\r | 回车 | \u000d |
" | 双引号 | \u0022 |
' | 单引号 | \u0027 |
\ | 反斜杠 | \u005c |
-
Unicode转义序列会在解析代码之前得到处理。例如,
"\u0022+\u0022"
并不是一个有引号(U+0022
)包围加号构成的字符串。实际上,\u0022
会在解析之前转换为"
,这会得到""+""
,也就是一个空串。-
更隐秘地,一定要注意代码注释中的
\u
,注释// \u00A0 is a newline
会产生一个语法错误,因为读程序时
\u00A0
会被替换为一个换行符。类似地,下面这个注释:// Loog inside c:\user
也会产生一个语法错误,因为
\u
后边并未跟着4个十六进制数
-
boolean类型
boolean(布尔)
类型有两个值:false
和true
,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。