1. 程式人生 > 其它 >策略模式(解決多重if判斷問題)

策略模式(解決多重if判斷問題)

/**
 * 一、Map的實現類的結構:
 * |----Map:雙列資料,儲存key-value對的資料   ---類似於高中的函式:y = f(x)
 * |----HashMap:作為Map的主要實現類;執行緒不安全的,效率高;儲存null的key和value
 * |----LinkedHashMap:保證在遍歷map元素時,可以按照新增的順序實現遍歷。
 * 原因:在原有的HashMap底層結構基礎上,添加了一對指標,指向前一個和後一個元素。
 * 對於頻繁的遍歷操作,此類執行效率高於HashMap。
 * |----TreeMap:保證按照新增的key-value對進行排序,實現排序遍歷。此時考慮key的自然排序或定製排序
 * 底層使用紅黑樹
 * |----Hashtable:作為古老的實現類;執行緒安全的,效率低;不能儲存null的key和value
 * |----Properties:常用來處理配置檔案。key和value都是String型別
 * <p>
 * <p>
 * HashMap的底層:陣列+連結串列  (jdk7及之前)
 * 陣列+連結串列+紅黑樹 (jdk 8)
 * <p>
 * <p>
 * 面試題:
 * 1. HashMap的底層實現原理?
 * 2. HashMap 和 Hashtable的異同?
 * 3. CurrentHashMap 與 Hashtable的異同?(暫時不講)
 * <p>
 * 二、Map結構的理解:
 * Map中的key:無序的、不可重複的,使用Set儲存所有的key  ---> key所在的類要重寫equals()和hashCode() (以HashMap為例)
 * Map中的value:無序的、可重複的,使用Collection儲存所有的value --->value所在的類要重寫equals()
 * 一個鍵值對:key-value構成了一個Entry物件。
 * Map中的entry:無序的、不可重複的,使用Set儲存所有的entry
 * <p>
 * 三、HashMap的底層實現原理?以jdk7為例說明:
 * HashMap map = new HashMap():
 * 在例項化以後,底層建立了長度是16的一維陣列Entry[] table。
 * ...可能已經執行過多次put...
 * map.put(key1,value1):
 * 首先,呼叫key1所在類的hashCode()計算key1雜湊值,此雜湊值經過某種演算法計算以後,得到在Entry陣列中的存放位置。
 * 如果此位置上的資料為空,此時的key1-value1新增成功。 ----情況1
 * 如果此位置上的資料不為空,(意味著此位置上存在一個或多個數據(以連結串列形式存在)),比較key1和已經存在的一個或多個數據
 * 的雜湊值:
 * 如果key1的雜湊值與已經存在的資料的雜湊值都不相同,此時key1-value1新增成功。----情況2
 * 如果key1的雜湊值和已經存在的某一個數據(key2-value2)的雜湊值相同,繼續比較:呼叫key1所在類的equals(key2)方法,比較:
 * 如果equals()返回false:此時key1-value1新增成功。----情況3
 * 如果equals()返回true:使用value1替換value2。
 * <p>
 * 補充:關於情況2和情況3:此時key1-value1和原來的資料以連結串列的方式儲存。
 * <p>
 * 在不斷的新增過程中,會涉及到擴容問題,當超出臨界值(且要存放的位置非空)時,擴容。預設的擴容方式:擴容為原來容量的2倍,並將原有的資料複製過來。
 * <p>
 * jdk8 相較於jdk7在底層實現方面的不同:
 * 1. new HashMap():底層沒有建立一個長度為16的陣列
 * 2. jdk 8底層的陣列是:Node[],而非Entry[]
 * 3. 首次呼叫put()方法時,底層建立長度為16的陣列
 * 4. jdk7底層結構只有:陣列+連結串列。jdk8中底層結構:陣列+連結串列+紅黑樹。
 * 4.1 形成連結串列時,七上八下(jdk7:新的元素指向舊的元素。jdk8:舊的元素指向新的元素)
 * 4.2 當陣列的某一個索引位置上的元素以連結串列形式存在的資料個數 > 8 且當前陣列的長度 > 64時,此時此索引位置上的所資料改為使用紅黑樹儲存。
 * <p>
 * DEFAULT_INITIAL_CAPACITY : HashMap的預設容量,16
 * DEFAULT_LOAD_FACTOR:HashMap的預設載入因子:0.75
 * threshold:擴容的臨界值,=容量*填充因子:16 * 0.75 => 12
 * TREEIFY_THRESHOLD:Bucket中連結串列長度大於該預設值,轉化為紅黑樹:8
 * MIN_TREEIFY_CAPACITY:桶中的Node被樹化時最小的hash表容量:64
 * <p>
 * 四、LinkedHashMap的底層實現原理(瞭解)
 * 原始碼中:
 * static class Entry<K,V> extends HashMap.Node<K,V> {
 * Entry<K,V> before, after;//能夠記錄新增的元素的先後順序
 * Entry(int hash, K key, V value, Node<K,V> next) {
 * super(hash, key, value, next);
 * }
 * }
 * <p>
 * <p>
 * 五、Map中定義的方法:
 * 新增、刪除、修改操作:
 * Object put(Object key,Object value):將指定key-value新增到(或修改)當前map物件中
 * void putAll(Map m):將m中的所有key-value對存放到當前map中
 * Object remove(Object key):移除指定key的key-value對,並返回value
 * void clear():清空當前map中的所有資料
 * 元素查詢的操作:
 * Object get(Object key):獲取指定key對應的value
 * boolean containsKey(Object key):是否包含指定的key
 * boolean containsValue(Object value):是否包含指定的value
 * int size():返回map中key-value對的個數
 * boolean isEmpty():判斷當前map是否為空
 * boolean equals(Object obj):判斷當前map和引數物件obj是否相等
 * 元檢視操作的方法:
 * Set keySet():返回所有key構成的Set集合
 * Collection values():返回所有value構成的Collection集合
 * Set entrySet():返回所有key-value對構成的Set集合
 * <p>
 * 總結:常用方法:
 * 新增:put(Object key,Object value)
 * 刪除:remove(Object key)
 * 修改:put(Object key,Object value)
 * 查詢:get(Object key)
 * 長度:size()
 * 遍歷:keySet() / values() / entrySet()
 *
 */