目录
-----第一章
----------为什么要深入学习HashMap?
----------HashMap与HashTable的区别是什么?
----------自定义HashMap中的Entry<K,V>类
----------使用ArrayList集合实现简易版HashMap
----------使用LinkedList链表实现简易版HashMap
----------HashCode和equals的区别
----------如何解决HashCode碰撞问题
----------纯手写HashMap中的put方法
----------纯手写HashMap中的get方法
-----第二章
----------HashSet基本API使用介绍
----------HashSet底层原理分析
----------HashMap底层基本实现原理分析
----------HashMap构造函数实现原理分析
----------HashMap第一次数组扩容原理
----------HashMapPut方法源码分析
-----第三章
----------HashMapJDK1.7面试题总结
----------HashMapJDK1.7扩容死循环原理分析
----------HashMapJDK1.8什么要使用红黑树
----------数据结构中时间复杂度对比
----------二叉搜索树基本实现原理与思想
----------手写二叉搜索树添加功能
----------手写二叉搜索树查询功能
----------总结二叉搜索查询存在哪些问题
-----第四章
----------二叉搜索树存在那些问题
----------红黑树的数据结构基本介绍
----------红黑树基本的特征介绍
----------红黑树变换颜色的规则要求
----------红黑树左右旋转基本的规则
----------手写红黑树环境代码实现
----------手写红黑树实现二叉树
----------红黑树规则破坏如何实现修复
-----第五章
----------手写红黑树左旋转代码演示
----------红黑树基本变色旋转规则回顾
----------纯手写一步一步写左旋转
----------红黑树基本左旋变颜色01
----------红黑树基本左旋变颜色02
----------红黑树基本左旋变颜色03
----------红黑树基本左旋变颜色04
----------红黑树查询左大值与最小值
-----第六章
----------HashMap8基本实现原理分析
----------HashMap8优化了7那些bug
----------HashMap8的Put方法实现原理01
----------HashMap8的Put方法实现原理02
----------HashMap8的Put方法扩容实现
----------HashMap8的Put方法源码分析总结
HashMap在不同JDK版本中的数据结构
JDK1.7 | JDK1.8 | |
---|---|---|
结构 | 数组+链表 | 数组+链表+红黑树 |
数组+链表:
数组+链表+红黑树:
自定义HashMap中的Entry<K,V>类
在定义Entry对象之前,我们首先要考虑Entry对象有哪些特点:
1、数据在HashMap中是以键值对的形式存在的,Entry对象是HashMap中用来存放数据的基本元素
2、使用者不需要去操作Entry对象,Entry对象对使用者是透明的
3、Entry类不依赖于其它类
从这些特点中我们可以知道
1、Entry类存在key,value属性
2、使用内部类
3、使用静态内部类
第一步:根据分析,首先定义一个Map接口,定义一些基本方法
public interface MytMap<K, V> {
V put(K key, V value);
V get(K key);
interface Entry<K, V> {
K getKey();
V getValue();
}
}
第二步:定义HashMap类,实现Map接口
public class MyHashMap<K, V> implements MyMap<K, V> {
public V put(K key, V value) {
return null;
}
public V get(K key) {
return null;
}
static class Entry<K, V> implements MyMap.Entry<K, V> {
private K k;
private V v;
public Entry(K k, V v) {
this.k = k;
this.v = v;
}
public K getKey() {
return this.k;
}
public V getValue() {
return this.v;
}
}
}