雜湊表就是一種以鍵-值(key-indexed) 儲存資料的結構,只要輸入待查詢的值即 key,即
可查詢到其對應的值。雜湊的思路很簡單,如果所有的鍵 hashcode 都是整數,那麼就可以使用乙個簡單陣列來實現:將鍵作為索引,值即為其對應的值,這樣就可以快速訪問任意鍵的值。簡單的計算方法 hashcode%陣列長度=【0,陣列的長度-1】它提供了一組鍵值的對映。其中儲存的每個資料物件都有乙個相應的鍵 key,鍵決定了值物件在 map 中的儲存位置。鍵應該是唯一的,不允許重複,每個 key 只能對映乙個 value。
定義 map 物件時需要指定 key 和 value 對應的型別,必須是複雜型別,不能使用 int。map 介面中有乙個內部介面為 entry:inte***ce entry封裝所儲存的 key-value 對資料
inte***ce
entry
結論:每個 entry 物件中封裝了乙個 key 和 value
另外 entry 介面中通過靜態方法提供了一組比較器的預設實現
用於規範其中存放資料的規則,map 中所存放的資料將給封裝為乙個乙個的 entry,乙個key/value 對對應乙個 entry 物件
object put(object key,object value):用來存放乙個鍵-值對 map 中 ,如果出現 key 值衝突則後蓋前。允許 key 值和 value 值為 null,但是 key 值為 null 只能有乙個,value 值為null 沒有個數限制
map的三種示圖
靜態內部類用於實現 entry,hahmap 中存放的 key/value 對就被封裝為 node 物件。其中 key 就是存放的鍵值,用於決定具體的存放位置;value 是具體存放的資料,hash 就是當前 node 物件的 hash 值,next 用於指向下乙個 node 節點(單向鍊錶)具體儲存資料的實現採用的是單向鏈
重要的閾值
static final int treeify_threshold = 8;//樹化閾值:即鍊錶轉成紅黑樹的閾值,在儲存資料時,當鍊表長度 > 該值時,則將鍊錶轉換成紅黑樹
static final int untreeify_threshold = 6;//桶的鍊錶還原閾值:即紅黑樹轉為鍊錶的閾值,當在擴容(resize())時(此時 hashmap 的資料儲存位置會重新計算),在重新計算儲存位置後,當原有的紅黑樹內數量 < 6 時,則將 紅黑樹轉換成鍊錶
構造器
獲取的值為獲取 2n《初始化容積<2(n+1)時返回 2(n+1)
,返回乙個大於等於初始化容積值的 2n值tablesizefor 用於計算容積值,不是設定多少就是多少。就是計算乙個 2**n 值》=設定的容積值.例如初始化容積引數值為 7 則實際建立容積值為 8注意:在構造器中並沒有建立任何用於儲存資料的集合—延遲載入,第一次儲存資料時才進行空間分配、
hashtable
hashtable:執行緒安全的,不允許 null 的鍵或值;是執行緒安全的,但是 hashtable 執行緒安全的策略實現代價卻太大了,簡單粗暴,get/put 所有相關操作都是 synchronized 的,這相當於給整個雜湊表加了一把大鎖。多執行緒訪問時候,只要有乙個執行緒訪問或操作該物件,那其他執行緒只能阻塞,相當於將所有的操作序列化,在競爭激烈的併發場景中效能就會非常差
Set介面的實現類
set是一種不包括重複元素的collection。它維持它自己的內部排序,所以隨機訪問沒有任何意義。與list一樣,它同樣執行null的存在但是僅有乙個。由於set介面的特殊性,所有傳入set集合中的元素都必須不同,同時要注意任何可變物件,如果在對集合中元素進行操作時,導致e1.equals e2 ...
實現介面的列舉類
由列舉類實現介面裡的方法,每個列舉值呼叫該方法由相同的行為方式。若要每個列舉值在呼叫該方法時由不同的行為方式,可讓每個列舉值分別實現該方法。public enum gender implements genderdesc female 女 上例中male,female建立列舉值是,不是直接建立gen...
C String類介面的實現
對c string庫部分介面的實現,通過介面間的復用,使個個介面緊密聯絡,更加簡潔。重要介面expand 通過檢測當前物件容量是否滿足要求,對物件進行擴容等操作。此次實現string全部使用的是深拷貝。include include include includeusing namespace st...