# Java源码分析之HashMap-jdk1.7 **Repository Path**: fpfgitmy_admin/java-source-code-hashmap-1.7 ## Basic Information - **Project Name**: Java源码分析之HashMap-jdk1.7 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-28 - **Last Updated**: 2021-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### HashMap在jdk7中的底层实现原理 + 数组+链表 + HashMap()的实例化 ``` // 在实例化以后,底层创建了长度是16的一维数组Entry[] table HashMap hashMap = new HashMap<>(); ``` + HashMap的put和扩容 ``` // 首先调用key1所在类的hashCode()计算key1的哈希值,次哈希值经过某种算法计算后,得到在Entry数组中的存放位置 // 如果此位置上数据为空,此时的key1-value1添加成功 ---情况1 // 如果此位置上的数据不为空(意味着此位置上存在一个或多个数据(以链表形式存在)),比较key1和已经存在的一个或多个哈希值: // 如果key1的哈希值与已经存在的数据的哈希值都不相同,此时key1-value1添加成功 --- 情况2 // 如果key1的哈希值和已经存在的某一个(key2-value2)数据的哈希值相同,继续比较:调用key1所在类的equals()方法 // 吐过equals()返回false:此时key1-value1添加成功 --- 情况3 // 如果equals()返回true:使用value1替换相同value2值 // 补充:关于情况2和情况3:此时key1-value1和原来的数据以链表的方式存储 // 在不断添加过程中,会涉及到扩容问题,默认的扩容方式:扩容为原来容量的2倍,并将原有的数据复制过来 hashMap.put("key1","value1"); ``` #### HashMap在jdk8中的底层实现原理 + jdk8相较于jdk7底层实现方式不同 1. new HashMap():底层没有创建一个长度为16的数组 2. jdk8底层的数组是:Node[],而非Entry[] 3. 首次调用put()方法时,底层创建长度为16的数组 4. jdk7底层结构只有:数组+链表,jdk8中底层结构:数组+链表+红黑树 1. 当数组的某一个索引位置上的元素以链表形式存在的数据个数>8且当前数组的长度>64时,此时索引上的所有数据改为红黑树存储 #### HashMap面试题 1. 谈谈你对HashMap中put/get方法的认识? 2. 谈谈HashMap的扩容机制?默认值是多少? 3. 什么是负载因子(或填充比)? 4. 什么事吞吐临界值(或阈值、threshold)?