前言
学常用类。String的不可变性、StringBuilder的性能优势、JDK 8新时间API,每个都是面试常考点。
1. String:不可变与常量池
java
String s1 = "hello";
String s2 = new String("hello");
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
== 比较地址,equals() 比较内容。常量池复用字面量,但 new String() 一定新建对象。
2. StringBuilder vs StringBuffer
| 类 | 线程安全 | 场景 |
|---|---|---|
| String | 安全(不可变) | 不修改的常量 |
| StringBuilder | 不安全 | 单线程拼接(推荐) |
| StringBuffer | 安全 | 多线程环境 |
循环拼接必须用 StringBuilder,否则性能极差。
3. JDK 8 新时间 API
java
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
比旧的 Date/Calendar 设计清晰,不可变、线程安全,类似 JS 的 dayjs。
4. 包装类陷阱:== vs equals
java
Integer a = 200;
Integer b = 200;
System.out.println(a == b); // false!
System.out.println(a.equals(b)); // true
Integer 缓存 -128~127,超出范围 == 比较地址,结果 false。
5. 实战:工具类封装
StringUtils.java:
java
public class StringUtils {
// 判断空字符串(null 或 空串)
public static boolean isEmpty(String str) {
return str == null || str.trim().length() == 0;
}
// 判断非空
public static boolean isNotEmpty(String str) {
return !isEmpty(str);
}
// 隐藏手机号中间四位
public static String hidePhone(String phone) {
if (phone == null || phone.length() != 11) {
return phone;
}
return phone.substring(0, 3) + "****" + phone.substring(7);
}
// 生成指定长度随机字符串
public static String randomString(int length) {
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
StringBuilder sb = new StringBuilder();
Random random = new Random();
for (int i = 0; i < length; i++) {
sb.append(chars.charAt(random.nextInt(chars.length())));
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(isEmpty("")); // true
System.out.println(isEmpty(" ")); // true
System.out.println(hidePhone("13812345678")); // 138****5678
System.out.println(randomString(10)); // 随机10位字符串
}
}
DateUtils.java:
java
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateUtils {
private static final DateTimeFormatter DEFAULT_FORMATTER =
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 格式化当前时间
public static String now() {
return LocalDateTime.now().format(DEFAULT_FORMATTER);
}
// 格式化指定时间
public static String format(LocalDateTime dateTime) {
return dateTime.format(DEFAULT_FORMATTER);
}
// 解析字符串
public static LocalDateTime parse(String str) {
return LocalDateTime.parse(str, DEFAULT_FORMATTER);
}
// 获取今天日期
public static String today() {
return LocalDate.now().toString();
}
public static void main(String[] args) {
System.out.println("当前时间:" + now());
System.out.println("今天日期:" + today());
}
}