題目需求
- 重複讀取華氏溫度輸入
- 轉換為攝氏溫度:
C = (F - 32) * 5 / 9
- 輸出轉換結果
- 統計記憶體佔用與執行時間

完整實作代碼
import java.util.Scanner;
public class TemperatureConverter {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
long startMemory = runtime.totalMemory() - runtime.freeMemory();
long startTime = System.currentTimeMillis();
Scanner scanner = new Scanner(System.in);
System.out.println("華氏轉攝氏溫度轉換器 (輸入非數字結束)");
System.out.printf("初始記憶體佔用: %,d bytes%n", startMemory);
int count = 0;
while (scanner.hasNextDouble()) {
double fahrenheit = scanner.nextDouble();
double celsius = (fahrenheit - 32) * 5.0 / 9.0;
System.out.printf("輸入: %.2f°F → 輸出: %.2f°C%n", fahrenheit, celsius);
count++;
}
long endTime = System.currentTimeMillis();
long endMemory = runtime.totalMemory() - runtime.freeMemory();
System.out.println("\n=== 執行統計 ===");
System.out.printf("轉換次數: %d%n", count);
System.out.printf("耗時: %d ms%n", endTime - startTime);
System.out.printf("記憶體增長: %,d bytes%n", endMemory - startMemory);
scanner.close();
}
}
關鍵 API 解析
| API | 用途 | 注意事項 |
Runtime.getRuntime() | 取得 JVM 執行環境 | 單例模式 |
totalMemory() | JVM 當前堆記憶體總量 | 含已用+可用 |
freeMemory() | 當前可用堆記憶體 | GC 後較準確 |
System.currentTimeMillis() | 毫秒級時間戳 | 適合測量較長操作 |
System.nanoTime() | 奈秒級相對時間 | 適合微基準測試 |
進階:JMX 詳細記憶體監控
import java.lang.management.*;
MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
MemoryUsage heapUsage = memoryBean.getHeapMemoryUsage();
System.out.printf("堆初始: %,d, 已用: %,d, 承諾: %,d, 最大: %,d%n",
heapUsage.getInit(), heapUsage.getUsed(),
heapUsage.getCommitted(), heapUsage.getMax());
溫度轉換公式驗證
| 華氏度 (°F) | 攝氏度 (°C) | 驗算 |
| 32 | 0 | 冰點 |
| 212 | 100 | 沸點 |
| 98.6 | 37 | 人體常溫 |
| -40 | -40 | 兩制相等點 |
整數除法陷阱提醒
// 錯誤:整數除法截斷
int c = (f - 32) * 5 / 9; // 5/9 = 0
// 正確:強制浮點運算
double c = (f - 32) * 5.0 / 9.0;
// 或
double c = (f - 32) * 5 / 9.0; // 5/9.0 先算成 double