文章目录
Rust 中 String 和 str 的核心区别在于: String 是拥有所有权的、可增长的堆分配字符串;str 是借用的、不可变的字符串切片,通常以 &str 形式出现。
1.核心对比
| 维度 | String |
str (通常写作 &str) |
|---|---|---|
| 所有权 | 拥有字符串数据 | 借用(不拥有) |
| 存储位置 | 堆(heap) | 通常在静态区或借用自 String |
| 可变性 | 可变,可增长、修改 | 不可变 |
| 大小 | 固定大小(指针 + 长度 + 容量) | 动态大小(DST),必须通过引用使用 |
| 创建方式 | String::from("hello")、"hello".to_string() |
&s[..]、"hello"(字面量) |
| 能否修改 | ✅ 可以 push_str、push、insert 等 |
❌ 不可修改 |
| 典型用途 | 需要拥有和修改字符串时 | 只读借用、函数参数、字符串字面量 |
2.代码示例
rust
// String:拥有所有权,可修改
let mut s = String::from("hello");
s.push_str(" world"); // ✅ 可以修改
println!("{}", s); // 输出: hello world
// &str:借用,不可修改
let s2: &str = "hello"; // 字符串字面量,类型是 &'static str
// s2.push_str(" world"); // ❌ 编译错误
// 从 String 获取 &str
let s3 = String::from("hello");
let slice: &str = &s3[..]; // 借用整个字符串
let slice2: &str = &s3; // 也可以直接这样
3.内存布局
String:
┌─────────┬────────┬────────┐
│ ptr │ len │ cap │ (栈上,24 字节)
└────┬────┴────────┴────────┘
│
▼
┌─────────────────────────────┐
│ h e l l o │ (堆上,实际数据)
└─────────────────────────────┘
&str:
┌─────────┬────────┐
│ ptr │ len │ (栈上,16 字节)
└────┬────┴────────┘
│
▼
┌─────────────────────────────┐
│ h e l l o │ (可能在静态区、堆或栈上)
└─────────────────────────────┘
4.相互转换
| 转换 | 方式 |
|---|---|
String → &str |
&s 或 s.as_str() |
&str → String |
s.to_string() 或 String::from(s) |
5.一句话总结
String 是拥有所有权的堆分配字符串,可增长、可修改;str 是不可变的字符串切片,通常以 &str 借用形式使用,用于只读场景。函数参数优先用 &str,需要拥有和修改时用 String。