【java】【05】HashMap

1.由数组、链表、红黑树组成

2.数组的查询消息和写效率非常高,因为地址是连续的而且类型固定,只需要简单计算就可以找到元素内存地址
但是想要扩容需要重新分配空间建新的数组

3.链表的插入删除效率非常高,只需要修改指针指向就可以
但是查询效率比较低,需要一个一个的遍历比较

3.当链表长度到8的时候,会把链表变成红黑树

二叉排序树:左子树的值小于根节点,右子树的值大于根节点
平衡二叉树:左子树的深度和右子树的深度差不大于1的绝对值,可以通过左旋、右旋、先左旋再右旋、先右旋再左旋的方式维持平衡
红黑树:左子树和右子树的深度不能成二倍关系,比平衡二叉树要求低点,不用老是维护平衡

4.HashMap
1.new一个Entry元素的数组,数组的长度必须是2的n次方,
2.因为根据key计算数组index的时候用到了与运算提升效率,和2的n次方-1做与运算,2的n次方减一有个特点最后位都是1,这样可以保证与的结果最大值时2的n次方-1
3.jdk1.8hashmap重现分配空间时使用和2的n次方与来计算index,和2的n次方与只有两种结果,一个是0,一个是2的n次方
4.当链表的长度是8的时候变成红黑树为什么,因为长度为8的链表平均查询是2分值n就是4,黑红树的平均比较是log(n)就是3,当长度是6的时候还需要变成链表
5.jdk1.7多线程做HashMap扩容时,并发大时会导致链表循环指向的问题,jdk1.8修改了这个问题

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章