Map接口
格式:Map<k,v>
HashMap
格式:
HashMap<String,Integer> map = new HashMap<>();
底层实现是数组加链表
HashMap是一个散列表,它存储的内容是键值对(key-value)映射
特点
+无序
+无角标
+k值相同时会被后面的替换掉k所对应的v值
放值
map.put(String,String)
纵切式遍历
Set<String> keys = map.keySet();
for(String k : keys) {
System.out.println(k + " : " + map.get(k));
}
横切式遍历
Set<Entry<String, Integer>> entrySets = map.entrySet();
for(Entry<String,Integer> entry : entrySets) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
Entry接口
这个接口里面只有一对k&v
扩容
如果没有设置大小时候默认为16;
当容量达到容量大小的0.75倍时,开始扩容;
每次扩容自身的1倍;
扩容后容量 = 扩容前容量 * 2
总结
HashMap底层是数组+链表+树形结构(红黑树);
放值方法
1、用key的哈希值,高位取反,低位亦或,然后用得到的值对16取模从而算出放在那里;
2、如果要放值的地方为null,则直接放在那里;
3、如果要放值的地方为 !null,则放在已有值的next位形成链表;
4、如果链表长度超过8位,且容量大小不足64,则扩容;
5、若容量大小扩容为64,若此时链表长度还超过8位,则转化为树形结构;
扩容过程
1、不赋初值默认为16;
2、当长度达到0.75f的时候开始扩容,每次呈两倍扩容;
eg:扩容后容量大小 = 扩容前容量大小 * 2;
3、有一条链长度大于8位以后变为树形结构;
树形结构
1、在HashMap底层中,采取的树形结构为红黑树;
2、红黑树:顾名思义树形结构有红、黑两种颜色,根节点和尾节点都为黑, 且每条链上的黑色节点数量都相同;
3、红黑树是弱平衡查找树(最长的链长度不超过最短的链的2倍);