4.4java常用类
在 Java 中,System
和 Runtime
类都是 java.lang
包下非常重要的类,它们提供了与系统交互以及管理 Java 虚拟机(JVM)运行时环境的功能。
System
类
System
类包含了一些有用的类字段和方法,它不能被实例化,其所有的方法都是静态的。以下是 System
类的一些常用功能和方法。
1. 标准输入输出流
System.in
:标准输入流,通常与键盘输入相关联,类型为InputStream
。System.out
:标准输出流,通常与控制台输出相关联,类型为PrintStream
。System.err
:标准错误输出流,用于输出错误信息,同样是PrintStream
类型。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class SystemIOExample {public static void main(String[] args) {try {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));System.out.println("请输入一些内容:");String input = reader.readLine();System.out.println("你输入的内容是: " + input);} catch (IOException e) {System.err.println("读取输入时发生错误: " + e.getMessage());}}
}
2. 系统属性
System.getProperty(String key)
:用于获取指定键的系统属性值。System.setProperty(String key, String value)
:用于设置指定键的系统属性值。
public class SystemPropertiesExample {public static void main(String[] args) {// 获取系统属性String osName = System.getProperty("os.name");System.out.println("操作系统名称: " + osName);// 设置系统属性System.setProperty("my.property", "my value");String myProperty = System.getProperty("my.property");System.out.println("自定义属性值: " + myProperty);}
}
3. 时间相关
System.currentTimeMillis()
:返回当前时间(以毫秒为单位),通常用于计算代码执行时间。System.nanoTime()
:返回当前时间的纳秒数,提供更高精度的时间测量。
public class SystemTimeExample {public static void main(String[] args) {long startTime = System.currentTimeMillis();for (int i = 0; i < 1000000; i++) {// 模拟一些操作}long endTime = System.currentTimeMillis();System.out.println("代码执行时间: " + (endTime - startTime) + " 毫秒");}
}
4. 数组复制
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
:用于将一个数组的指定部分复制到另一个数组中。
public class SystemArrayCopyExample {public static void main(String[] args) {int[] source = {1, 2, 3, 4, 5};int[] destination = new int[5];System.arraycopy(source, 0, destination, 0, 5);for (int num : destination) {System.out.print(num + " ");}}
}
5. 退出 JVM
System.exit(int status)
:用于终止当前正在运行的 Java 虚拟机,参数status
为退出状态码,0
表示正常退出,非零值表示异常退出。
public class SystemExitExample {public static void main(String[] args) {System.out.println("程序开始执行");System.exit(0);System.out.println("这行代码不会被执行");}
}
Runtime
类
Runtime
类表示 Java 应用程序的运行时环境,每个 Java 应用程序都有一个单一的 Runtime
实例,通过 Runtime.getRuntime()
方法可以获取该实例。
1. 执行外部命令
Runtime.getRuntime().exec(String command)
:用于在 Java 程序中执行外部命令。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class RuntimeExecExample {public static void main(String[] args) {try {// 在 Windows 系统上执行 dir 命令,在 Linux 或 macOS 上执行 ls 命令String os = System.getProperty("os.name").toLowerCase();String command;if (os.contains("win")) {command = "cmd /c dir";} else {command = "ls";}Process process = Runtime.getRuntime().exec(command);BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}process.waitFor();} catch (IOException | InterruptedException e) {e.printStackTrace();}}
}
2. 内存管理
Runtime.getRuntime().totalMemory()
:返回 Java 虚拟机中的内存总量。Runtime.getRuntime().freeMemory()
:返回 Java 虚拟机中的空闲内存量。Runtime.getRuntime().maxMemory()
:返回 Java 虚拟机试图使用的最大内存量。
public class RuntimeMemoryExample {public static void main(String[] args) {Runtime runtime = Runtime.getRuntime();System.out.println("总内存: " + runtime.totalMemory() + " 字节");System.out.println("空闲内存: " + runtime.freeMemory() + " 字节");System.out.println("最大内存: " + runtime.maxMemory() + " 字节");}
}
3. 关闭钩子
Runtime.getRuntime().addShutdownHook(Thread hook)
:用于注册一个关闭钩子,当 JVM 正常关闭时,会执行该钩子线程。
public class RuntimeShutdownHookExample {public static void main(String[] args) {Runtime.getRuntime().addShutdownHook(new Thread(() -> {System.out.println("JVM 即将关闭,执行清理操作...");}));System.out.println("程序正在运行...");System.exit(0);}
}
综上所述,System
类主要提供了与系统相关的一些静态方法和属性,而 Runtime
类则提供了与 Java 虚拟机运行时环境交互的功能。
BigDecimal
在 Java 中,BigDecimal
类位于 java.math
包下,用于进行高精度的十进制数运算。基本数据类型(如 float
和 double
)在进行小数运算时会存在精度丢失的问题,而 BigDecimal
可以避免这种情况,适合用于需要精确计算的场景,如金融领域。
构造方法
BigDecimal
提供了多种构造方法,常用的有:
BigDecimal(String val)
:通过字符串来创建BigDecimal
对象,这是推荐的方式,因为它能精确表示传入的数值。BigDecimal(double val)
:通过double
类型的值来创建对象,但可能会出现精度问题,因为double
本身就存在精度误差。BigDecimal(int val)
:通过int
类型的值来创建对象。BigDecimal(long val)
:通过long
类型的值来创建对象。
import java.math.BigDecimal;public class BigDecimalConstructorExample {public static void main(String[] args) {// 使用字符串创建 BigDecimal 对象BigDecimal bd1 = new BigDecimal("0.1");System.out.println("通过字符串创建: " + bd1);// 使用 double 创建 BigDecimal 对象BigDecimal bd2 = new BigDecimal(0.1);System.out.println("通过 double 创建: " + bd2);// 使用 int 创建 BigDecimal 对象BigDecimal bd3 = new BigDecimal(10);System.out.println("通过 int 创建: " + bd3);}
}
常用方法
1. 基本运算方法
add(BigDecimal augend)
:加法运算,返回两个BigDecimal
对象相加的结果。subtract(BigDecimal subtrahend)
:减法运算,返回两个BigDecimal
对象相减的结果。multiply(BigDecimal multiplicand)
:乘法运算,返回两个BigDecimal
对象相乘的结果。divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
:除法运算,scale
表示保留的小数位数,roundingMode
表示舍入模式。
import java.math.BigDecimal;
import java.math.RoundingMode;public class BigDecimalArithmeticExample {public static void main(String[] args) {BigDecimal num1 = new BigDecimal("10.5");BigDecimal num2 = new BigDecimal("2.5");// 加法BigDecimal sum = num1.add(num2);System.out.println("加法结果: " + sum);// 减法BigDecimal difference = num1.subtract(num2);System.out.println("减法结果: " + difference);// 乘法BigDecimal product = num1.multiply(num2);System.out.println("乘法结果: " + product);// 除法BigDecimal quotient = num1.divide(num2, 2, RoundingMode.HALF_UP);System.out.println("除法结果: " + quotient);}
}
2. 比较方法
compareTo(BigDecimal val)
:比较两个BigDecimal
对象的大小,返回值为 -1(小于)、0(等于)或 1(大于)。
import java.math.BigDecimal;public class BigDecimalCompareExample {public static void main(String[] args) {BigDecimal num1 = new BigDecimal("10");BigDecimal num2 = new BigDecimal("20");int result = num1.compareTo(num2);if (result < 0) {System.out.println(num1 + " 小于 " + num2);} else if (result == 0) {System.out.println(num1 + " 等于 " + num2);} else {System.out.println(num1 + " 大于 " + num2);}}
}
3. 舍入模式
在进行除法运算或设置小数位数时,需要指定舍入模式,RoundingMode
枚举类提供了多种舍入模式,常用的有:
RoundingMode.HALF_UP
:四舍五入,当舍弃部分的最高位大于等于 5 时进位。RoundingMode.DOWN
:直接舍弃后面的数字,不进行进位。RoundingMode.UP
:只要舍弃部分不为 0,就进位。
import java.math.BigDecimal;
import java.math.RoundingMode;public class BigDecimalRoundingExample {public static void main(String[] args) {BigDecimal num = new BigDecimal("3.14159");// 四舍五入保留两位小数BigDecimal roundedHalfUp = num.setScale(2, RoundingMode.HALF_UP);System.out.println("四舍五入结果: " + roundedHalfUp);// 直接舍弃保留两位小数BigDecimal roundedDown = num.setScale(2, RoundingMode.DOWN);System.out.println("直接舍弃结果: " + roundedDown);// 进位保留两位小数BigDecimal roundedUp = num.setScale(2, RoundingMode.UP);System.out.println("进位结果: " + roundedUp);}
}
- 构造方法选择:尽量使用
BigDecimal(String val)
构造方法,避免使用BigDecimal(double val)
以防止精度丢失。 - 异常处理:在进行除法运算时,如果除不尽且未指定舍入模式,会抛出
ArithmeticException
异常,因此需要指定合适的舍入模式和小数位数。
BigDecimal
类为高精度的十进制数运算提供了强大的支持,在需要精确计算的场景中发挥着重要作用。