Java 的 8 种基本类型

Java 是一种强类型语言。这就意味着必须为每一个变量声明一种类型。在 Java 中,一共有 8 种基本类型(primitive type),其中有 4 种整形、2 种浮点类型、1 种用于表示 Unicode 编码的字符单元的字符类型 char 和 1 种用于表示真值的 boolean 类型。

 

1 整型:用于表示没有小数部分的数值,允许是负数。Java 提供了4种整型,具体内容如下:

类型        存储需求        取值范围

byte         1 字节            - 128 ~ 127

short        2 字节            - 32 768~32 768

int            4 字节            - 2 147 483 648 ~ 2 147 483 647 (正好超过20亿)

long         8 字节            - 9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 808

 

在通常情况下,int 类型最常用。但如果表示星球上的居住人数,就需要使用 long 类型了。 byte 和 short 类型主要用于特定的应用场合,例如,底层的文件处理或者需要控制占用存储空间量的大数组。

在 Java 中,整形的范围与运行 Java 代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。与此相反,C 和 C++ 程序需要针对不同的处理器选择最为有效的整型,这样就有可能造成一个在 32 位处理器上运行很好的 C 程序在 16 位系统上运行却发生整数溢出。由于 Java 程序必须保证在所有机器上都能够得到相同的运行结果,所以每一种数据类型的取值范围必须固定。

长整型数值有一个后缀 L (如 4000000000L)。十六进制数值有一个前缀 0x (如 0xCAFE)。八进制有一个前缀 0,例如,010 对应八进制中的8。很显然,八进制表示法比较容易混淆,所以建议最好不要使用八进制常数。

从 Java 7 开始,加上前缀 0b 就可以写二进制数。例如,0b1001 就是 9。另外,同样是从 Java 7 开始,还可以为数字字面量加下划线,如用 1_000_000 (或 0b1111_0100_0010_0100_0000 ) 表示一百万。这些下划线只是为了让人更易读。 Java 编译器会去除这些下划线。

      

注释:在 C 和 C++ 中,int 表示的整形与目标平台相关。在 8086 这样的 16 位处理器上整型数值占 2 字节;不过,在 32 位处理器 (比如 Pentium 或 SPARC)上,整型数值则为 4 字节。类似地,在 32 位处理器上 long 值为 4 字节,在 64 位处理器上则为 8 字节。由于存在这些差别,这对编写跨平台程序带来了很大难度。在 Java 中,所有的数值类型所占据的字节数量与平台无关。

注意:Java 没有任何无符号类型。

 

2 浮点类型:用于表示有小数部分的数值。在 Java 中有两种浮点类型,具体内容如下:

类型        存储需求        取值范围

float         4 字节           大约 ±3.402 823 47E + 38F(有效位数为 6~7 位)

double     8 字节           大约 ±1.709 693 134 862 315 70E + 308(有效位数为 15 位)

 

double 表示这种类型的数值精度是 float 的两倍(有人称之为双精度数值)。绝大部分应用程序都采用 double 类型。在很多情况下, float 类型的精度很难满足需求。例如,用 7 位有效数字足以精确地表示普通雇员的年薪,但表示公司总裁的年薪可能就不够用了。实际上,只有很少的情况适合使用 float 类型,例如,需要快速地处理单精度数据,或者需要存储大量数据。

float 类型的数值有一个后缀 F(例如,3.14F)。没有后缀 F 的浮点数值(如 3.14)默认为 double 类型。当然,也可以在浮点数值后面添加后缀 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) // is never true

所有 "非数值" 的值都认为是不相同的。然而,可以使用 Double.isNaN 方法:

if(Double.isNaN(x)) // check whether x is "not a number"

警告:浮点数值不适用于禁止出现舍如误差的金融计算中。例如,命令 System.out.println( 2.0-1.1 ) 将打印出 0.8 999 999 999 999 999,而不是人们想象的 0.9 。其主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确的表示分数 1/10。这就好像十进制无法精确地表示 1/3 一样。如果需要在数值计算中不含有任何舍如入误差,就应该使用 BigDecimal 类。

 

3 char 类型:用于表示单个字符。通常用来表示字符常量。

例如:‘A’ 是编码为 65 所对应的字符常量。与 "A" 不同, “A” 是一个包含字符 A 的字符串。Unicode 编码单元可以表示为十六进制值,其范围从 \u0000 到 \Uffff。例如,\u03C0 表示希腊字母 π。

除了可以采用转义序列符 \u 表示 Uicode 代码单元的编码之外,还有一些用于表示特殊字符的转义序列符,参见下表,所有这些转义序列符都可以出现在字符常量或字符串的引号内。例如,'\u2122' 或 "\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

要想弄清 char 类型,就必须了解 Unicode 编码表。Unicode 打破了传统字符编码方法的限制。在 Unicode 出现之前,已经有许多种不同的标准:美国的 ASCII、西欧语言中的 ISO8859-1、俄国的 KOI-8、中国的 GB 18030 和 BIG-5 等。这样就产生了下面两个问题:一个是对于任意给定的代码值,在不同的编码方案下有可能对应不同的字母;二是大写字符集的语言其编码长度有可能不同。例如,有些常用的字符采用单字节编码,而另一些字符则需要两个或更多字节。

设计 Unicode 编码的目的就是要解决这些问题。在 20 世纪 80 年代开始启动设计工作时,人们认为两个字节的代码宽度足以能够对世界上各种语言的所有字符进行编码,并有足够的空间留给未来的扩展。在 1991 年发布了 Unicode 1.0,当时仅占用 65 536 个代码值中不到一半的部分。在设计 Java 时决定采用 16 位的 Unicode 字符集,这样会比使用 8 位字符集的程序设计语言有很大改进。

十分遗憾,经过一段时间,不可避免的事情发生了。 Unicode 字符超过了 65 536 个,其主要原因是增加了大量的汉语、日语和韩国语言中的表意文字。现在,16 位的 char 类型已经不能满足描述所有 Unicode 字符的需要了。

强烈建议不要在程序中使用 char 类型,除非确实需要对 UTF-16 代码单元进行操作。最好将需要处理的字符串用抽象数据类型表示。

 

4 boolean 类型

boolean (布尔)类型中有两个值:false 和 true,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。

在 C++ 中,数值或指针可以代替 boolean 值。值 0 相当于布尔值 false,非 0 值相当于布尔值 true。在 Java 中则不是这样。因此,Java 应用程序员不会遇到下述麻烦:

if(x = 0) // oops...meant x == 0

在 C++ 中这个测试可以编译运行,其结果总是 false。而在 Java 中,这个测试将不能通过编译,其原因是整数表达式 x = 0 不能转换为布尔值。

      

 

你可能感兴趣的:(Java)