更新HashMapHashMap大小可变每个K同时只能对应一个V 当我们更新HashMap时,如果K已存在,对应一个V,这时更新的策略可能有:替换现在的V保留现有的V,忽略新的V基于现有的V来更新新的V,即合并现有的V和新的V 当要更新的K不存在时,直接添加一对新的K,V。替换现有的V 当我们像HashMap插入一对KV,然后插入同样的K,但是不同的V,那么原来的V就会被替换掉。例:usestd::collections::HashMap;fnmain(){letmutmapHashMap::new();map。insert(String::from(Yellow),666);println!({:?},map);map。insert(String::from(Yellow),888);println!({:?},map);}只有在K不对应任何值的情况下,才插入V 需要使用entry方法:检查指定的K是否对应一个V参数是K返回值是enumEntry:代表值是否存在 例:usestd::collections::HashMap;fnmain(){letmutmapHashMap::new();map。insert(String::from(Yellow),666);println!({:?},map);map。entry(String::from(Blue))。orinsert(888);println!({:?},map);map。entry(String::from(Yellow))。orinsert(888);println!({:?},map);} 这里用到了Entry的orinsert()方法,当K存在时,它返回的是该K对应的V的一个可变引用;K不存在时,会将方法的参数作为K的新值插入进去,返回的也是这个值的可变引用。 这里可以利用K存在时返回的可变引用值来更新V,即基于现有的值来更新V。例:usestd::collections::HashMap;统计一句话里各单词出现的次数fnmain(){lettexthelloworldwonderfulworld;letmutmapHashMap::new();splitwhitespace方法是按空格分割字符串forwordintext。splitwhitespace(){当单词第一次出现时插入0,返回的是0的可变引用当单词已经出现过时不插入值,只返回其当前出现次数的引用letcountmap。entry(word)。orinsert(0);号对当前次数的可变引用解引用,然后次数1,因为是可变引用,所以HashMap里的值会发生相应改变count1;}println!({:?},map);}哈希函数 默认情况下,HashMap使用加密功能强大的Hash函数,可以抵抗拒绝服务(DoS)攻击。然而这并不是可用的最快的算法,不过为了更高的安全性值得付出一些性能的代价。如果性能监测显示此哈希函数非常慢,以致于你无法接受,你可以指定一个不同的hasher来切换为其它函数。hasher是一个实现了BuildHashertrait的类型。你并不需要从头开始实现你自己的hasher;crates。io有其他人分享的实现了许多常用哈希算法的hasher的库。