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