Java 基础核心类:System 类详解(常见用法 + 使用场景 + 面试高频)
在 Java 开发中,System 类几乎每天都会使用,例如:
java
System.out.println("Hello World");
但很多人只知道 println,却忽略了 System 类其实提供了大量 与 JVM、操作系统、IO、时间、环境变量相关的核心能力。
本文将从 基础 → 常用方法 → 实际场景 → 面试考点 ,系统讲解 System 类。
一、System 类是什么?
System 位于:
java
java.lang.System
特点:
- 属于 Java 核心类库
- 自动导入(无需 import)
- 所有成员基本都是 static
- 不能实例化
源码中有一段非常经典的定义:
java
public final class System {
private System() {}
}
说明:
final:不能被继承private构造方法:不能创建对象
所以我们使用时都是:
java
System.xxx
二、System 最常见的功能:标准输出
这是最常见的用法。
java
System.out.println("Hello");
System.out.print("Java");
out 是什么?
java
public static final PrintStream out
也就是说:
System.out本质是一个 PrintStream(打印流)对象
所以可以调用:
java
System.out.print()
System.out.println()
System.out.printf()
示例:
java
System.out.printf("name=%s age=%d", "Tom", 20);
输出:
name=Tom age=20
三、System.in:标准输入
System.in 用于 读取控制台输入。
类型:
java
public static final InputStream in
常见用法是配合 Scanner:
java
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println(name);
示例:
java
Scanner scanner = new Scanner(System.in);
System.out.print("请输入姓名:");
String name = scanner.nextLine();
System.out.println("Hello " + name);
运行:
请输入姓名:Tom
Hello Tom
四、System.err:错误输出流
System.err 是 标准错误输出流。
java
System.err.println("Error occurred!");
区别:
| 输出流 | 说明 |
|---|---|
| System.out | 正常输出 |
| System.err | 错误输出 |
在控制台通常表现为:
out→ 普通颜色err→ 红色
使用场景:
- 打印错误信息
- 日志系统
- 调试程序
五、System.currentTimeMillis()(高频)
用于获取 当前时间戳(毫秒)
java
long time = System.currentTimeMillis();
System.out.println(time);
输出示例:
1710501023456
含义:
当前时间距离 1970-01-01 00:00:00 UTC 的毫秒数。
常见使用场景:计算程序运行时间
java
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
Math.sqrt(i);
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + " ms");
六、System.nanoTime()(更精确)
获取 纳秒级时间
java
long start = System.nanoTime();
// 执行代码
long end = System.nanoTime();
System.out.println(end - start);
区别:
| 方法 | 精度 | 用途 |
|---|---|---|
| currentTimeMillis | 毫秒 | 获取当前时间 |
| nanoTime | 纳秒 | 测量时间间隔 |
面试常问:
计算代码执行时间用哪个?
答案:
nanoTime()
因为它更精确。
七、System.exit()(程序终止)
用于 终止 JVM
java
System.exit(0);
含义:
| 参数 | 含义 |
|---|---|
| 0 | 正常退出 |
| 非0 | 异常退出 |
示例:
java
System.out.println("Start");
System.exit(0);
System.out.println("End");
输出:
Start
End 不会执行。
八、System.arraycopy()(高频)
用于 数组快速复制
方法:
java
System.arraycopy(src, srcPos, dest, destPos, length);
参数说明:
| 参数 | 含义 |
|---|---|
| src | 原数组 |
| srcPos | 原数组起始位置 |
| dest | 目标数组 |
| destPos | 目标起始位置 |
| length | 复制长度 |
示例:
java
int[] a = {1,2,3,4,5};
int[] b = new int[5];
System.arraycopy(a, 0, b, 0, 5);
System.out.println(Arrays.toString(b));
输出:
[1, 2, 3, 4, 5]
特点:
- 效率非常高
- 底层使用 native 方法
九、System.getProperty()(JVM 属性)
获取 JVM 属性。
java
String version = System.getProperty("java.version");
System.out.println(version);
常见属性:
| 属性 | 含义 |
|---|---|
| java.version | Java版本 |
| os.name | 操作系统 |
| user.name | 当前用户 |
| user.dir | 当前工作目录 |
示例:
java
System.out.println(System.getProperty("os.name"));
输出:
Windows 11
十、System.getenv()(环境变量)
获取操作系统环境变量。
java
String path = System.getenv("PATH");
System.out.println(path);
也可以获取全部环境变量:
java
Map<String, String> env = System.getenv();
十一、面试高频问题
1:System.out 是什么类型?
答案:
PrintStream
2:System 为什么不能实例化?
原因:
构造方法是 private
3:currentTimeMillis 与 nanoTime 区别?
| 方法 | 作用 |
|---|---|
| currentTimeMillis | 获取当前时间 |
| nanoTime | 计算时间间隔 |
4:arraycopy 为什么比循环快?
因为:
底层是 native 方法
直接调用 JVM 实现
十二、常见易错点
1:nanoTime 不能表示当前时间
错误:
java
System.nanoTime();
它只是一个 时间计数器。
2:System.exit 会直接终止 JVM
调用后:
- finally 可能不执行
- 线程会被强制结束
3:arraycopy 参数顺序
很多人会写错:
srcPos
destPos
顺序必须记住。
十三、总结
System 是 Java 中最重要的基础类之一,核心能力包括:
| 功能 | 方法 |
|---|---|
| 控制台输出 | out |
| 控制台输入 | in |
| 错误输出 | err |
| 时间 | currentTimeMillis / nanoTime |
| 数组复制 | arraycopy |
| 程序退出 | exit |
| JVM属性 | getProperty |
| 环境变量 | getenv |
一句话总结:
System 是 Java 与 JVM / 操作系统交互的核心桥梁。