面试题答案
一键面试性能分析
+
运算符:使用+
运算符拼接字符串时,每次拼接都会创建一个新的String
实例,因为+
运算符会消耗左操作数。这意味着对于大量字符串片段的拼接,会产生大量的中间字符串对象,导致频繁的内存分配和复制,性能较差。format!
宏:format!
宏的工作方式类似printf
系列函数,它会在内部构建一个格式化字符串。虽然它可以很方便地格式化字符串,但对于简单的字符串拼接场景,它同样会创建中间数据结构,在处理大量字符串拼接时,由于多次内存分配和复制,性能也不理想。String::with_capacity
结合push_str
方法:String::with_capacity
方法预先分配足够的内存来容纳最终的字符串,然后通过push_str
方法逐一把字符串片段追加到这个字符串中,避免了频繁的内存重新分配,性能较好。
代码实现
fn main() {
let vec: Vec<String> = vec![
"Hello".to_string(),
", ".to_string(),
"world!".to_string(),
];
let mut result = String::with_capacity(vec.iter().map(|s| s.len()).sum());
for s in &vec {
result.push_str(s);
}
println!("{}", result);
}
这种方式先根据所有字符串片段的总长度预先分配足够的内存,然后逐个追加片段,减少了内存重新分配的开销,性能更优。