青岛市网站建设_网站建设公司_外包开发_seo优化
2025/12/23 17:31:59 网站建设 项目流程

Java 中的System类,它是java.lang包下的核心系统类,提供了大量与系统交互的静态方法和静态属性,用于访问系统环境、执行系统级操作(如输入输出、垃圾回收、系统退出等),下面从核心特性、静态属性、常用方法等方面全面讲解:

一、核心特性

  1. System类是最终类(final),不能被继承;
  2. 构造方法被private修饰,无法通过new关键字创建实例,所有属性和方法均为静态,直接通过System.属性/方法名()调用;
  3. 功能覆盖系统输入输出、环境变量获取、数组复制、垃圾回收、系统时间获取等核心场景。

二、核心静态属性

System类提供了 3 个标准的输入 / 输出 / 错误输出流,是 Java 基础 IO 操作的核心入口:

静态属性类型说明
System.inInputStream标准输入流(默认对应键盘输入),用于读取外部输入数据
System.outPrintStream标准输出流(默认对应控制台输出),用于打印正常信息
System.errPrintStream标准错误输出流(默认对应控制台输出),专门用于打印错误信息,输出内容通常为红色(控制台默认样式)

示例:使用静态属性进行输入输出

import java.util.Scanner; public class SystemDemo { public static void main(String[] args) { // 1. System.out:打印正常信息 System.out.println("这是标准输出流的正常信息"); // 2. System.err:打印错误信息 System.err.println("这是标准错误输出流的错误信息"); // 3. System.in:读取键盘输入(结合 Scanner 使用) Scanner scanner = new Scanner(System.in); System.out.print("请输入您的姓名:"); String name = scanner.nextLine(); System.out.println("您好," + name); scanner.close(); } }

三、常用静态方法分类详解

1. 系统退出:exit(int status)

用于终止当前 Java 虚拟机(JVM)的运行,是程序主动退出的核心方法。

  • 参数status:退出状态码,0表示正常退出,非 0 表示异常退出(通常用1表示通用异常);
  • 该方法执行后,JVM 立即终止,后续代码不再执行。
public static void main(String[] args) { System.out.println("程序开始执行"); // 模拟业务判断,满足条件则退出 boolean needExit = true; if (needExit) { System.out.println("程序准备退出"); System.exit(0); // 正常退出JVM } // 以下代码不会执行 System.out.println("程序继续执行"); }

2. 垃圾回收:gc()

用于主动触发 Java 垃圾回收器(GC)的执行,建议 JVM 回收那些不再被引用的对象所占用的内存。

  • 注意:gc()建议性方法,并非强制性触发。JVM 会根据当前内存使用情况,决定是否立即执行垃圾回收,可能会忽略该请求;
  • 垃圾回收的核心逻辑由 JVM 底层实现,无需手动干预,仅在特殊场景下(如大量临时对象创建后)可调用该方法辅助内存释放。
public static void main(String[] args) { // 创建大量临时对象 for (int i = 0; i < 10000; i++) { new Object(); } System.out.println("创建大量临时对象完成"); // 建议JVM执行垃圾回收 System.gc(); // 等价于 Runtime.getRuntime().gc() System.out.println("已触发垃圾回收建议"); }

3. 数组复制:arraycopy()

用于快速复制数组的指定区间元素,是 Java 中数组复制的高效底层方法(Arrays.copyOf()等方法底层也是基于arraycopy()实现)。

方法签名
public static void arraycopy( Object src, // 源数组 int srcPos, // 源数组的起始复制索引(包含) Object dest, // 目标数组 int destPos, // 目标数组的起始存放索引(包含) int length // 要复制的元素个数 )
示例:数组复制
public static void main(String[] args) { int[] srcArr = {1, 2, 3, 4, 5}; int[] destArr = new int[10]; // 目标数组长度为10 // 复制源数组索引1~3的元素(2,3,4)到目标数组索引2开始的位置 System.arraycopy(srcArr, 1, destArr, 2, 3); System.out.println("目标数组内容:"); for (int num : destArr) { System.out.print(num + " "); // 输出:0 0 2 3 4 0 0 0 0 0 } }
注意事项
  • 若源数组或目标数组为null,会抛出NullPointerException
  • 若索引越界(如srcPos + length超过源数组长度),会抛出ArrayIndexOutOfBoundsException
  • 支持基本类型数组和引用类型数组的复制。

4. 系统时间获取

(1)currentTimeMillis():获取当前时间戳(毫秒级)

返回从1970 年 1 月 1 日 00:00:00 GMT(格林威治标准时间)到当前时刻的毫秒数,类型为long

  • 常用于计算程序执行耗时、生成唯一标识(简单场景)、时间戳记录等。
public static void main(String[] args) { // 记录程序开始时间 long startTime = System.currentTimeMillis(); // 模拟耗时操作(循环计算) long sum = 0; for (long i = 0; i < 1000000000L; i++) { sum += i; } // 记录程序结束时间 long endTime = System.currentTimeMillis(); // 计算耗时(毫秒) System.out.println("计算结果:" + sum); System.out.println("程序耗时:" + (endTime - startTime) + " 毫秒"); }
(2)nanoTime():获取高精度时间戳(纳秒级)

返回 JVM 启动以来的纳秒数(相对时间,非绝对时间),精度远高于currentTimeMillis()(1 纳秒 = 10^-9 秒)。

  • 适用于高精度时间间隔测量(如微秒级 / 纳秒级耗时统计),不适合用于记录绝对时间。
public static void main(String[] args) { long startNano = System.nanoTime(); // 模拟短时间操作 String str = ""; for (int i = 0; i < 1000; i++) { str += i; } long endNano = System.nanoTime(); // 转换为微秒(1微秒 = 1000纳秒) long costMicro = (endNano - startNano) / 1000; System.out.println("操作耗时:" + costMicro + " 微秒"); }

5. 环境变量与系统属性

(1)getenv():获取系统环境变量
  • System.getenv():返回所有系统环境变量的Map<String, String>集合;
  • System.getenv(String name):根据环境变量名获取对应值(如PATHJAVA_HOME)。
public static void main(String[] args) { // 1. 获取指定环境变量(JAVA_HOME) String javaHome = System.getenv("JAVA_HOME"); System.out.println("JAVA_HOME 路径:" + javaHome); // 2. 获取所有环境变量并遍历 System.out.println("\n所有系统环境变量:"); System.getenv().forEach((key, value) -> { System.out.println(key + "=" + value); }); }
(2)getProperty():获取 Java 系统属性
  • System.getProperty(String key):根据属性名获取对应值;
  • System.getProperties():返回所有 Java 系统属性的Properties对象;
  • 常用系统属性:user.name(当前用户名)、user.dir(当前工作目录)、java.version(Java 版本)、os.name(操作系统名称)。
public static void main(String[] args) { // 获取常用系统属性 String userName = System.getProperty("user.name"); String userDir = System.getProperty("user.dir"); String javaVersion = System.getProperty("java.version"); String osName = System.getProperty("os.name"); System.out.println("当前用户名:" + userName); System.out.println("当前工作目录:" + userDir); System.out.println("Java 版本:" + javaVersion); System.out.println("操作系统:" + osName); // 输出所有系统属性 System.out.println("\n所有Java系统属性:"); System.getProperties().list(System.out); }
(3)setProperty(String key, String value):设置 Java 系统属性

用于手动设置自定义 Java 系统属性,仅在当前 JVM 进程中有效,进程结束后失效。

public static void main(String[] args) { // 设置自定义系统属性 System.setProperty("app.name", "JavaSystemDemo"); System.setProperty("app.version", "1.0.0"); // 获取自定义属性 String appName = System.getProperty("app.name"); String appVersion = System.getProperty("app.version"); System.out.println("应用名称:" + appName); System.out.println("应用版本:" + appVersion); }

四、完整使用示例

import java.util.Scanner; public class SystemCompleteDemo { public static void main(String[] args) { // 1. 标准输入输出 System.out.println("=== 标准输入输出演示 ==="); Scanner scanner = new Scanner(System.in); System.out.print("请输入一个整数:"); int num = scanner.nextInt(); System.out.println("你输入的整数是:" + num); if (num < 0) { System.err.println("错误:你输入的是负数!"); } // 2. 数组复制 System.out.println("\n=== 数组复制演示 ==="); int[] src = {10, 20, 30, 40, 50}; int[] dest = new int[8]; System.arraycopy(src, 1, dest, 2, 3); System.out.println("目标数组内容:"); for (int i : dest) { System.out.print(i + " "); } System.out.println(); // 3. 时间戳与耗时统计 System.out.println("\n=== 耗时统计演示 ==="); long startMs = System.currentTimeMillis(); long sum = 0; for (long i = 0; i < 500000000L; i++) { sum += i; } long endMs = System.currentTimeMillis(); System.out.println("求和结果:" + sum); System.out.println("耗时(毫秒):" + (endMs - startMs)); // 4. 系统属性与环境变量 System.out.println("\n=== 系统信息演示 ==="); System.out.println("Java 版本:" + System.getProperty("java.version")); System.out.println("当前工作目录:" + System.getProperty("user.dir")); System.out.println("PATH 环境变量:" + System.getenv("PATH").substring(0, 50) + "..."); // 5. 垃圾回收与系统退出 System.out.println("\n=== 垃圾回收与程序退出演示 ==="); System.gc(); System.out.println("已触发垃圾回收建议"); scanner.close(); // 正常退出程序 System.exit(0); // 后续代码不会执行 System.out.println("这段代码不会被输出"); } }

五、核心总结

  1. Systemjava.lang包下的final 静态类,无法实例化,所有功能通过静态属性 / 方法调用;
  2. 核心静态属性:in(标准输入)、out(标准输出)、err(标准错误输出);
  3. 核心方法分类:
    • 系统控制:exit()(退出 JVM)、gc()(建议垃圾回收);
    • 数组操作:arraycopy()(高效数组复制);
    • 时间获取:currentTimeMillis()(毫秒时间戳)、nanoTime()(纳秒高精度时间);
    • 环境信息:getenv()(系统环境变量)、getProperty()/setProperty()(Java 系统属性);
  4. 注意事项:
    • gc()是建议性方法,不保证 JVM 立即执行垃圾回收;
    • arraycopy()需避免索引越界和空指针异常;
    • nanoTime()是相对时间,适合耗时统计,不适合记录绝对时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询