字符串String

表示有限且有序的字符序列;实现可使用带编码的字节或码元存储。

核心约束
字符顺序、长度单位和编码约定必须一致;二进制安全的字节串需显式保留长度。
适用问题
文本、协议字段、路径、数据库键,以及 Redis SDS 等字节串容器。
边界与取舍
长度可能指字节、码元或字符;带长度表示求长 O(1)O(1),零终止表示通常需扫描;不可默认所有字符串操作 O(1)O(1)。

常见操作#

n、m 为两段字符串的字节或码元数;一个 Unicode 字符不一定对应一个字节或码元。

操作时间复杂度条件与说明
按字节 / 定长码元读取O(1)O(1)连续存储并有长度元数据;不能据此断言按 Unicode 字符下标也为 O(1)O(1)。
按 UTF-8 码点位置定位O(n)O(n)没有额外索引时最坏需要从头解码。
相等 / 字典序比较O(min⁡(n,m))O(\min(n,m))逐字节或码元比较;长度不同可提前拒绝相等判断。
复制 / 遍历O(n)O(n)复制完整内容;只创建切片视图可为 O(1)O(1),但可能保留原缓冲区。
拼接成新连续字符串O(n+m)O(n+m)需要复制两段内容;可增长缓冲区的追加应另作摊还分析。
中间插入 / 删除O(n+m)O(n+m)可变连续缓冲区最坏移动后缀并写入 m 个新码元;不可变字符串需生成新值。

时间与空间#

时间复杂度
按码元访问 O(1)O(1);扫描 / 复制 O(n)O(n)
存储空间
O(n)O(n)

口径取决于编码、可变性和是否共享底层存储;字素簇分割与规范化还需独立算法。

工程中的应用#

1 个案例 · 附源码
基础原理参考资料

Go specification · String types字符串是不可变字节序列,长度与索引以字节为单位。

Go · Strings, bytes, runes and characters解释 UTF-8、字节索引和逐码点遍历的区别。

1 个概念