HashMap实现原理(JDK1.8)
如果突然被同行问起HashMap的实现原理,你会不会和我一样词穷。
下面是看完HashMap源码的一些感受和心得。
HashMap是实现了Map接口,而HashMap底层实际为链表+数组,可以看到源码中的Node<K,V>[] table,Node则是Map中的Entry集合的实现。transient修饰则是不参与Java中的序列化。
源码
1 | HashMap源码部分 |
看到HashMap是继承了一个抽象的Map类,实现了Map接口,Cloneable接口和Jdk序列化接口。
Cloneable接口
Cloneable接口其实只是一个空的接口,没有任何其他信息,通过实现了这个接口,程序就可以认为HashMap具备了clone,而实际其中的clone方法是存在了Object类中,而HashMap实现的clone方法,是因为继承了
AbstractMap。
AbstractMap
1
2
3
4
5
6
7
8
9
10
11
源码部分
public abstract class AbstractMap<K,V> implements Map<K,V> {
/**
* Sole constructor. (For invocation by subclass constructors, typically
* implicit.)
*/
protected AbstractMap() {
}
public abstract Set<Entry<K,V>> entrySet();
}
首先看到AbstractMap,它也是实现了一个Map接口,但是是被声明成了抽象的类,这里就涉及到了抽象的概念,抽象类不能被实例化,但是他的子类被实例化后可以引用他的方法,继承了抽象类,一定需要实现抽象方法,普通方法可以不实现。可以看到该类中abstract只出现了一次,而且是修饰了Set接口。
Map接口
Map接口都知道是键值对,一个键对应一个值,看到Map接口注释时,做着进行了说明:
1 | An object that maps keys to values. A map cannot contain duplicate keys; |
HashMap在初始化,在源码中的构造方法中,有一个默认的initialCapacity,HashMap根据初始容量来进行链表的大小初始化;
而且HashMap中没有出现synchronized来进行方法同步,所以HashMap和HashTable比起来运行速度更快。
且HashMap键可以为null,是因为HashMap在put的时候做了判断
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);