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)); }
}数据结构