目录

  1. 字符串的基本概念
  2. 字符串的底层存储结构
  3. 字符串在不同语言中的存储方式
  4. Java String的内部实现
  5. C/C++中的字符串存储
  6. 字符串存储的内存管理
  7. 总结

1️⃣ 字符串的基本概念

  • 字符串是字符的有限序列,是程序设计中常用的数据类型之一。
  • 字符串本质上是字符的集合,但为了方便存储和操作,有一定的底层结构和约定。
  • 字符串一般是不可变的(immutable),如Java中的String。

2️⃣ 字符串的底层存储结构

  • 字符数组:最常见的字符串底层存储形式,用一段连续的内存保存字符序列。
  • 结尾标志:多数语言中用特定方式标记字符串结尾,方便遍历和操作。
  • 编码方式:常见的有 ASCII、UTF-8、UTF-16等,影响每个字符的字节长度。

3️⃣ 字符串在不同语言中的存储方式

语言底层存储结尾标志是否可变
Cchar数组‘\0’(空字符)可变
C++std::string(封装char数组)内部管理可变
Javachar数组(JDK8前),byte数组(JDK9+)长度字段,无结尾符不可变
PythonUnicode字符数组(PyUnicodeObject)长度字段,无结尾符不可变

4️⃣ Java String的内部实现

  • JDK8及以前
    • 使用char[]数组存储字符,字符为16位Unicode编码(UTF-16)。
    • String对象包含char[] valueint 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数组,操作时需注意边界。
  • 了解字符串存储有助于深入理解字符串操作性能与安全。