1. 程式人生 > 遊戲資訊 >騎馬與砍殺2 1.70版本推薦Mod第二期

騎馬與砍殺2 1.70版本推薦Mod第二期

***HashSet

***兩個問題

1.為什麼說存入的元素不能重複:

原理:

在Object類裡面有一個 native hashCode();方法可以返回物件的雜湊值,要儲存元素的時候呼叫add();方法,add方法會呼叫hashCode方法和equals方法判斷元素是否重複。

例子如下:

在這個例子裡面

Set集合在呼叫add方法的時候它會呼叫元素的HashCode()方法和equals()方法判斷元素是否重複

add方法呼叫s1的hashCode方法計算字串"abc"的雜湊值 96354

在集合裡面沒有96354就把這個雜湊值存入到陣列中且把s1字串掛到這個陣列對應的索引下面

add呼叫s2的hashCode方法計算雜湊值,發現數組存在了96354這個雜湊值

,就會發生雜湊衝突,然後呼叫equals方法s2.equals(s1)

返回ture ,兩個元素雜湊值相同且認定兩個元素相同,就不會把s2儲存到集合中

可以同時存入重地和通話完全是因為 在第二步中重地.equals("通話")不相等返回了false 從而認定元素不相同
發現hash衝突才會呼叫equals方法

程式碼如下:

這裡面要特別提醒:字串裡面 “重地”和“通話”的雜湊值是一樣的

2.雜湊表=陣列+紅黑樹(查詢速度極快)又是怎麼回事呢?

這是當如果表中同一雜湊值下掛的元素超過8個就會轉換成對應的紅黑樹(這樣查詢的速度就超級快)

***HashSet資料儲存過程

下圖為一個HashSet陣列的結構和三個元素,演示儲存的過程

首先存入字串“abc”;通過hashCode方法發現數組裡沒有96354這個雜湊值,將這個雜湊值存入陣列,然後將元素"abc"以連結串列的方式連線在對應的雜湊值陣列下



然後重複操作同樣存入元素"重地";

最後,存入元素“通話”,在呼叫方法hashCode返回雜湊值的時候,發現數組中已經存在117935這個雜湊值,要呼叫equals方法比較元素“重地”和“通話”,若返回false,存入“通話”,若返回ture,放棄儲存。很明顯,“通話”.equals("重地")返回false,因為雜湊值一樣所以“通話”以連結串列的形式掛在“重地”下面,形成連結串列

HashSet使用(1)

整體程式:新增刪除遍歷判斷



執行結果如下圖