HashMap的實現(jdk1.8):有數組+鏈表+二叉樹(紅黑樹,說是平衡二叉樹又多一些條件,人沒看懂源碼) 默認的數組長度爲16(寫源碼的人都喜歡用移位),裝載因子(也就是數組的坑有75%有元素啦,網上有人翻譯爲負載因子,加載因子(我的以爲加載因子不形象))爲0.75,大於0.75時就得對數組擴容。鏈表的長度大於8,就將其轉二叉樹,低於6轉爲鏈表,若是數組的長度大於64,就講鏈表轉爲樹。屬於線程不安全,不能保證具體的位置數組
我的見解:寫這我的的人真是把數據結構的優勢用的淋漓精緻,能優化的都用上啦,比較適合大規模的數組查找,查找效率高。感受彷佛應該屬於犧牲空間來提升效率的。 與Hashtable的比較:1.線程安全 2.實現原理不同,用的是數組和鏈表,擴容方式不同 3在1.0實現的,沒有維護插入的順序 LinkedHashMap:用了雙向鏈表,維護了插入的順序。 public class HashMap_test {安全
public static void main(String[] args) { Map<String,String> map = new HashMap<>(); map.put("小米","5999"); map.put("華爲","6999"); map.put("VIVO","3434"); map.put("VIVO","34345"); //不判斷直接put,有相同的key直接覆蓋 map.put(null,"0000"); //判斷不存在是才put,不會覆蓋jdk.1.8才提供,通常方法涉及到函數表達式的,是1.8後的 map.putIfAbsent("蘋果","123"); String modifyKey="小米"; //這個會出現空指針異常,對給定的key的值進行操做 map.compute(modifyKey,(Key,oldValue)->oldValue+"2"); //給定的key,新的值,對新的值和舊的值進行一個操做,看我的須要 map.merge("小米","12",(oldvalue,newvalue)->oldvalue+newvalue); //1遍歷 使用Entry對象遍歷 Set<Map.Entry<String,String>> set=map.entrySet(); for(Map.Entry enter:set) System.out.println(enter.getKey()+" "+enter.getValue()); //2使用鍵遍歷 Set<String> set1=map.keySet(); for(String i:set1) System.out.println(i+":"+map.get(i)); //使用函數式遍歷 map.forEach((key,value)-> System.out.println(key+"::"+value)); }
}數據結構