面试题答案
一键面试for 循环遍历集合
- 遍历
Vec
这里使用let vec = vec![1, 2, 3]; for num in &vec { println!("{}", num); }
&vec
以只读借用的方式遍历Vec
,避免了所有权转移。如果需要修改Vec
中的元素,可以使用for num in &mut vec
。 - 遍历
HashMap
同样,以只读借用的方式遍历use std::collections::HashMap; let mut map = HashMap::new(); map.insert("a", 1); map.insert("b", 2); for (key, value) in &map { println!("Key: {}, Value: {}", key, value); }
HashMap
。
while 循环遍历集合
- 遍历
Vec
使用索引
这种方式通过索引访问let vec = vec![1, 2, 3]; let mut index = 0; while index < vec.len() { let num = &vec[index]; println!("{}", num); index += 1; }
Vec
元素,需注意不要越界。
性能优化技巧
- 避免不必要的内存分配
- 在循环体中尽量避免创建不必要的新对象。例如,如果在循环中需要拼接字符串,使用
String::with_capacity
预先分配足够的空间,而不是每次都让String
自动增长。
let mut result = String::with_capacity(100); let vec = vec!["a", "b", "c"]; for s in &vec { result.push_str(s); }
- 在循环体中尽量避免创建不必要的新对象。例如,如果在循环中需要拼接字符串,使用
- 借用检查相关优化
- 尽量使用不可变借用,如果确实需要可变借用,要注意借用的范围。例如,在
for
循环中如果只需要读取集合元素,使用不可变借用&
。如果需要可变借用,确保在同一时间内没有其他不可变借用。 - 对于复杂的数据结构,可以考虑使用
Cell
或RefCell
来实现内部可变性,从而在不违反借用规则的前提下实现灵活的读写操作。但需注意Cell
和RefCell
带来的运行时检查开销。例如,RefCell
用于在不可变借用的情况下实现内部可变:
这里通过use std::cell::RefCell; let cell = RefCell::new(1); let value = cell.borrow(); println!("{}", value);
RefCell::borrow
获取不可变引用,若要获取可变引用可以使用RefCell::borrow_mut
。 - 尽量使用不可变借用,如果确实需要可变借用,要注意借用的范围。例如,在