Hashmap JDK1.7和1.8的数据结构,扩容机制区别

jdk1.7:使用的是数组+链表结构,当调用put方法时,先计算key的hashcode,将hashcode和hashmap数组容量大小进行&运算,算出的值就是数组下标。如果该下标处为空,则直接插入数组。如果已经有值,则替换为新put进来的节点,并将新节点的next节点指向原来该位置的节点。执行get操作时,用同样的方法算出数组下标,然后遍历该下标的列表,找到hashcode相同并且key.equals成立的节点,然后返回数据。扩容机制:当hashmap中的元素数量大于数组长度乘以加载因子,并且新增元素的数组位置不为空的时候,就会发生扩容。扩容后需要重新计算原来元素的hashcode并放到新的位置。
jdk1.8:使用的是数组+链表+红黑树,当某个链表的长度超过最大容量时,判断数组长度是否小于64,小于则会扩容。扩容之后,如果再出现这个情况,链表就会被树化,转换为红黑树结构。删除红黑树中某个节点时,并不会使红黑树马上转换为链表,需要在节点数低于最低容量时,才会回到链表结构。避免在最大容量临界值时,反复增删,造成数据结构频繁变化,引起的资源浪费。put操作时,在链表的最末尾进行插入。因为需要遍历链表,确认链表的长度是否超标,遍历后直接插入在末尾,比较省事。
posted @ 2022-01-18 19:34  viziCCC  阅读(626)  评论(0)    收藏  举报