字符串String
表示有限且有序的字符序列;实现可使用带编码的字节或码元存储。
- 核心约束
- 字符顺序、长度单位和编码约定必须一致;二进制安全的字节串需显式保留长度。
- 适用问题
- 文本、协议字段、路径、数据库键,以及 Redis SDS 等字节串容器。
- 边界与取舍
- 长度可能指字节、码元或字符;带长度表示求长 ,零终止表示通常需扫描;不可默认所有字符串操作 。
常见操作#
n、m 为两段字符串的字节或码元数;一个 Unicode 字符不一定对应一个字节或码元。
| 操作 | 时间复杂度 | 条件与说明 |
|---|---|---|
| 按字节 / 定长码元读取 | 连续存储并有长度元数据;不能据此断言按 Unicode 字符下标也为 。 | |
| 按 UTF-8 码点位置定位 | 没有额外索引时最坏需要从头解码。 | |
| 相等 / 字典序比较 | 逐字节或码元比较;长度不同可提前拒绝相等判断。 | |
| 复制 / 遍历 | 复制完整内容;只创建切片视图可为 ,但可能保留原缓冲区。 | |
| 拼接成新连续字符串 | 需要复制两段内容;可增长缓冲区的追加应另作摊还分析。 | |
| 中间插入 / 删除 | 可变连续缓冲区最坏移动后缀并写入 m 个新码元;不可变字符串需生成新值。 |
时间与空间#
- 时间复杂度
- 按码元访问 ;扫描 / 复制
- 存储空间
口径取决于编码、可变性和是否共享底层存储;字素簇分割与规范化还需独立算法。
工程中的应用#
1 个案例 · 附源码Redis SDS 把字节长度与可用容量放进头部,追加按长度复制,正文允许包含零字节。
附源码片段 · 内存管理
基础原理参考资料
Go specification · String types字符串是不可变字节序列,长度与索引以字节为单位。
Go · Strings, bytes, runes and characters解释 UTF-8、字节索引和逐码点遍历的区别。