Java中的char、String、StringBuilder与StringBuffer 深度详解
Java 中的 char、String、StringBuilder 与 StringBuffer 深度详解从底层原理到最佳实践2026 最新版这四个类型是 Java 字符串处理的基石几乎每天都会用到。掌握它们能让你写出更高效、更安全的代码。1. char —— 字符的基本单位charc1A;// 正确charc2中;// 正确Unicodecharc3\u4E2D;// 十六进制 Unicode 表示“中”charc465;// 正确ASCII 值 65 对应 A核心特性底层类型16 位无符号整数2 字节范围 0 ~ 65535 ~\uFFFF。编码Java 使用UTF-16编码不是 UTF-8。注意事项Java 9 之后String内部可能使用byte[]Latin-1 优化但char始终是 2 字节。代理对Surrogate Pair一个 emoji如 可能需要两个char高低代理对。Stringemoji;System.out.println(emoji.length());// 输出 2不是 1System.out.println(emoji.codePointCount(0,emoji.length()));// 输出 1最佳实践日常很少单独使用char更多通过String.codePointAt()处理 Unicode 字符。2. String —— 不可变字符串Immutable2.1 核心特性不可变一旦创建内容无法修改。底层存储JDK 9private final byte[] value;private final byte coder;LATIN10或UTF161字符串常量池String Pool相同字面量只在堆中保存一份节省内存。线程安全天然线程安全不可变。2.2 常见“陷阱”与原理Strings1hello;Strings2hello;Strings3newString(hello);System.out.println(s1s2);// true 常量池System.out.println(s1s3);// false new 在堆中新建对象字符串拼接的性能陷阱Stringresult;for(inti0;i10000;i){resulta;// 每次都创建新 String 对象O(n²) 时间复杂度}编译器在编译期会把常量拼接优化为StringBuilder但循环中的不会优化。2.3 常用高效方法JDK 11 推荐String.isBlank()、String.lines()、String.strip()String.repeat(int count)String.formatted(Object... args)替代String.format3. StringBuilder —— 单线程高性能可变字符串核心特性可变字符序列底层是char[]JDK 9 是byte[]。非线程安全速度最快。初始容量 16超过时自动扩容newCapacity oldCapacity * 2 2。3.1 推荐使用场景循环拼接字符串单线程构建复杂字符串JSON、手写 SQL、日志等3.2 最佳实践写法// 推荐预估容量避免多次扩容StringBuildersbnewStringBuilder(128);for(inti0;i10000;i){sb.append(a);}Stringresultsb.toString();// 最后只调用一次 toString()链式调用StringjsonnewStringBuilder().append({\name\:\).append(name).append(\,\age\:).append(age).append(}).toString();4. StringBuffer —— 线程安全的可变字符串核心特性与StringBuilder几乎完全一样。所有公开方法都加了synchronized。性能比StringBuilder慢 20%~50%锁开销。4.1 什么时候必须用 StringBuffer多线程环境下共享同一个可变字符串对象。遗留代码老项目中大量使用。现代推荐单线程 →StringBuilder多线程 →StringBuffer或更好的选择ConcurrentLinkedQueue、CopyOnWriteArrayListString.join()等。5. 三者性能对比实测结论 2026操作StringStringBuilderStringBuffer循环 10 万次拼接最慢O(n²))最快较慢单线程简单拼接慢最快慢多线程共享修改安全不可变不安全安全内存占用较高新对象最低较低基准测试建议使用 JMHJava Microbenchmark Harness验证具体场景。6. 最佳实践总结生产级建议字符串常量→ 直接用双引号hello单线程大量拼接→ 优先StringBuilder并预估初始容量多线程共享可变字符串→StringBuffer多线程不共享→ 每个线程用自己的StringBuilder最终结果需要 String→ 只在最后调用一次toString()JDK 8推荐使用StringJoiner更优雅StringresultStream.of(a,b,c).collect(Collectors.joining(,));大字符串处理→ 考虑StringBuilderappend(char[])或零拷贝技术避免循环中使用String new String(literal)多此一举不必要的toString()调用7. 面试高频问题精讲String 为什么不可变安全性类加载、String Pool、线程安全、作为 HashMap Key 的可靠性。StringBuilder 和 StringBuffer 的区别线程安全 vs 性能底层扩容机制完全相同。new String(“abc”) 创建了几个对象编译期 1 个常量池 运行期 1 个堆中共 2 个。substring() 方法的性能JDK 7 vs JDK 8JDK 7 之前返回原数组子视图内存泄漏风险JDK 7 复制新数组安全但耗内存。掌握以上内容你对 Java 字符串的理解就达到了中高级水平。需要我继续补充以下任意内容随时说String源码深度解析value、hash、coderStringBuilder扩容源码 位运算详解JMH 性能测试完整代码Spring Boot 中字符串拼接的最佳实践与 Kotlin、Scala 字符串处理的对比祝你写出又快又安全的 Java 字符串代码
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2413573.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!