首页 > 编程知识 正文

前序遍历和后序遍历相反,jdk7和8的区别

时间:2023-05-04 12:14:23 阅读:30050 作者:1529

一篇文章来源于看到HashMap为什么要用尾推法?

混列映射使用计算对象的混列值来确定混列表中的存储位置。 也就是说,会发生散列冲突,即两个不同对象计算的散列值与散列表中的后缀相同。 JDK7使用链表结构解决混列冲突,JDK8使用链表和红黑树,仅在冲突的混列链表长度大于8、混列表长度大于64时解决混列冲突。

相同之处在于使用链表解决冲突,但链表的数据插入方法不同。 JDK7使用头部方法将城市链表的头部添加到对象中。 JDK8使用拖尾头发,将对象添加到链表的尾部。

在这种情况下,可以通过遍历HashMap中的元素来比较打印。 HashMap的遍历原理是,如果当前hash表中的下标对象不为空,并且该对象具有后续元素,则遍历要检索的hash表。 根据遍历原理,由于这两种插入方法的不同,在遍历中检索hash表中的对象时会发生两种相反的顺序。

//示例publicstaticvoidmain (字符串[ ] args ) /该类是JDK 7混列源代码的副本,比较//混列表长度为8,保持2的乘方,不执行长度处理//插入4个小于8*0.75的元素hash发生冲突的HashMap_1_7Object,objectmap7=newhashmap_1_7(8; map7. put (1,1 ); map7. put (9,1; map7. put (17,1; map7.put ) 25,1; system.out.println(JDK7. ); map7.foreach((x,y )- System.out.println(x ) ); HashMapObject,objectmaP8=newHashmap(8; map8. put (1,1 ); map8. put (9,1; map8. put (17,1; MAP8.put ) 25,1; system.out.println(JDK8. ); MAP8.Foreach((x,y )- System.out.println(x ) ); }执行结果:

//顺序相反的jdk7.251791jdk8.191725这里有问题。 为什么要换尾插法?

我们先来看看HashMap的扩展原理:

触发器:当hash表中存储的元素数超过阈值时,将触发容量的增长。 阈值是混列表的长度*加载系数,默认值为0.75

步骤:

1、创建长度为原始长度两倍的新数组

2、遍历原始数组,重新计算各元素并放入新数组,即刷新操作。 (所以这个步骤会消耗性能)

问题是,在名为rehash的步骤中,在JDK7中,如果同时使用rehash,则容易形成环形链接列表,从而产生死循环。

示例:

长度为4,key按照3和11的顺序添加的hash表。

这两个元素的计算下标值都是3,如果继续添加元素,哈希表的长度将扩展到8,并执行rehash。 这些元素的重新计算下标保持为3。

结构为11 — 3

并发rehash :

1、线程1获得11。 next指向3。 线程时间表到此结束。

2、线程2刷新,操作完成。

这时的结构已经是3 — 11了

3、线程1重新安排。 此时,11后面继续显示3。 拿到3后,3的next又变成11。 变成环状,引起了死亡循环。

因此,这里即使将JDK8变更为末尾插入法并进行了rehash,前后链表的顺序也不会变化。 都是3比11。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。