该方法首先会判断hashmap的数组是否被初始化,如果没有初始化,则首先进行初始化操作。其次判断该key是不是null,如果为null则在数组下标为0的地方进行插入操作,如果不为null,则进行下一步判断。 如果数组该位置为null,则新建一个node,进行插入,如果不为null,则采用头插法插入元素,如果链表长度大于8,并且数组长度大于64,则将链表转换为红黑树。如果小于64则直接扩容
这是因为hashmap缓存了key的hash值,每次移动元素只需要新的高位与1相与就行。
判断该元素时候为空,如果为空直接返回,如果不为空则返回value
红黑树相比avl树,在检索的时候效率其实差不多,都是通过平衡来二分查找。但对于插入删除等操作效率提高很多。红黑树不像avl树一样追求绝对的平衡,他允许局部很少的不完全平衡,这样对于效率影响不大,但省去了很多没有必要的调平衡操作,avl树调平衡有时候代价较大,所以效率不如红黑树。
Java 中的 HashMap 底层原理使用数组和链表/红黑树实现,而不使用 B 树,原因有以下几点:
综上所述,HashMap 选择红黑树而不是 B 树 作为其底层数据结构,主要是出于对效率和实现的考虑。
红黑树特征: