跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava

Java 核心工具类实战:String 与日期时间 API

String 类作为 Java 基础核心,其不可变性与常量池机制直接影响内存与性能。本文详解 String 构建、比较、查找、转换及替换方法,剖析 StringBuilder 与 StringBuffer 在拼接场景下的性能差异。针对时间处理,对比过时 Date 类,重点讲解 Java 8 java.time 包中的 LocalDateTime 新 API,涵盖对象创建、格式化、算术运算及 TemporalAdjusters 高级调整器,助力开发者写出更高效、安全的代码。

DevOpsTeam发布于 2026/3/16更新于 2026/4/304 浏览
Java 核心工具类实战:String 与日期时间 API

一、String 类深度解析

1.1 常见构建方式

在 Java 中,创建字符串的方式多种多样。这里梳理了四种最基础且常用的方法。

public static void main(String[] args) {
    // 1. 使用字符串常量进行赋值
    String string1 = "Hello World";
    System.out.println(string1);

    // 2. 使用 new 关键字
    String string2 = new String("Hello World");
    System.out.println(string2);

    // 3. 使用字符数组构造
    char[] chars = new char[]{'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
    String string3 = new String(chars);
    System.out.println(string3);

    // 4. 使用字节数组构造
    byte[] bytes = new byte[]{72, 101, 108, 108, 111, 32, 87, 111, , , };
        (bytes);
    System.out.println(string4);
}
114
108
100
String
string4
=
new
String

1.2 底层存储与常量池

理解字符串的存储机制对于避免内存泄漏和性能问题至关重要。

public static void main(String[] args) {
    String string1 = "Hello World";
    String string2 = "Hello World";
    String string3 = new String("Hello World");
    
    System.out.println(string1 == string2); // true
    System.out.println(string1 == string3); // false
}

在这里插入图片描述

字符串常量池:这是 JVM 用于优化字符串存储的机制。本质上是一个固定大小的 HashTable。当使用字面量(如 "Hello World")时,JVM 会先检查池中是否存在该对象。若存在则直接返回引用;若不存在则新建。注意:使用 new 关键字创建的对象通常会在堆内存中生成新实例,即使内容相同,也不会自动放入常量池,除非显式调用 intern()。

1.3 核心方法实战

1.3.1 字符串比较
  • == 运算符:对于基本类型比较值,对于引用类型比较的是内存地址。
  • equals() 方法:Object 类默认实现等同于 ==,但 String 类重写了该方法,按字典序比较内容。
  • compareTo() 方法:逐字符比较 Unicode 值。若不同则返回差值;若长度不同则返回长度差。
public static void main(String[] args) {
    int a = 1, b = 1;
    System.out.println(a == b); // true

    String s1 = new String("Hello World");
    String s2 = new String("Hello World");
    System.out.println(s1 == s2); // false,地址不同
    System.out.println(s1.equals(s2)); // true,内容相同

    String s3 = "hello world";
    System.out.println(s1.compareTo(s3)); // 返回 -32 ('H' - 'h')
}
1.3.2 查找与定位
  • charAt(int index):获取指定索引的字符,越界抛出异常。
  • indexOf(int ch) / indexOf(String str):返回首次出现的索引,未找到返回 -1。
  • indexOf(int ch, int fromIndex):从指定位置开始查找。
public static void main(String[] args) {
    String string = "HelloWorld";
    // H 的 Unicode 值为 72
    System.out.println(string.indexOf(72)); // 0
    System.out.println(string.indexOf('H', 3)); // 5,第二个 H 的位置
}
1.3.3 转换与格式化
  • valueOf(...):将其他类型转为 String。
  • Integer.parseInt():将 String 转为数字。
  • toUpperCase() / toLowerCase():大小写转换。
  • toCharArray():转为字符数组。
  • format():支持占位符的格式化输出。
public static void main(String[] args) {
    String name = "Alice", age = "30";
    String result = String.format("Name: %s, Age: %d", name, Integer.parseInt(age));
    System.out.println(result);
}
1.3.4 替换与拆分
方法功能
replaceAll(regex, replacement)全局替换正则匹配项
replaceFirst(regex, replacement)替换第一个匹配项
public static void main(String[] args) {
    String s = "Hello World";
    System.out.println(s.replaceAll("l", "_")); // He__o Wor_d
    System.out.println(s.replaceFirst("l", "_")); // He_lo World
}

正则表达式提示:split 方法基于正则。常用元字符包括 . (任意字符), * (零次或多次), + (一次或多次), ? (零次或一次), ^ (开头), $ (结尾)。

1.3.5 截取与修剪
  • substring(beginIndex):从 beginIndex 到末尾。
  • substring(beginIndex, endIndex):包含 beginIndex,不包含 endIndex。
  • trim():去除首尾空白字符。
public static void main(String[] args) {
    String s = " Hello World ";
    System.out.println("[" + s.trim() + "]"); // [Hello World]
    System.out.println(s.substring(1, 2)); // e
}
1.3.6 intern 方法

intern() 方法可以将当前字符串对象强制加入常量池并返回其引用。如果池中已有相同内容的字符串,则直接返回池中的引用。这对于减少重复字符串对象的内存占用非常有用。

在这里插入图片描述

1.4 不可变性与可变序列

String 是不可变的(Immutable),任何修改操作都会生成新对象。这在循环拼接时会带来性能开销。

public static void main(String[] args) {
    String s = "Hello";
    s = s + " World"; // 实际创建了新的 String 对象
}

针对频繁修改的场景,推荐使用 StringBuilder(单线程高效)或 StringBuffer(多线程安全)。

public static void main(String[] args) {
    long start = System.currentTimeMillis();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10000; i++) {
        sb.append(i);
    }
    long end = System.currentTimeMillis();
    System.out.println(end - start); // 耗时极短
}

对比总结:

  • String:不可变,线程安全,适合不常变动的场景。
  • StringBuilder:可变,非线程安全,单线程下性能最优。
  • StringBuffer:可变,线程安全(synchronized),多线程下可用但性能略低。

在这里插入图片描述

二、日期时间处理

2.1 Date 类(遗留)

java.util.Date 是早期 API,精确到毫秒,但设计存在缺陷且线程不安全。Java 8 之后推荐使用 java.time 包。

public class Date_Demo {
    public static void main(String[] args) {
        Date date1 = new Date(); // 当前时间
        System.out.println(date1);
        // 参数说明:年份从 1900 起算,月份从 0 起算
        Date date2 = new Date(125, 5, 13); 
        System.out.println(date2);
    }
}

2.2 LocalDateTime 类(推荐)

LocalDateTime 表示不带时区的本地日期和时间,结合了 LocalDate 和 LocalTime 的功能。

2.2.1 对象创建

构造方法私有化,需通过静态工厂方法创建。

public static void main(String[] args) {
    // 1. 获取当前时间
    LocalDateTime time1 = LocalDateTime.now();
    
    // 2. 指定时间
    LocalDateTime time2 = LocalDateTime.of(2025, 6, 13, 22, 57);
    
    // 3. 组合 LocalDate 和 LocalTime
    LocalDateTime dateTime = LocalDateTime.of(LocalDate.now(), LocalTime.now());
    
    // 4. 解析字符串
    LocalDateTime parsed = LocalDateTime.parse("2026-06-13T23:03:00");
}
2.2.2 格式化与解析

使用 DateTimeFormatter 定义自定义格式。

public static void main(String[] args) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String dateStr = "2026-06-13 23:03:10";
    
    // 解析
    LocalDateTime dt = LocalDateTime.parse(dateStr, formatter);
    // 格式化
    String formatted = dt.format(formatter);
}
2.2.3 信息获取与运算

可以获取年、月、日、周几等信息,并进行加减运算。

public static void main(String[] args) {
    LocalDateTime now = LocalDateTime.now();
    
    // 获取信息
    int year = now.getYear();
    int dayOfWeek = now.getDayOfWeek().getValue(); // 1=Mon, 7=Sun
    
    // 加减运算
    LocalDateTime nextWeek = now.plusWeeks(1);
    LocalDateTime lastMonth = now.minusMonths(1);
}
2.2.4 高级调整器

利用 TemporalAdjusters 可以轻松获取特定周期的边界时间。

public static void main(String[] args) {
    LocalDateTime now = LocalDateTime.now();
    
    // 本周周一
    LocalDateTime firstDayOfWeek = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
    // 本月第一天
    LocalDateTime firstDayOfMonth = now.with(TemporalAdjusters.firstDayOfMonth());
}

目录

  1. 一、String 类深度解析
  2. 1.1 常见构建方式
  3. 1.2 底层存储与常量池
  4. 1.3 核心方法实战
  5. 1.3.1 字符串比较
  6. 1.3.2 查找与定位
  7. 1.3.3 转换与格式化
  8. 1.3.4 替换与拆分
  9. 1.3.5 截取与修剪
  10. 1.3.6 intern 方法
  11. 1.4 不可变性与可变序列
  12. 二、日期时间处理
  13. 2.1 Date 类(遗留)
  14. 2.2 LocalDateTime 类(推荐)
  15. 2.2.1 对象创建
  16. 2.2.2 格式化与解析
  17. 2.2.3 信息获取与运算
  18. 2.2.4 高级调整器
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 前端核心解析:技术差异、技能树与实战路径
  • 微信小程序原生开发入门:从零构建首个可交互页面
  • 基于 Rust 与 DeepSeek 构建高性能 Text-to-SQL 数据库代理服务
  • 扫地机器人与互联网公司软件测试对比
  • Google AI Studio 最佳实践与 Gemini 3.0 Pro 参数配置
  • 基于 OpenClaw 与飞书搭建服务器运维机器人
  • AI 产品经理核心职责、技能体系与实战策略指南
  • Flutter 三方库 tiktoken 在鸿蒙端侧的 AI 适配与 Token 计算指南
  • Adoptium Temurin JDK 安装与配置指南
  • Visual C++运行库安装失败修复指南
  • API、REST API、RESTful API 与 Web Service 的区别
  • Flutter for OpenHarmony 实战:通义万相 AIGC 联调与相册持久化
  • Vue 组件生命周期函数解析
  • 基于 Docker 和 cpolar 部署 ONLYOFFICE 远程协作系统
  • 无需重装:将软件从旧电脑迁移至新机的方法详解
  • Flutter 三方库 ethereum_addresses 的鸿蒙化适配与地址校验实战
  • GitHub Copilot Pro 使用指南:模型配额与效率优化
  • 哈希表实现原理与代码详解
  • MySQL 主键与外键的区别及设计最佳实践
  • LLaMA-Factory 全流程模型训练指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online