Java 中的原始类型
本文介绍 Java 中的八种原始类型,它们占用的内存大小,默认值以及最大值和最小值范围。
本文介绍 Java 中的八种原始类型,它们占用的内存大小,默认值以及最大值和最小值范围。
原始类型是由语言预定义的,并通过一个命名为保留关键字。我们在下图中可以查看每种原始类型。
1. 整数
整数类型是数值类型,其值为整数。Java 提供 5 种整数类型:byte
,short
,int
,long
,和 char
。
1.1 int 类型
int
类型是一个 32 位有符号的 Java 原始类型。int
类型的变量占用 32 位内存。- 其有效范围是 -2,147,483,648 至 2,147,483,647(-231 至 231 – 1)。
- 此范围内的所有整数都称为整数值(或整数常量)。例如,10,-200、0、30、19 等是 int 的整数取值。
下面的例子中将整数值分配给 int
变量 counter
:
int counter = 21;
1.1.1 整数包装器类
Java 有名为一个包装类 Integer
,它定义两个常量 Integer.MAX_VALUE
和 Integer.MIN_VALUE
来表示 int 类型的最大值和最小值。它是 int 值的对象表示。
int max = Integer.MAX_VALUE; // 分配最大值给变量 max
int min = Integer.MIN_VALUE; // 分配最小值给变量 min
1.2 long 类型
long
类型为 64 位有符号的 Java 原始类型。- 当对整数的计算结果可能超出 int 类型的范围时会使用它。
- 其范围是 -263 到 263 – 1。
long 类型的值始终以 L
(或小写字母 l
)结尾。
long num1 = 0L;
long num2 = 401L;
long mum3 = -3556L;
1.2.1 类型转换
即使存储在long
变量中的值恰好在int
类型的范围内,如未进行显式类型转换,也不允许把 long 赋值到 int ,如以下示例所示:
int num1 = 5;
long num2 = 25L;
// 编译错误. 虽然 num2 的值 25 在 int 的取值范围内
num1 = num2;
如果要将 long
变量的值分配给 int
变量,则必须在代码中明确的类型转换,以便 Java 确保您知道可能存在数据溢出。如下所示:
long num1 = (int) num2;
通过编写 (int)num2
,强制 Java 将存储在 num2
其中的值视为转为 int
. 由于 int
的取值范围比 long
小,如果num2
其值超出 int 类型的范围,将导致数据丢失。
1.2.2 Long 包装类
Java 有一个类 Long
,它定义了两个常量 Long.MAX_VALUE
和 Long.MIN_VALUE
来表示长的类型的最大值和最小值。
long max = Long.MAX_VALUE;
long min = Long.MIN_VALUE;
1.3 byte 类型
byte
类型是 8 位带符号 Java 整数类型。- 其范围是-128 到 127。这是 Java 中可用的最小整数类型。
- 您可以将 byte 范围内的任何 int 值分配给 byte 变量。
byte b1 = 125;
byte b2 = -11;
1.3.1 类型转换
如果为 byte
变量分配的 int
值超出了 byte
类型的范围,则 Java 会生成编译器错误。以下代码段将产生编译器错误:
// 错误,因为 150 超出了 byte 范围: -128 - 127
byte b3 = 150;
Java 不允许您将范围较大的类型的变量的值赋值给范围较小的类型的变量,因为这样进行分配可能会失去精度。要进行从 int 到 byte 的赋值,必须像从 long 赋值给 int 一样使用强制转换。
b1 = (byte)num1; // Ok
1.3.2 Byte 包装器类
Java 有一个类 Byte
,它定义两个常量 Byte.MAX_VALUE
和 Byte.MIN_VALUE
来表示 byte
类型的最大值和最小值。
byte max = Byte.MAX_VALUE;
byte min = Byte.MIN_VALUE;
1.4 shrot 类型
short
类型是一个 16 位有符号的 Java 整数类型。其范围是 -32768 至 32767(或-215 至 215 – 1)。- 可以将任何在 short 范围(-32768 到 32767)内的 int 值分配给 short 变量。
short s1 = 12905; // ok
short s2 = -11890; // ok
字节变量的值始终可以分配给 short 变量,因为 byte 类型的范围落在 short 类型的范围内。将值从 int 或 long 变量分配给 short 变量的所有其他规则与字节变量的规则相同。
1.4.1 Short 包装类
Java 有一个称为类 Short
,它定义了两个常量 Short.MAX_VALUE
和 Short.MIN_VALUE
来表示 short
类型最大值和最小值。
short max = Short.MAX_VALUE;
short min = Short.MIN_VALUE;
1.5 char 类型
char
类型是 16 位无符号 Java 基本类型。- 它代表 Unicode 字符。
- 请注意,
char
是无符号类型。因此,char 变量不能具有负值。 - char 类型的范围是 0 到 65535,与 Unicode 集的范围相同。
char
类型的值是字符。
char c1 = 'A';
char c2 = 'L';
char c3 = '5';
char c4 = '/';
1.5.1 字符转义序列
转义字符以反斜杠开头,后跟一个字符,并且两者都用单引号引起来。
共有八个预定义的字符转义序列,如下所示:
字符转义序列 | 描述 |
---|---|
\n |
换行 |
\r |
回车 |
\F |
换页 |
\b |
退格键 |
\t |
标签 |
\\ |
反斜杠 |
\” |
双引号 |
\' |
单引号 |
这些只是 Java 中的八个字符转义序列。您不能定义自己的字符转义序列。
1.5.2 Unicode 转义序列
字符文字也可以表示为 \uxxxx
形式的 Unicode 转义序列,在这里,\u
表示 Unicode 转义序列的开始,并且 xxxx
表示恰好四个十六进制数字。
char c1 = 'A';
char c2 = '\u0041'; // 与 c2 = 'A' 相同
2. 浮点类型
包含小数部分数成为浮点数,例如 3.25
、0.49
,-9.19
等。
数字如何存储在内存中
将数字转换为二进制表示形式时,计算机还必须存储数字中小数点的位置。有两种策略可以将数字存储在计算机内存中。
- 定点数字表示法 – 仅存储数字的二进制表示形式,并假定在该点之前和之后始终有固定数量的数字。一个点在数字的十进制表示形式中称为小数点,在二进制表示形式中称为二进制点。点的位置始终是固定的。
- 浮点数字表示法 – 存储数字的二进制表示形式以及该点在数字中的位置。由于在数字的这种表示形式中,该点之前和之后的位数可能会有所不同,因此我们说该点可以浮动。
与定点表示相比,浮点表示速度较慢且准确性较低。但是,与定点表示相比,浮点表示可以在相同的计算机内存中处理更大范围的数字。
Java 支持“浮点”数字格式。
Java 有两种浮点数字类型:float 和 double。
2.1 float 类型
float 类型使用 32 位存储IEEE 754 标准格式的浮点数(单精度浮点数)。它的数字可以表示为小至 1.4 x 10-45,大至 3.4 x 1038。它可以是正面的或负面的。
所有以 ‘f’ 或 ‘F’ 结尾的数字都称为 float 常量。
float f1 = 8F;
float f2 = 8.F;
float f3 = 8.0F;
2.1.1 正负无穷大
float 类型定义两个无穷大:正无穷大和负无穷大。例如,2.5F
除以 0.0F
是一个浮动正无穷大;2.5F
除以 -0.0F
的结果是一个浮动负无穷大。
2.1.2 NaN(非数字)
未对 float 上的某些操作结果进行定义。这些结果由称为 NaN(非数字)的 float 类型的特殊值表示。
Float
类定义三个常量,分别表示 float 类型的正无穷大,负无穷大和 NaN。还有两个常量,它们代表可以存储在 float 变量中的最大和最小(大于零)浮点值。
Float.POSITIVE_INFINITY // 正无穷打
Float.NEGATIVE_INFINITY // 负无穷大
Float.NaN // 非数字
Float.MAX_VALUE // 最大值
Float.MIN_VALUE // 最小值
请注意,可以将所有整数类型(int,long,byte,short 和 char)的值分配给 float 类型的变量,而无需使用显式强制转换,但必须在将 float 值赋给之前将其强制转换任何 int,long,byte,short 或 char 整数类型的变量。
2.2 doble 类型
double 类型使用 64 位以 “IEEE 754 标准格式” 存储浮点数。根据 IEEE 754 标准,以 64 位表示的浮点数也称为双精度浮点数。
double 类型可以选择以 d
或 D
结尾,例如 19.27d
。但是,后缀 d
或 D
在双字面量中是可选的。也就是说,19.27d
和 19.27
都代表相同的字面量。
double d1 = 8D
double d2 = 8.;
double d3 = 8.0;
double d4 = 8.D;
像 float 类型一样,double 类型定义了最大值,最小值,两个整数和一个 NaN 值。
Double.POSITIVE_INFINITY // 正无穷
Double.NEGATIVE_INFINITY // 负无穷
Double.NaN // 非数字
Double.MAX_VALUE // 最大值
Double.MIN_VALUE // 最小值
3.布尔值
3.1 布尔类型
布尔类型只有两个有效值:true
和 false
。
boolean done;
done = true;
需要注意的重要一点是,布尔变量不能强制转换为其他任何类型,反之亦然。Java 没有指定布尔类型的大小。它的大小由 JVM 实现决定。通常,布尔类型的值在内部以字节存储。
这就是 java 中可用的 8 种原始类型的全部。