MST

星途 面试题库

面试题:Rust字符串处理中的内存管理

假设你有一个包含大量字符串的 `Vec<String>`,现在要对这些字符串进行拼接操作,为了避免频繁的内存重新分配,你会使用什么方法?请写出具体代码示例并解释背后的内存管理原理。
16.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 使用 String::with_capacitypush_str 方法
    • 代码示例:
fn main() {
    let strings: Vec<String> = vec![
        "Hello".to_string(),
        ", ".to_string(),
        "world!".to_string(),
    ];
    let mut result = String::with_capacity(strings.iter().map(|s| s.len()).sum());
    for s in strings {
        result.push_str(&s);
    }
    println!("{}", result);
}
  • 内存管理原理
    • String::with_capacity 方法预先分配足够的内存空间来存储拼接后的字符串。这里通过计算 Vec<String> 中所有字符串的长度之和来确定所需的容量。这样在拼接过程中,就避免了每次追加字符串时都可能发生的内存重新分配。
    • push_str 方法将一个字符串切片追加到 String 中,它不会重新分配内存(前提是当前 String 的容量足够),只是将切片的内容复制到已分配的内存空间中。
  1. 使用 iter::collect 方法结合 Formatter
    • 代码示例:
fn main() {
    let strings: Vec<String> = vec![
        "Hello".to_string(),
        ", ".to_string(),
        "world!".to_string(),
    ];
    let result: String = strings.iter().collect();
    println!("{}", result);
}
  • 内存管理原理
    • collect 方法会根据 Iterator 生成的元素类型,确定合适的收集器。对于字符串拼接,它会预先计算所需的容量,然后一次性分配足够的内存来存储拼接后的结果。在收集过程中,各个字符串元素被复制到已分配好的内存中,同样避免了频繁的内存重新分配。