跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java 字符处理:char、String 与 StringBuilder 详解

详细解析了 Java 中 char、String、StringBuilder 和 StringBuffer 的区别。char 是基本数据类型;String 不可变且线程安全,适合常量;StringBuilder 可变但非线程安全,单线程性能高;StringBuffer 可变且线程安全,多线程适用。文章通过对比表和选用建议,指导开发者根据场景选择合适类型以优化代码效率。

NodeJser发布于 2026/3/24更新于 2026/10/2596 浏览

1. char:基本数据类型

  • 本质:char 是 Java 中的基本数据类型(Primitive Type),表示一个 16 位无符号 Unicode 字符。它占用 2 个字节(16 位)内存空间。
  • 值范围:最小值为 \u0000 (即 0),最大值为 \uffff (即 65,535)。可以表示世界上大多数字符。
  • 特点:
    • 是基本类型,不是对象,没有方法。
    • 字面值用单引号 ' 表示,例如:char grade = 'A';
    • 可以直接参与算术运算(提升为 int)。
    • 存储在栈内存(如果作为局部变量)或对象内部。
  • 用途:主要用于表示单个字符。

2. String:不可变的字符序列

  • 本质:String 是一个 类(Class),用于表示不可变的字符序列。它内部封装了一个 char[] 数组来存储字符。
  • 核心特性 - 不可变性 (Immutability):
    • 一旦 String 对象被创建,其包含的字符序列 就不能被更改。任何看似修改 String 的操作(如 concat, substring, toUpperCase, replace 等),实际上都是 创建并返回一个全新的 String 对象。
    • 优点:
      • 线程安全:由于不可变,多个线程可以安全地共享同一个 String 对象,无需同步。
      • 安全性:常用于敏感信息(如密码)的传递,因为不可变,避免了内容被意外修改的风险。
      • HashCode 稳定性:String 的 hashCode() 值在对象创建时计算一次并缓存,后续调用直接返回缓存值,效率高且稳定,非常适合作为哈希表的键(如 HashMap)。
    • 缺点:
      • 频繁修改效率低:每次'修改'都会产生新的对象,如果在一个循环中反复拼接字符串,会产生大量中间临时对象,增加 GC 压力。
  • 创建方式:
    • 字面量:String s = "abc"; (优先使用常量池)
    • 构造函数:String s = new String("abc"); (在堆上新建对象)
    • 字符数组:char[] data = {'a', 'b', 'c'}; String str = new String(data);
    • + 运算符拼接(底层可能编译优化为 StringBuilder)。
  • 常用方法:length(), charAt(int index), concat(String str), equals(Object anObject), indexOf(String str), substring(int beginIndex), toLowerCase(), toUpperCase(), trim(), split(String regex) 等。

缓存与优化:Java 使用'字符串常量池'(String Pool)来缓存字符串字面量,减少重复创建的开销。例如:

String s1 = "hello"; // 可能从池中获取
String s2 = "hello"; // 指向池中同一个对象
String s3 = new String("hello"); // 强制在堆上创建新对象

3. StringBuilder:可变的字符序列 (非线程安全)

  • 本质:StringBuilder 也是一个类,用于表示 可变的字符序列。它也封装了一个 char[] 数组(称为缓冲区)。
  • 核心特性 - 可变性 (Mutability):
    • 对象内部的字符序列 可以被修改。修改操作(如 append, insert, delete, replace)直接在原有缓冲区上进行,不会创建新对象(除非缓冲区容量不足需要扩容)。
  • 特点:
    • 高效修改:非常适合在循环中或需要多次修改字符串内容的场景(如日志拼接、动态 SQL 生成),避免了 String 拼接带来的性能问题。
    • 非线程安全:StringBuilder 的方法 没有 进行同步(synchronized)处理。如果多个线程同时修改同一个 StringBuilder 实例,可能会导致数据不一致。因此,它适用于 单线程环境。
    • 创建:通常通过构造函数 new StringBuilder() 或 new StringBuilder(String str) 创建。
    • 最终字符串获取:通过 toString() 方法获取最终的不可变 String 对象。
  • 常用方法:append(...)(多种重载,支持基本类型、对象等), insert(int offset, ...), delete(int start, int end), replace(int start, int end, String str), reverse(), setCharAt(int index, char ch), toString()。

4. StringBuffer:可变的字符序列 (线程安全)

  • 本质:StringBuffer 是 StringBuilder 的 线程安全版本。它也用于表示可变的字符序列。
  • 核心特性 - 可变性与线程安全:
    • 对象内部的字符序列可以被修改。
    • 所有对 StringBuffer 进行修改的公共方法(如 append, insert, delete, replace)都使用了 synchronized 关键字进行同步,保证了在 多线程环境 下的操作安全。
  • 特点:
    • 线程安全:可以在多线程环境下安全地修改同一个 StringBuffer 实例。
    • 性能开销:由于同步锁的存在,StringBuffer 的操作性能通常 低于 StringBuilder。在单线程环境中使用 StringBuffer 会带来不必要的性能损失。
    • 创建与获取:用法与 StringBuilder 类似,通过构造函数创建,通过 toString() 获取最终 String。
  • 历史:StringBuffer 是 JDK 1.0 就存在的类。StringBuilder 是在 JDK 1.5 引入的,作为 StringBuffer 的非线程安全替代品,旨在提高单线程下的性能。

总结对比表

特性charStringStringBuilderStringBuffer
类型基本数据类型类 (不可变)类 (可变)类 (可变)
可变性值可变不可变可变可变
线程安全不适用 (基本类型)是 (因不可变)否是 (同步方法)
性能 (修改)高低 (创建新对象)高 (单线程)中低 (因同步)
适用场景单个字符常量字符串、键值、方法参数传递等单线程下频繁修改字符串多线程下频繁修改字符串
创建方式字面量 'A'字面量 "abc" / new String(...)new StringBuilder()new StringBuffer()
最终字符串-自身toString()toString()

选用建议

  1. 单个字符:使用 char。
  2. 不常修改的字符串:优先使用 String(利用常量池、线程安全、HashCode 稳定等优点)。
  3. 单线程下频繁修改字符串:强烈推荐使用 StringBuilder(性能最优)。
  4. 多线程下频繁修改字符串:使用 StringBuffer(保证线程安全)。
  5. 简单拼接:少量固定字符串拼接可用 String 的 +(编译器可能会优化成 StringBuilder)。大量或循环拼接务必使用 StringBuilder/StringBuffer。

理解它们的设计意图和优缺点,有助于你在不同场景下做出最合适的选择,写出更高效、更健壮的 Java 代码。

目录

  1. 1. char:基本数据类型
  2. 2. String:不可变的字符序列
  3. 3. StringBuilder:可变的字符序列 (非线程安全)
  4. 4. StringBuffer:可变的字符序列 (线程安全)
  5. 总结对比表
  6. 选用建议

更多推荐文章

查看全部
  • Microsoft Edge WebView2 Runtime 部署与调试指南
  • Visual C++ 运行库安装故障诊断与修复指南
  • 数论基础:最大公约数与最小公倍数的原理及实现
  • OpenClaw 接入飞书机器人与 Kimi2.5 配置指南
  • C++从零实现Json-Rpc框架:项目介绍、技术选型与环境搭建
  • Kali Linux 2025.4 在 VMware 中鼠标无法显示问题解决方案
  • 理解 RAG 真实边界:Spring AI 三种架构落地实践
  • DeepSeek-R1-Distill-Llama-8B 模型安全与对抗攻击防护
  • Whisper OpenAI 开源语音识别工具安装与使用指南
  • 从零开始创建 cli-progress 自定义预设:打造独一无二进度条样式
  • 人像卡通化 AI 工具使用指南:基于 DCT-Net 模型的快速转换
  • C++ 内存管理进阶:从裸指针到智能指针的实战指南
  • C++11 新特性详解:Lambda、移动语义与可变参数模板
  • HarmonyOS6 RcButton 组件样式系统深度剖析
  • 2026 春晚国产人形机器人技术突破与核心架构解析
  • 医疗连续体机器人模块化控制界面设计与 Python 库应用
  • 网络安全从零入门到专家的系统学习路线指南
  • 二级 Python 考试真题及参考代码解析(基本操作篇)
  • Python 异步数据汇聚与并行计算框架设计与实现
  • 企业微信自建应用:Python 实现消息收发功能

相关免费在线工具

  • 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

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online