HashMap是一種容器,可以用來存放鍵值對。在其他程式語言中,這種資料結構有時稱為關聯陣列或雜湊表。映射裡包含一組鍵,每個鍵都對應到特定的值。使用者只要傳入對應的鍵,就能取回存放的值,也可以插入、刪除鍵以及對應的值。
HashMap是泛型集合(就像標準函式庫裡大多數集合一樣),因此支援各種型別作為鍵,包括使用者自訂的結構體和元組。它的值可以是任何型別。
HashMap
使用HashMap::new()函式即可建立HashMap。下面的程式碼片段建立了一個HashMap,把隊名對應到分數。
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
HashMap中的值如果已知某個值存在於HashMap中,就適合使用索引運算子([])。舉例來說,要取得 Blue 隊的分數,可以用scores["Blue"]。不過,如果HashMap裡沒有對應的鍵值對,這個操作就會 panic。
除了索引運算子之外,還有另外兩種存取HashMap中值的方法。第一種是使用get成員函式:
if let Some(blue_score) = scores.get("Blue") {
println!("Blue scored: {blue_score} \n");
}
get會取得指定鍵所對應的值。如果提供的鍵不存在於HashMap中,它會回傳None;如果鍵存在,則回傳Some(value)。想進一步了解 Rust 的 Option,請參考 Option 概念。
另一種存取HashMap中值的方法,是使用entry方法。entry方法(或稱 entry API)會回傳HashMap中該鍵值對項目的參考。這個項目代表該鍵在雜湊中的狀態。如果鍵不存在,項目裡就沒有值(而且可以插入一個值)。
let mut vote_counter: HashMap<_, usize> = HashMap::new();
let votes = ["Blue", "Red", "Red", "Blue", "Red", "Blue", "Blue"];
for vote in votes {
let count = vote_counter.entry(vote).or_default();
*count += 1;
}
println!("{vote_counter:#?}");
這套 API 讓某些常見的存取模式變得非常方便,為此還有一個專門的概念(Entry API)。
HashMap相對快速,所有涉及單一鍵的操作都具有攤銷後的常數時間複雜度(O(1))。
HashMap是泛型資料結構,這表示它支援任意型別作為鍵和值,只有一個限制:型別若要作為鍵,就必須實作兩個 trait:Eq和Hash。值型別則沒有任何 trait 界限。