Java常用Collections集合实现原理
一、HashMap集合
1、HashMap的结构:底层是一个数组,每个数组元素是一个链表,实现了Map接口(实现Map接口的集合允许有重复值),key和value都可以为空
2、方法实现原理:当HashMap.put时,先根据key计算Hash值,然后根据hash值找到这个元素在数组中的位置,如果数组中该位置已经有元素了,那么先遍历该位置的链表,如果链表中key相同,则将values进行替换,如果key不相同,则加入到该条链表的头部,最先加入的在尾部;如果数组中该位置没有元素,则将该元素放入到数组的该位置。当HashMap.get时,根据key计算hash值,然后根据hash值找到这个元素在数组中的位置,然后通过key的equals方法找到对应的元素即可。
3、当数组的大小是2的n次幂的时候,元素分布比较均匀,分析算法得出,根据hash值计算数组位置的算法
hash & (table.length - 1)
4、HashMap的resize原理:当HashMap中元素个数达到一定值Max时就需要扩充数组的大小,扩大一倍,此时需要重新计算每个元素的位置,因此扩充容量是一个非常消耗性能的过程,最好在初始化的时候能够预测Hashmap的大小并指定数组大小。这个Max值的计算方法:数组容量 * 加载因子;加载因子默认为0.75f,数组容量默认16,在初始化HashMap时两个参数可以进行设置;
5、Fail-Fast机制:HashMap操作是异步的,因此在不同线程中操作不安