charsequence 是定义字符序列行为规范的接口,仅包含 length()、charat() 和 subsequence() 三个核心方法;string 不可变且线程安全,stringbuilder 单线程高效可变,stringbuffer 则是线程安全的可变序列。

Java里 CharSequence 是一个接口,定义了“字符序列”这个概念的最小行为规范。String、StringBuilder 和 StringBuffer 都实现了它,说明三者在逻辑上都是“一串可按位置访问的字符”,但各自角色和能力完全不同。
CharSequence 是统一视图,不是具体实现
它只规定了三个核心方法:
-
length():返回字符个数 -
charAt(int index):按索引取单个字符 -
subSequence(int start, int end):截取子串(返回新的 CharSequence)
这些方法不涉及是否可变、是否线程安全、是否共享内存等细节。所以你可以把 String、StringBuilder、StringBuffer 都当作 CharSequence 传参,比如 public void print(CharSequence cs) 这样的方法,任何一种都能进。
String 是不可变的字符序列
- 内部用
byte[](JDK9+)或char[](旧版)存储,但对外完全封闭 - 所有修改操作(如
substring、concat)都返回新对象,原对象不变 - 因为不可变,天然线程安全,适合做 Map 键、常量、配置值
StringBuilder 和 StringBuffer 是可变的字符序列
- 它们都继承自
AbstractStringBuilder,复用扩容、append、insert 等底层逻辑 - 底层同样用
byte[]+coder(JDK9+)管理字符,支持 Latin-1 / UTF-16 自适应压缩 - 区别只在并发控制:
-
StringBuffer的关键方法(如append、reverse)都加了synchronized,适合多线程环境 -
StringBuilder去掉同步,性能更高,单线程场景首选
-
它们的关系不是并列,而是分层设计
-
CharSequence是契约层(告诉你“能干什么”) -
String、StringBuilder、StringBuffer是实现层(告诉你“怎么干、谁来用”) -
AbstractStringBuilder是共享骨架(减少重复代码),隐藏在继承链中,不对外暴露
简单说:CharSequence 是“协议”,String 是“只读文档”,StringBuilder 是“草稿本(一个人用)”,StringBuffer 是“多人协作的记事本(带锁)”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











