?在 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
?類為高精度的十進制數運算提供了強大的支持,在需要精確計算的場景中發揮著重要作用。