区别
- 所有权与可变性:
String
是拥有所有权的可变类型。它在堆上分配内存,并且可以通过修改其内部数据结构来改变内容。例如,可以使用 push_str
方法向 String
中追加字符串。
str
是一个切片类型,通常以 &str
的形式出现(字符串字面量就是 &str
类型)。它本身并不拥有数据,而是借用其他数据的一部分,不可变。&str
指向的内存是只读的。
- 内存管理:
String
负责分配和释放内存。当 String
离开作用域时,它所占用的堆内存会被自动释放。
&str
不负责内存管理,它只是一个指向现有字符串数据的指针,因此它的生命周期依赖于它所指向的数据的生命周期。
- 存储方式:
String
在堆上存储文本数据,同时在栈上存储一个指向堆内存的指针、长度和容量信息。
&str
在栈上存储一个指向字符串数据的指针和长度信息,它不包含容量信息,因为它不拥有数据,不能对数据进行扩展。
相互转换
- 从
&str
转换为 String
:
let s1: &str = "hello";
let s2: String = s1.to_string();
let s1: &str = "world";
let s2: String = String::from(s1);
- 从
String
转换为 &str
:
let s1: String = "rust".to_string();
let s2: &str = s1.as_str();