当前位置: 代码网 > it编程>编程语言>Java > Java字符处理之char、String、StringBuilder和StringBuffer详解

Java字符处理之char、String、StringBuilder和StringBuffer详解

2026年03月21日 Java 我要评论
好的,我们来深入解析 java 中的 char、string、stringbuilder 和 stringbuffer。理解它们之间的区别对于编写高效、正确的 java 代码至关重要。1.char:基

好的,我们来深入解析 java 中的 charstringstringbuilderstringbuffer。理解它们之间的区别对于编写高效、正确的 java 代码至关重要。

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 对象,无需同步。
      • 缓存与优化:java 使用“字符串常量池”(string pool)来缓存字符串字面量,减少重复创建的开销。例如:
        string s1 = "hello"; // 可能从池中获取
        string s2 = "hello"; // 指向池中同一个对象
        string s3 = new string("hello"); // 强制在堆上创建新对象
        
      • 安全性:常用于敏感信息(如密码)的传递,因为不可变,避免了内容被意外修改的风险。
      • hashcode 稳定性stringhashcode() 值在对象创建时计算一次并缓存,后续调用直接返回缓存值,效率高且稳定,非常适合作为哈希表的键(如 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) 等。

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:可变的字符序列 (线程安全)

  • 本质stringbufferstringbuilder线程安全版本。它也用于表示可变的字符序列。
  • 核心特性 - 可变性与线程安全
    • 对象内部的字符序列可以被修改。
    • 所有对 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 代码。

总结

到此这篇关于java字符处理之char、string、stringbuilder和stringbuffer的文章就介绍到这了,更多相关java字符处理char、string与stringbuilder内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com