前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Java集合】没搞明白的集合合集

【Java集合】没搞明白的集合合集

作者头像
韩旭051
发布2021-04-14 15:15:40
3360
发布2021-04-14 15:15:40
举报
文章被收录于专栏:刷题笔记刷题笔记

文章目录

HashMap中的循环链表是如何产生的?

  • 在多线程的情况下,当重新调整HashMap大小的时候,就会存在条件竞争,
  • 因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。 在调整大小的过程中,存储在链表中的元素的次序会反过来,
  • 因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历。
  • 如果条件竞争发生了,那么就会产生死循环了。

HashMap为什么用红黑树而不用B树?

  • B/B+树多用于外存上时,B/B+也被成为一个磁盘友好的数据结构。
  • HashMap本来是数组+链表的形式,链表由于其查找慢的特点,所以需要被查找效率更高的树结构来替换。
  • 如果用B/B+树的话,在数据量不是很多的情况下,数据都会“挤在”一个结点里面,这个时候遍历效率就退化成了链表。

HashMap为什么线程不安全?

HashMap在并发执行put操作时,可能会导致形成循环链表,从而引起死循环。

HashMap和HashTable的区别

  • Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable的性能高一点。
  • Hashtable不允许使用null作为key和value,如果试图把null值放进Hashtable中,将会引发空指针异常,但HashMap可以使用null作为key或value。
  • 从Hashtable的类名上就可以看出它是一个古老的类,它的命名甚至没有遵守Java的命名规范:每个单词的首字母都应该大写。也许当初开发Hashtable的工程师也没有注意到这一点,后来大量Java程序中使用了Hashtable类,所以这个类名也就不能改为HashTable了,否则将导致大量程序需要改写。
  • 与Vector类似的是,尽量少用Hashtable实现类,即使需要创建线程安全的Map实现类,也无须使用Hashtable实现类,可以通过Collections工具类把HashMap变成线程安全的Map。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-03-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • HashMap中的循环链表是如何产生的?
  • HashMap为什么用红黑树而不用B树?
  • HashMap为什么线程不安全?
  • HashMap和HashTable的区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档