java中的常用API

Java 中的常用 API

本文介绍了 Java 中常用的 API,包括BigDecimal、随机数生成、数学运算、系统操作、Runtime类的使用,以及 Java 8 之后的日期和时间 API。


一、BigDecimal 精确计算

1.1 浮点数精度问题演示

1
2
// 浮点数运算存在精度丢失问题
System.out.println(1.01 + 2.02); // 输出:3.0300000000000002

1.2 BigDecimal 基础用法

1
2
3
4
5
6
7
8
9
10
11
12
// 推荐使用字符串构造或 valueOf 方法初始化(避免double传参)
BigDecimal one = new BigDecimal("1.01"); // 精确构造
BigDecimal two = BigDecimal.valueOf(2.02); // 自动优化数值转换

// 常规算术运算
System.out.println(one.add(two)); // 加法:3.03
System.out.println(one.subtract(two)); // 减法:-1.01
System.out.println(one.multiply(two)); // 乘法:2.0402

// 除法运算(必须指定精度控制)
System.out.println(one.divide(two, RoundingMode.HALF_UP)); // 默认精度
System.out.println(one.divide(two, 10, RoundingMode.FLOOR)); // 指定10位小数+舍入模式

1.3 精度控制与比较

1
2
3
4
5
6
// 小数位数控制
BigDecimal value = BigDecimal.valueOf(1.3543242342342);
System.out.println(value.setScale(4, RoundingMode.HALF_UP)); // 四舍五入保留4位:1.3543

// 数值比较(推荐使用 compareTo)
System.out.println(value.compareTo(BigDecimal.ZERO)); // 返回1(大于0)

二、安全随机数生成

2.1 基础随机数生成

1
2
3
4
5
6
// 无边界随机数
int fullRangeInt = ThreadLocalRandom.current().nextInt();
long fullRangeLong = ThreadLocalRandom.current().nextLong();

// [0.0, 1.0) 随机浮点数
double unitDouble = ThreadLocalRandom.current().nextDouble();

2.2 范围约束生成

1
2
3
4
5
6
7
8
9
10
11
12
// 生成 [0, 100) 随机整数
int rangeInt = ThreadLocalRandom.current().nextInt(0, 100);

// 生成 [0, 10] 闭合区间随机整数(包含上限)
int closedRange = ThreadLocalRandom.current().nextInt(0, 10 + 1);

// 生成 [0.01, 100.0) 随机浮点数
double rangeDouble = ThreadLocalRandom.current().nextDouble(0.01, 100.0);

// 格式化随机浮点数(保留两位小数)
BigDecimal formatted = BigDecimal.valueOf(rangeDouble)
.setScale(2, RoundingMode.HALF_UP);

三、Math 数学运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 基础运算
System.out.println(Math.abs(-100)); // 绝对值 → 100
System.out.println(Math.ceil(4.3)); // 向上取整 → 5.0
System.out.println(Math.floor(4.9)); // 向下取整 → 4.0
System.out.println(Math.round(3.5)); // 四舍五入 → 4

// 数值比较
System.out.println(Math.max(3, 5)); // 最大值 → 5
System.out.println(Math.min(2.8, 3)); // 最小值 → 2.8

// 幂运算 & 开方
System.out.println(Math.pow(2, 3)); // 2^3 → 8.0
System.out.println(Math.sqrt(16)); // 平方根 → 4.0

// 三角函数
System.out.println(Math.sin(Math.PI / 2)); // 正弦函数 → 1.0
System.out.println(Math.cos(Math.PI)); // 余弦函数 → -1.0

// 工具方法
System.out.println(Math.random()); // 随机数 → [0.0, 1.0)
System.out.println(Math.log(Math.E)); // 自然对数 → 1.0
System.out.println(Math.exp(2)); // e的幂 → 7.389

四、System 系统操作

1
2
3
4
5
6
7
8
// 获取当前时间戳(毫秒)
System.out.println(System.currentTimeMillis()); // 示例:1743491219771

// 垃圾回收(建议手动调用)
System.gc(); // 提示JVM进行垃圾回收

// 终止JVM(谨慎使用)
System.exit(0); // 0表示正常退出

五、Runtime 类

5.1 获取 Runtime 实例

1
Runtime runtime = Runtime.getRuntime();

5.2 执行系统命令

1
2
3
4
5
6
7
try {
// 示例:打开系统计算器(Windows)
Process process = runtime.exec("calc.exe");
process.waitFor(); // 等待命令执行完成
} catch (Exception e) {
e.printStackTrace();
}

5.3 内存管理

1
2
3
4
5
6
7
8
9
10
11
// JVM 当前空闲内存
long freeMem = runtime.freeMemory();
System.out.println("Free Memory: " + freeMem / 1024 / 1024 + " MB");

// JVM 当前已分配的总内存
long totalMem = runtime.totalMemory();
System.out.println("Total Memory: " + totalMem / 1024 / 1024 + " MB");

// JVM 可用的最大内存
long maxMem = runtime.maxMemory();
System.out.println("Max Memory: " + maxMem / 1024 / 1024 + " MB");

5.4 注册关闭钩子

1
2
3
runtime.addShutdownHook(new Thread(() -> {
System.out.println("JVM is shutting down, cleanup here...");
}));

六、Java 8 日期和时间 API

6.1 LocalDate 表示日期(年 月 日)

1
2
3
4
5
6
7
// 获取本地日期对象
LocalDate localDate = LocalDate.now();
System.out.println(localDate); // 输出完整日期:2025-04-02
System.out.println(localDate.getYear()); // 获取年份:2025
System.out.println(localDate.getMonth()); // 获取月份:APRIL
System.out.println(localDate.getDayOfMonth()); // 获取当月天数:2
System.out.println(localDate.getDayOfWeek().getValue()); // 获取星期:3(周三)

6.2 LocalTime 表示时间(时 分 秒)

1
2
3
4
5
6
7
8
9
10
11
// 获取本地时间对象(精确到纳秒)
LocalTime localTime = LocalTime.now();

// 输出完整时间
System.out.println(localTime); // 示例:12:29:05.917235500

// 获取各时间单位
System.out.println("Hour: " + localTime.getHour()); // 小时(0-23)
System.out.println("Minute: " + localTime.getMinute()); // 分钟(0-59)
System.out.println("Second: " + localTime.getSecond()); // 秒(0-59)
System.out.println("Nano: " + localTime.getNano()); // 纳秒(0-999,999,999)

6.3 LocalDateTime 表示日期和时间(年 月 日 时 分 秒)

1
2
3
4
// 获取当前本地日期时间(精确到纳秒)
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("完整日期时间: " + localDateTime);
// 输出示例:2025-04-02T15:01:23.045120600

6.4 ZoneId 带时区

1
2
3
// 1. 获取所有可用时区 ID
Set<String> zoneIds = ZoneId.getAvailableZoneIds();
System.out.println("可用时区数量: " + zoneIds.size()); // 输出:603+

以下是关于地理坐标系统中 经线(经度)纬线(纬度) 的基础知识补充:

6.4.1 经线(经度)

  • 定义:地球表面连接南北极的虚拟线,表示东西方向的位置。
  • 分类:
    • 东经(E, East):从本初子午线(0°)向东至 180°,范围 0° ≤ 东经 < 180°
      示例:北京位于东经约 116.4°。
    • 西经(W, West):从本初子午线向西至 180°,范围 0° ≤ 西经 < 180°
      示例:纽约位于西经约 74.0°。

6.4.2 纬线(纬度)

  • 定义:地球表面与赤道平行的虚拟线,表示南北方向的位置。
  • 分类:
    • 北纬(N, North):从赤道(0°)向北至北极点(90°N),范围 0° ≤ 北纬 ≤ 90°
      示例:上海位于北纬约 31.2°。
    • 南纬(S, South):从赤道向南至南极点(90°S),范围 0° ≤ 南纬 ≤ 90°
      示例:悉尼位于南纬约 33.9°。

6.4.3 经纬度与时间的关系

  • 时区划分依据:经线是划分时区的主要参考(每 15° 经度对应 1 小时时差)。
  • 示例:
    • 东经 120° 对应中国标准时间(UTC+8)。
    • 西经 97° 对应美国中部时间(UTC-6)。

6.5 Instant 时间戳

1
2
3
4
// 1. 获取当前时间戳(从 1970-01-01T00:00:00Z 开始的秒数+纳秒)
Instant instant = Instant.now();
System.out.println("当前时间戳: " + instant);
// 示例输出: 2025-04-02T09:18:04.689312400Z

6.6 DateTimeFormatter 日期格式化

1
2
3
4
5
6
LocalDateTime now = LocalDateTime.now();

// 1. 使用 ISO 标准格式
String formatted = now.format(DateTimeFormatter.ISO_DATE_TIME);
System.out.println("ISO 格式输出: " + formatted);
// 示例输出: 2025-04-02T15:30:45.123

附录

参考链接

  1. Java 官方文档