HashMap详解
hashmap的数据结构 Hashmap的底层数据结构是由数组+链表组成的,是线程不安全,允许key和value为null。底层结构数组叫哈希桶,而桶内则是链表,链表中的节点Node存放着实际的元素。 JDK 1.8 以前 HashMap 的实现是 数组+链表,即使哈希函数取得再好,也很难达到元素百分百均匀分布。 当 HashMap 中有大量的元素都存放到同一个桶中时,这个桶下有一条长长的链表,这个时候 HashMap 就相当于一个单链表,假如单链表有 n 个元素,遍历的时间复杂度就是 O(n),完全失去了它的优势。 针对这种情况,JDK 1.8 中引入了 红黑树(查找时间复杂度为 O(logn))来优化这个问题。 新增的操作:桶的树形化 treeifyBin() 新增的操作: 红黑树中添加元素 putTreeVal() 新增的操作: 红黑树中查找元素 getTreeNode() 新增的操作: 树形结构修剪 split() JDK 1.8 以后哈希表的 添加、删除、查找、扩容方法都增加了一种 节点为 TreeNode 的情况: 添加时,当桶中链表个数超过 8 时会转换成红黑树; 删除、扩容时,如果桶中结构为红黑树,并且树中元素个数太少的话,会进行修剪或者直接还原成链表结构; 查找时即使哈希函数不优,大量元素集中在一个桶中,由于有红黑树结构,性能也不会差。 (图片来自:http:/