HashMap
jdk7中的实现原理:
HashMap map = new HashMap();
1.假设创建hashMap(key1,value1),初始化时会创建一个默认长度为16的Entry[]数组
map.put(key1,value1)
2.向map中执行put操作时,首先会调用key1所在类的hashCode()方法计算出hash值,此hash值经过某种算法计算出key1在Entry[]数组中的存储位置,
如果此位置上为空,则直接存放value1;
如果此位置上不为空,则先比较key的哈希值,若key1哈希值与所有存在的哈希值都不同,则key1-value1添加成功,若哈希值与存在的某一个数据的哈希值相同,则调用equals方法比较(若返回false,则添加成功,若返回true,则替换掉比较的数据)。
3.扩容:当超出临界值且存放的位置非空时,容量扩充为原来的2倍,并将原来的数据复制过来
jdk8与jdk7不同的实现原理
1.实例化时,并没有创建Entry[]数组,而是在首次put值时创建Node[]数组
2.jdk7中底层结构只有数组+链表,而jdk8中底层结构时数组+链表+红黑树。
jdk8中当某一个位置上的链表形式的数据个数大于8且数组长度大于64时,此时这个位置上的链表形式转化为红黑树形式。
LinkedHashMap
实现原理:创建Entry[]数组+双重链表,能够记录添加的元素的先后顺序