HashMap
采用key/value存储结构,每个key对应唯一的value,key和value都允许null值 非线程安全 不保证元素存储的顺序,其存储结构JDK8版本采用了数组+链表+红黑树的复杂结构,添加元素时
根据hash值计算出元素在数组中的位置,若该位置没有元素则直接把元素放置在此处否则把元素以链表的形式放在链表的尾部
当一个链表的个数达到一定的数量(且数组的长度达到一定的长度)后,则把链表转化为红黑树从而提高效率:数组的查询效率O(1) 链表查询效率O(n) 红黑树查询效率O(log n)
继承关系如下:
###JDK8
主要属性
1 | public class HashMap<K,V> extends AbstractMap<K,V> |
内部类
1 | //链表节点 |
构造器
1 | public HashMap(int initialCapacity, float loadFactor) { |
Hash函数
1 | static final int hash(Object key) { |
添加元素
1 | public V put(K key, V value) { |
树化
1 | final void treeifyBin(Node<K,V>[] tab, int hash) { |
扩容
1 | final Node<K,V>[] resize() { |
获取元素
1 | public V get(Object key) { |
删除元素
1 | public V remove(Object key) { |