学习笔记043——HashMap源码学习1
文章目录
- 1、HashMap
- 2、Hashtable
- 3、TreeMap
- 4、HashMap 底层结构
- 4.1、什么是红黑树?
1、HashMap
HashMap key 是不能重复的,value 可以重复
底层结构 key-value 进行存储,key-value 存入到 Set 中,再将 Set 装载到 HashMap
package com.southwind;import java.util.*;public class HashMapTest {public static void main(String[] args) {HashMap hashMap = new HashMap();hashMap.put("h", "Hello");hashMap.put("w", "World");hashMap.put("j", "Java");System.out.println(hashMap);System.out.println("***********************************");//map有3种遍历方式//1、获取Set(包含kv)Set set = hashMap.entrySet();Iterator<Map.Entry> iterator = set.iterator();while (iterator.hasNext()) {Map.Entry next = iterator.next();System.out.println(next.getKey()+"------------"+next.getValue());}System.out.println("****************************************");//2、获取key所在的set集合Set keySet = hashMap.keySet();Iterator iterator1 = keySet.iterator();while (iterator1.hasNext()) {System.out.println(iterator1.next());}System.out.println("****************************************");//3、获取value所在的Collection集合Collection values = hashMap.values();Iterator iterator2 = values.iterator();while (iterator2.hasNext()) {System.out.println(iterator2.next());}}
}
2、Hashtable
用法和 HashMap 一致,区别在于 Hashtable 是较早推出的一个类,是线程安全的,效率低。
HashMap 是线程不安全的,效率高。
3、TreeMap
TreeMap 中存储有序的元素,存入的元素会自动进行排序,按照 key 值进行升序排列。
package com.southwind;import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;public class TreeMapTest {public static void main(String[] args) {TreeMap treeMap = new TreeMap();treeMap.put(3, "Java");treeMap.put(5, "JavaME");treeMap.put(1,"Hello");treeMap.put(6, "JavaEE");treeMap.put(2, "World");treeMap.put(4, "JavaSE");Set keySet = treeMap.keySet();Iterator iterator = keySet.iterator();while (iterator.hasNext()) {Object next = iterator.next();System.out.println(next + "---" + treeMap.get(next));}}
}
package com.southwind;import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;public class TreeMapTest {public static void main(String[] args) {TreeMap treeMap = new TreeMap();treeMap.put(new C(1), "Java");treeMap.put(new C(2), "JavaME");treeMap.put(new C(3),"Hello");treeMap.put(new C(4), "JavaEE");treeMap.put(new C(5), "World");treeMap.put(new C(6), "Big");treeMap.put(new C(7), "JavaSE");Set keySet = treeMap.keySet();Iterator iterator = keySet.iterator();while (iterator.hasNext()) {Object next = iterator.next();System.out.println(next + "---" + treeMap.get(next));}}
}class C implements Comparable{private int num;public C(int num) {this.num = num;}/*** A.compareTo(B)* 1 A>B* 0 A=B* -1 A<B* @param o* @return*/@Overridepublic int compareTo(Object o) {C c = (C) o;if(this.num > c.num) return -1;if(this.num == c.num) return 0;if(this.num < c.num) return 1;return 0;}@Overridepublic String toString() {return "C{" +"num=" + num +'}';}
}
4、HashMap 底层结构
HashMap 底层其实是一个数组,成为哈希桶,JDK 1.7 和 JDK 1.8 底层结构是不同的。
JDK 1.7:数组+链表
JDK 1.8:数组+链表+红黑树
4.1、什么是红黑树?
红黑树是一个平衡二叉树
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
红黑树
1、结点是红色或者黑色
2、根节点是黑色的
3、每个叶子节点都是空节点
4、每个红色节点的两个子节点都是黑色的
5、从任一节点到它的每个叶子节点的所有路径都包含相同数目的黑色节点
哈希冲突:key 所映射的 hash 一样
HashMap 源码
从构造器入手来看
并没有创建数组,而是给加载因子赋值 = 0.75,加载因子是用来完成数组扩容的。
只有在添加数据的时候才会创建数组,HashMap 是懒加载的形式。
DEFAULT_INITIAL_CAPACITY 就是数组的初始化长度,16,哈希桶默认的长度为 16
数组长度为 16,存入多少个元素的时候,需要进行数组扩容呢?
16 * 0.75 = 12,每次扩容是给数组长度乘以 2,16 --> 32