HashMap底层数据结构是数组,通过hash函数和key的hashCode方法获取key所在的数组索引,接着把key和value包裹成Map.Entry对象,最后根据索引把Map.Entry对象放在数组中完成put操作, put操作时如果出现hash冲突,使用列表和红黑树解决冲突,当列表长度等于8时会转换为红黑树,转换为红黑树时如果HashMap的长度小于64时会调用resize方法,不进行转换操作。
HashMap允许key值为null。当key值为null时,hash函数返回0,Map.Entry对象放在数组索引为0的位置。
从HashMap中获取数据时,根据key的hashCode方法获取初始hash值,再根据hash函数获取key的数组索引,然后获取到第一个匹配的Map.Entry对象,如果该对象的key等于提供key则返回value值,如果不等,则根据对象的类型,如果是树节点则从红黑树中查找key相等的value值,如果是列表则循环列表查找key相等的value值。
HashMap的初始容量和负载因子影响它的性能。负载因子决定HashMap的容量什么时候进行重新设置。就是说当插入新元素时,如果HashMap的负载达到设定的值时,就重新设置HashMap的容量为下一个2的n次方。默认初始容量是16,负载因子是0.75。
HashMap的遍历有三种方式
1. map.keySet()
2. map.values()
3. map.entrySet()
网友评论