目录
- 字符串的基本概念
- 字符串的底层存储结构
- 字符串在不同语言中的存储方式
- Java String的内部实现
- C/C++中的字符串存储
- 字符串存储的内存管理
- 总结
1️⃣ 字符串的基本概念
- 字符串是字符的有限序列,是程序设计中常用的数据类型之一。
- 字符串本质上是字符的集合,但为了方便存储和操作,有一定的底层结构和约定。
- 字符串一般是不可变的(immutable),如Java中的String。
2️⃣ 字符串的底层存储结构
- 字符数组:最常见的字符串底层存储形式,用一段连续的内存保存字符序列。
- 结尾标志:多数语言中用特定方式标记字符串结尾,方便遍历和操作。
- 编码方式:常见的有 ASCII、UTF-8、UTF-16等,影响每个字符的字节长度。
3️⃣ 字符串在不同语言中的存储方式
语言 | 底层存储 | 结尾标志 | 是否可变 |
---|---|---|---|
C | char数组 | ‘\0’(空字符) | 可变 |
C++ | std::string(封装char数组) | 内部管理 | 可变 |
Java | char数组(JDK8前),byte数组(JDK9+) | 长度字段,无结尾符 | 不可变 |
Python | Unicode字符数组(PyUnicodeObject) | 长度字段,无结尾符 | 不可变 |
4️⃣ Java String的内部实现
- JDK8及以前
- 使用
char[]
数组存储字符,字符为16位Unicode编码(UTF-16)。 - String对象包含
char[] value
和int count
等字段(部分版本有)。 - 不可变性通过不暴露修改方法实现。
- 使用
- JDK9及以后(Compact Strings)
- 使用
byte[]
存储,结合一个coder
字段表示编码(LATIN1或UTF16)。 - 这样做减少内存占用,对于只包含ASCII字符的字符串只用1字节存储。
- 使用
- 不可变性
- String对象一旦创建,内容不可更改。
- 修改操作(如拼接)产生新的String对象,旧对象共享不变。
- 字符串池
- JVM维护一个字符串常量池,避免重复创建相同的字符串对象,节省内存。
5️⃣ C/C++中的字符串存储
- C语言
- 字符串以
char
数组形式存储,以\0
字符标识结尾。 - 修改字符串直接操作数组内容,注意不要越界。
- 字符串以
- C++
std::string
封装了动态数组,自动管理内存和长度。- 提供丰富操作接口,内部存储类似于动态字符数组。
6️⃣ 字符串存储的内存管理
- 栈上分配:局部字符串变量通常存储在栈上。
- 堆上分配:动态创建的字符串对象通常分配在堆上。
- 常量区:编译时常量字符串存储在程序的只读数据区。
- 垃圾回收:如Java中字符串由GC管理。
- 内存优化:如Java的字符串池机制减少重复对象。
7️⃣ 总结
- 字符串底层本质是字符数组,不同语言实现细节有所差异。
- Java字符串采用不可变设计和字符串池机制提升安全性和性能。
- C语言字符串以
\0
结尾的char数组,操作时需注意边界。 - 了解字符串存储有助于深入理解字符串操作性能与安全。
发表回复