1、底层结构(数组、链表、红黑树)
(1)底层结构:
当桶的数量达到64,且链表的长度达到8时,链表结构将变为红黑树(jdk8)
(2)红黑树
解决链化(链表很长)问题,提高查找效率
(3)hashmap扩容原理
数组变长,链表变短(以空间换时间),提升查找效率
(4)特点
hashMap的初始容量(数组,即桶的个数)和加载因子会影响hashMap的性能,加载因子用于衡量哈希表的满的程度,因为桶太满的话查找的效率会降低,达到满的程度的时候就要扩容
加载因子默认为0.75,数组长度的初始值为16
2、map.put执行过程
(1)执行过程
(2)路由寻址:
路由寻址公式:(table.length-1)&node.hash
table.length:为2的n次方
:3、put方法的返回值
public class MyTest {
public static void main(String[] args) throws IOException {
HashMap<String,String> hashMap=new HashMap<>();
hashMap.put("1","2");
String value=hashMap.put("1","3");
System.out.println(value);
}
}
输出的结果是2不是3,执行的流程是3覆盖了2,但是返回的数值并不是新的值,而是以前的旧的value。
4、执行流程
(1)hashCode方法:
public class MyTest {
public static void main(String[] args) throws IOException {
System.out.println("zhai".hashCode());
}
}
3737558
这个值是不能直接作为哈希表的下标的,因为哈希表的长度不会那么长。hash%table.length才是要查找的哈希表的下标
(2)put操作: