Skip to content

02-常用 API 进阶 & 正则表达式

对应原始资料:JavaSE进阶_day04

一、Object 类详解

所有类的根类,常见方法:

方法说明
public String toString()默认返回 类名@地址,建议重写为字段值
public boolean equals(Object obj)默认比较地址,建议重写为字段值比较
public int hashCode()返回哈希值,与 equals 配合(重写 equals 必须重写 hashCode)
public Class getClass()返回运行时类(反射用)
protected void finalize()GC 回收前调用(JDK 9 已废弃)
protected Object clone()浅拷贝(需实现 Cloneable)

toString/equals 重写规范

java
@Override
public String toString() {
    return "Student{name='" + name + "', age=" + age + "}";
}
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student s = (Student) o;
    return age == s.age && Objects.equals(name, s.name);
}
@Override
public int hashCode() { return Objects.hash(name, age); }

二、Objects 工具类(JDK 7+)

java
Objects.equals(a, b);        // 空指针安全
Objects.hash(name, age);     // 计算哈希
Objects.requireNonNull(obj); // 非空校验,为 null 抛 NPE
Objects.toString(obj, "默认值");

三、日期时间类

1. 旧版(JDK 8 之前)

java
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = sdf.format(d);
Date d2 = sdf.parse("2024-01-01 12:00:00");   // 解析需处理异常
Calendar c = Calendar.getInstance();
c.get(Calendar.YEAR);
c.add(Calendar.DAY_OF_MONTH, 5);   // 加 5 天

2. 新版(JDK 8+,推荐)

java
LocalDate     today  = LocalDate.now();
LocalTime     now    = LocalTime.now();
LocalDateTime ldt    = LocalDateTime.now();

LocalDate d = LocalDate.of(2024, 1, 1);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String s = ldt.format(dtf);

// 计算
LocalDate tomorrow = today.plusDays(1);
Period p = Period.between(d1, d2);   // 间隔
long days = ChronoUnit.DAYS.between(d1, d2);

重点SimpleDateFormat 线程不安全,多线程下用 DateTimeFormatter

四、Math / System / BigDecimal

详见基础模块 05-常用API,进阶重点:

BigDecimal 除法必须指定模式

java
BigDecimal r = a.divide(b, 10, RoundingMode.HALF_UP);

五、Integer / Long 进阶

java
Integer.toBinaryString(10);   // "1010"
Integer.toHexString(255);     // "ff"
Integer.toOctalString(64);
Integer.parseInt("1A", 16);   // 进制转换

六、Arrays 工具类

java
int[] arr = {5, 3, 1, 4, 2};

Arrays.sort(arr);                       // 排序(底层双轴快排)
Arrays.toString(arr);                   // 转字符串 [1, 2, 3]
Arrays.binarySearch(arr, 3);            // 二分查找(需先排序),找不到返回负数
Arrays.copyOf(arr, 10);                 // 拷贝,新长度
Arrays.copyOfRange(arr, 1, 3);          // [1, 3)
Arrays.fill(arr, 0);                    // 全部填充 0
Arrays.equals(arr1, arr2);              // 比较

七、正则表达式(重点)

1. 为什么要学

用一段简洁的"规则字符串"去匹配、校验、提取文本,避免冗长的 if/else。

2. 字符类与预定义字符

写法含义
[abc]a 或 b 或 c
[^abc]除 a/b/c
[a-z]a 到 z
[a-zA-Z0-9]字母数字
.任意字符
\d数字 [0-9]
\D非数字
\w单词字符 [a-zA-Z0-9_]
\W非单词字符
\s空白字符

3. 数量词

写法含义
X?0 或 1 次
X*0 或多次
X+1 或多次
X{n}恰好 n 次
X{n,}至少 n 次
X{n,m}n 到 m 次

4. Java 中使用正则

java
// 校验
boolean ok = "13512345678".matches("1[3-9]\\d{9}");

// 分割
String[] parts = "a,b,,c".split(",");

// 替换
String r = "hello123world".replaceAll("\\d", "_");

// 捕获提取
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("java38andmysql21");
while (m.find()) System.out.println(m.group());

5. 经典正则

java
String email = "^[\\w.-]+@[\\w-]+(\\.[\\w-]+)+$";
String phone = "1[3-9]\\d{9}";
String idCard = "\\d{17}[0-9Xx]";
String ip = "((25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d?\\d)";

注意:Java 字符串中 \ 是转义符,正则的 \d 要写成 \\d

练习建议

  1. 重写自定义类的 toString/equals/hashCode。
  2. LocalDateTime + DateTimeFormatter 格式化当前时间并加 100 天。
  3. 用 BigDecimal 完成 1 / 3 保留 5 位小数。
  4. 写正则校验:手机号、邮箱、QQ(5~12 位数字)。
  5. 用 Matcher 提取一篇文章中的所有数字并求和。