Java 常用类:String不可变、新时间API与包装类陷阱

前言

学常用类。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());
    }
}
相关推荐
阿酷tony8 分钟前
视频专栏列表的防录屏水印和跑马灯效果(也可网站调用)
java·前端·音视频
洋不写bug24 分钟前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
xcl092525 分钟前
全民健身智慧管理系统实战指南:从架构设计到部署落地
java·spring boot
Bs_MoneyMagnet30 分钟前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物
ly768938 分钟前
生产环境 Spring Boot 应用内存泄漏排查实战
java·spring boot·spring·内存泄漏·threadlocal·gc日志·堆转储
IT小白杨1 小时前
eBay多账号如何应对关联判定:主体、收款、IP、环境四层配置清单一次讲清
java·网络·网络协议·tcp/ip·自动化·指纹浏览器
萧瑟余晖1 小时前
JPA 规范与 Hibernate 入门详解
后端·架构·hibernate
程序员cxuan2 小时前
跟 WebUI 说再见了,最强 DeepSeek 桌面端来了!
人工智能·后端·程序员
無a伟2 小时前
RabbitMq高级特性:TTL,死信队列,延迟队列
java·分布式·rabbitmq
geovindu2 小时前
CSharp: Strategy Pattern
开发语言·后端·c#·.net·.netcore·策略模式·行为模式