1.Hash Map特点?
线程不安全,无序,k-v都可以为null。
2.Hash Map底层?
JDK1.8之前是数组+链表。 JDK1.8之后数组+链表+红黑树
数组的特点是:查找快
链表的特点:增删快,解决hash碰撞
红黑树的特点:降低树的高低,提高效率。
生成红黑树 ---->>> 条件 当链表的长度达到阈值8且 数组长度大于64的时候 才会生成红黑树。
红黑树转链表 ,当Hash Map的元素变少的时候,链表的长度小于6的时候,会由红黑树转为链表
3.Hash Map初始容量,扩容?扩容为什么是2的n次幂?
初始容量:16
当元素个数 超过 数组大小*0.75(负载因子)的时候,就会进行扩容,两倍扩容。扩容是2的n次幂 ,因为防止hash碰撞,和使得元素在数组上分布均匀, 最大为2的30次幂
4.怎么计算HashMap的Hash值?怎么计算索引位置
对key的hashcode做hash操作,无符号右移16位然后做异或(^)运算 , hashcode(key) ^ (hashcode(key)>>>16) ===hash
索引计算--> hash&(length-1)
6.HashMap的遍历方式
HashMap<String, String> map = new HashMap(); map.put("1", "一"); map.put("2", "二"); map.put("4", "三"); // 1 方式 分别获取 k-v for(String o : map.keySet()){ //获取key System.out.println(o); } for (String v:map.values()){ //获取values System.out.println(v); } // 2 方式 entrySet遍历 Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } // 3 方式 不推荐 Set<String> strings = map.keySet(); for(String s:strings){ System.out.println(map.get(s)); }