热门文章> hashmap1.7和1.8的区别 >

hashmap1.7和1.8的区别

36氪企服点评小编
2022-03-17 17:25
4795次阅读

| 企服解答

hashmap1.7和1.8的区别:1、JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法;2、扩容后数据存储位置的计算方式也不一样;3、JDK1.7的时候使用的是数组+ 单链表的数据结构。

hashmap1.7和1.8的区别hashmap1.7和1.8的区别

1、JDK1.7用的是头插法,而JDK1.8及之后使用的都是尾插法

因为JDK1.7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。

2、扩容后数据存储位置的计算方式也不一样

在JDK1.7的时候是直接用hash值和需要扩容的二进制数进行&(这里就是为什么扩容的时候为啥一定必须是2的多少次幂的原因所在,因为如果只有2的n次幂的情况时最后一位二进制数才一定是1,这样能最大程度减少hash碰撞)(hash值 & length-1)

3、JDK1.7的时候使用的是数组+ 单链表的数据结构

在JDK1.8及之后时,使用的是数组+链表+红黑树的数据结构(当链表的深度达到8的时候,也就是默认阈值,就会自动扩容把链表转成红黑树的数据结构来把时间复杂度从O(n)变成O(logN)提高了效率)

| 拓展阅读

hashmap和hashtable的区别是什么?

1、历史原因不同。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。

2、也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的synchronizedMap(方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。

3、只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey(方法来区别这两种情况。

[免责声明]

文章标题: hashmap1.7和1.8的区别

文章内容为网站编辑整理发布,仅供学习与参考,不代表本网站赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时沟通。发送邮件至36dianping@36kr.com,我们会在3个工作日内处理。

消息通知
咨询入驻
商务合作