面试题答案
一键面试String
与 &str
计算长度性能分析
String
类型:String
是一个可增长的、拥有所有权的字符串类型。它在堆上分配内存,除了存储字符串数据外,还包含一个长度字段(记录字符串的字节长度)、容量字段等额外信息。计算长度时,由于长度字段已经维护好了,所以获取长度的操作时间复杂度为O(1)
。 以下是 Rust 代码示例:
fn main() {
let s = String::from("hello");
let len = s.len();
println!("The length of '{}' is {}", s, len);
}
&str
类型切片:&str
是一个字符串切片,它是对字符串数据的一个引用,通常指向String
或者字符串字面量。它同样在编译时就已经知道了字符串的长度(存储在切片结构中),获取长度操作的时间复杂度也是O(1)
。 示例代码如下:
fn main() {
let s = "hello";
let len = s.len();
println!("The length of '{}' is {}", s, len);
}
性能差异及原因:在计算字符串长度的操作上,String
和 &str
的性能几乎没有差异。因为两者都维护了字符串的长度信息,获取长度时都是直接读取这个已有的长度值,时间复杂度均为 O(1)
。但从内存角度来看,&str
只是一个指向字符串数据的引用,占用的内存空间较小(通常为指针大小加上长度字段大小),而 String
除了字符串数据本身外,还需要额外存储长度、容量等信息,占用内存稍多。在处理大量字符串时,如果主要关注长度计算,两者性能相当;但如果对内存占用敏感,&str
会更有优势。