HashMap作为java中一种常用的集合类一直是面试的一个热门话题今天猪猪就用问答的方式为大家分享一下关于HashMap常见的面试题.
浪哥:同学你好,我是今天的面试官亚索,大家一般都叫我浪哥,这边你先做一下自我介绍吧
猪猪:浪哥你好,我叫猪猪,今年xx岁,是一名两年开发经验的java后端开发工程师,熟悉各种常用的java技术栈,平时的兴趣爱好是学习一些新技术和溜冰.(ps:博主偷懒大家有需要的话可以私聊我要自我介绍模板qaq).
浪哥:猪猪你好,HashMap是我们平时开发中的一种常用的集合类,你这边可以谈谈你对他的理解吗?
猪猪:java中的集合在我看来分为两大类,collection类以及map类,hashmap是map类的一种实现,主要用来存放键值对类型的数据,他底层的数据结构是数组加链表,在java8之后引入了红黑树,链表的主要作用是用来解决hash冲突.
浪哥:那你可以详细的给我讲讲什么时候会发生hash冲突吗?
猪猪:HashMap采用Entry数组来存储key-value对,每一个键值对组成了一个Entry实体,Entry类实际上是一个单向的链表结构,它具有Next指针,可以连接下一个Entry实体,当两个key的hash值相同时就会产生hash冲突,就会插入到链表的节点上,在java7时采用的是头插法因为设计师在设计时认为后插入的数据比先插入的数据查询的可能性会更大一点但是在高并发的情况下会发生链式冲突所以在java8 中改用了尾插法.
浪哥:猪猪讲的还是比较详细的,那你说说hashmap的初始容量以及他的扩容机制是怎么样的吧.
猪猪:初始容量为16,负载因子为0.75,默认是达到初始容量*负载因子的数据量时进行扩容,扩容大小一般为二倍扩容.
浪哥:猪猪之前提到了java8引进的红黑树能说一说在什么情况下链表会转化成红黑树吗?
猪猪:当链表的长度大于8并且集合容量达到64时改链表会转换成红黑树,当链表的长度降低到6时红黑树会重新转换成列表,是6不是7的原因是为了防止频繁的链表红黑树转换影响性能.
浪哥:那hashmap是线程安全的集合类吗?
猪猪:不是的,我们如果想要线程安全的话可以采用hashtable或者concurrenthashmap来加锁从而达到线程安全的需求.
浪哥:除了这两种方法你还有其他的方法来针对hashmap本身达到线程安全吗
猪猪:不知道,不会,勿cue
浪哥:小伙子要虚心学习,我们还可以通过Synchronized Map直接对hashmap进行上锁操作,今天回答的不错,明天浪哥我来问问你stream流的问题。
猪猪:还有下次?wdnmd
ps:我是猪猪一个励志四十岁回老家种地的普通程序员,愿大家在未来的生活中一帆风顺,不忘初心.
创作不易,点个赞再走吧亲QAQ