目录
Map接口常用实现类
一.HashMap
①.HashMap 是 Map 接口使用频率最高的类
②.HashMap是以 Key-value 的方式来存储数据的
③.Key 是不可以重复的且只能存放一个null,val 可以重复可以存放多个null
④.添加相同的 Key,会覆盖原来的 Key-value
⑤.HashMap 是线程不安全的
HashMap的扩容机制
①.HashMap 底层为一个Node类型的数组 table ,默认为null
②.当添加元素时,先通过Key的hashcode计算出在table 的索引值,然后判断该索引处是否有元素,如果没有元素直接添加。如果有元素判断该元素和要添加的元素Key是否相等,相等则替换 value,不相等需要判断是树还是链表并作出相应处理。添加时发现容量到达临界值还需要扩容
③.第一次添加时.table 扩容到 16,临界值为12
④.之后扩容时,为table 容量的 2倍,临界值也应为 2 倍
⑤.如果一条链表的元素个数 超过 8,并且 table 大小 大于等于 64 ,链表会进行树化,table 大小 小于64会先扩大 table 的大小
以HashSet为例(hashSet底层为HashMap):
当一条链表的元素个数为8,添加第九个元素时
扩容前的数组:
进入putVal()方法 table 不等于null、n等于16、p等于tab[10]不为null、进入else,key不相同、p不是TreeNode的对象实例进入else,
进入for循环,经过循环后将新元素添加到了链表后面,此时binCount等于7,进入if语句