1. 有哪些数值类型?
在编程中我们经常与数字打交道——从用户的年龄到银河中的恒星数量,或者银行账户中的分角。但 不同的任务需要不同的数值类型:有时只需保存整数,有时需要非常精确的小数,有时则需要“非负”数字。
整数(int 等)
整数 是没有小数部分的数。
在 Java 中最常用的是 int 类型,但除此之外还有几个按大小和范围不同的选项。
- int —— 处理整数的主力类型。它能容纳很大(也很小)的值,同时占用的内存不多。 例如,统计点赞数、年龄、一年中的天数等几乎都会使用 int。
- long —— 当数值可能非常大时使用(例如数十亿或数万亿)。 示例:保存 YouTube 有史以来的总观看次数。
- short —— 更省内存,但很少使用。适用于有大量相同小值的场景(例如音频数据、颜色分量)。
- byte —— 适合更小的取值范围,常见于图形与文件处理等注重内存节省的场景。
小数(double,float)
有时需要处理带小数部分的数。例如气温、学生的平均分、带分角的小数价格。
- double —— 存储小数的“默认”类型。对大多数计算足够精确(例如:3.1415926535…)。
- float —— 更轻量、精度更低的类型,常见于计算机图形或需要处理大型数组的数据场景,强调内存节省。
特殊数值类型
- BigInteger —— 当需要处理超出标准范围的超大整数时使用,例如在密码学或天文计算中。
- BigDecimal —— 用于进行精确小数计算(金融、利率计算),可避免 double 与 float 的精度问题。
2. 取值范围
整数类型 可以存储正数和负数。当取值可能“高于或低于 0”时这很方便:例如气温、账户余额、相对海平面的高度。
示例:
- int : -10, 0, 50
- long : 0, 10, -1000_000_000_000_000_000L
整数类型
| 类型 | 大小 | 取值范围 | 示例 |
|---|---|---|---|
|
1 字节 | -128 到 127 | -128, 0, 127 |
|
2 字节 | -32 768 到 32 767 | -1000, 0, 32000 |
|
4 字节 | -2 147 483 648 到 2 147 483 647 | -1000000, 0, 2000000 |
|
8 字节 | -9 223 372 036 854 775 808 到 9 223 372 036 854 775 807 |
-10_000_000_000, 1 |
浮点类型
| 类型 | 大小 | 示例值 | 说明 |
|---|---|---|---|
|
4 字节 | 3.14f, -0.001f | 单精度(约 7 位数字) |
|
8 字节 | 3.1415, -1.7E+308 | 双精度(约 15–16 位数字) |
3. 数字字面量的后缀
在某些情况下需要显式指定数字要使用的类型。这可以通过添加后缀来完成:
- L 或 l —— 表示 long 类型(例如:10000000000L)
- F 或 f —— 表示 float 类型(例如:3.14f)
- D 或 d —— 表示 double 类型(通常不需要,因为不带后缀的小数默认就是 double)
如果不写后缀,整数默认为 int,小数默认为 double。例如,42 是 int,而 3.14 是 double。
为什么需要后缀?例如,为了在把一个大数赋给 long 变量时避免出错:
long bigNumber = 9000000000L; // 如果去掉 L,将发生编译错误
使用下划线 _ 作为分隔符
当数字很长时,很容易在 0 的个数上看花。为便于阅读,Java 允许在数字字面量中使用下划线。
int population = 146_700_000;
long stars = 100_000_000_000L;
使用下划线提升数字的可读性
这完全是合法的:编译器会忽略下划线,而你可以一眼看清分组。要点——不要把下划线放在开头、结尾、小数点之后或后缀之前。
4. 字符类型 char:它是什么,有什么用?
char 类型用于存储单个字符:字母、数字、标点、空格、特殊符号,甚至表情符号。
示例:
char letter = 'A';
char digit = '7';
char symbol = '?';
char cyrillic = '\u0416';
char euro = '€';
char smile = '☺'; // 是的,这样也可以!
重要规则:
- char 的值写在单引号中:'A'、'7'、'#'。
- 它必须是一个字符!如果写成 'AB' —— 编译器会报错。
- 每个字符背后都有对应的数字编码(Unicode)。
Unicode:来自全世界的字符
Java 使用 Unicode 标准,这使它不仅能存储拉丁字母,还能处理西里尔字母、汉字、表情符号,甚至古埃及象形文字(如果你需要的话)。
有趣的事实:
char 本质上是一个 16 位的数字(从 0 到 65535),每个值都对应一个字符。
5. 字符与数字:通过 Unicode 的联系
由于每个字符在内部都是一个数字,我们可以在 char 与 int 之间相互转换。
示例:获取字符的 Unicode 编码
public class CharToInt {
public static void main(String[] args) {
char ch = 'A';
int code = ch; // char 到 int 的隐式转换
System.out.println("字符 '" + ch + "' 的代码: " + code);
}
}
结果:
字符 'A' 的代码: 65
现在反过来——通过编码得到字符:
public class IntToChar {
public static void main(String[] args) {
int code = 1040; // 字符 'A' 的 Unicode 编码(西里尔字母)
char ch = (char) code; // 显式转换 int → char
System.out.println("代码为 " + code + " 的字符: " + ch);
}
}
结果:
代码为 1040 的字符: \u0410
6. Java 的基本原始类型
| 类型 | 大小(位) | 取值范围 | 示例值 | 备注 |
|---|---|---|---|---|
|
8 | -128 ... 127 | 42 | 很少用 |
|
16 | -32,768 ... 32,767 | 12345 | 用于节省内存 |
|
32 | -2,147,483,648 ... 2,147,483,647 | 1000000 | 处理整数的主力类型 |
|
64 | ≈ −9.22 × 1018 ... ≈ 9.22 × 1018 | 5000000000L | 用于非常大的整数 |
|
32 | ~±3.4 × 10-38 ... ±3.4 × 1038 | 3.14f | 浮点数,精度较低 |
|
64 | ~±1.7 × 10-308 ... ±1.7 × 10308 | 2.718 | 浮点数,精度较高 |
|
16 | 0 ... 65 535 (Unicode) | 'Ж', 'A', '?' | 单个字符 |
|
1 | true, false | true | 布尔值 |
GO TO FULL VERSION