Rust - HashMap
HashMap
1、键值对的形式存储数据,一个键(key)对应一个值(value)
2、通过Hash函数:决定如何在内存中存放K和V
- 适用场景:通过K(任何类型)来寻找数据,而不是索引
1、创建HashMap
1、创建空HashMap:new() 函数
2、添加数据:insert() 方法
use std::collections::HashMap;
fn main() {
// 创建hashmap
// 如果只创建,不插入数据的话,会报错,要指定数据类型才不会报错
//let mut scores:HashMap<String, i32> = HashMap::new();
let mut scores = HashMap::new();
// 插入数据
scores.insert(String::from("年龄"), 10);
}
2、HashMap注意事项
1、HashMap用的比较少,不在Prelude中
2、标准库对其支持比较少,没有内置的宏来创建HashMap
3、其数据是存放在heap上
4、是同构的,一个HashMap中
- 所有的k的类型必须一致
- 所有的v的类型必须一致
3、另一种创建HashMap的方式:collect方法
1、在元素类型为Tuple(元组)的Vector上使用collect方法,可以组建一个HashMaps
- 要求元组有两个值:一个作为K,一个作为V
- collect方法可以把数据整合成多种集合类型,包括HashMap
- 返回值需要显式的指明类型
4、HashMap的所有权
1、对于实现了Copy trait的类型(如i32),值都会被复制到HashMap中
2、对于拥有所有权的值(如string),值会被移动,所有权会被转移到HashMap中
let hello_hash = String::from("hello");
let world_hash = String::from("world");
let mut all_hash = HashMap::new();
all_hash.insert(hello_hash, world_hash);
// println!("{},{}",hello_hash,world_hash); 报错
5、访问HashMap的值
1、通过get()方法
// 访问HashMap的值
let get_hello = String::from("hello");
let jg = all_hash.get(&get_hello);
match jg {
Some(jg) => println!("{}",jg),
None => println!("空")
}
6、遍历HashMap
1、通过for循环
// 遍历HashMap
for (k,v) in &all_hash{
println!("{}:{}",k,v);
}
7、更新HashMap
1、HashMap的大小可变
2、每个K同时只能对应一个V
3、更新HashMap中的数据
- K 存在,需要对V进行修改
- 替换现有的V
- 保留现有的v,忽略新的v
- 合并现有的v和新的v
- K不存在
- 添加新的k,v
情况一、替换现有的v
- 如果插入的k相同,v不同,那么后面的v的值会覆盖前面的值
情况二、只有K不对应任何值的情况下,才插入v
- 使用entry方法,判断k中是否有值,没有就使用or_insert方法插入
- 两个方法返回的都是引用
// 更新hashmap
// 情况一
all_hash.insert(String::from("name"),String::from("小明"));
all_hash.insert(String::from("name"),String::from("小宏"));
println!("{:?}",all_hash);
// 情况二
// 插入一个新k,如果k中没有值,就添加一个值
all_hash.entry(String::from("old")).or_insert(String::from("30"));
推荐阅读: