1、请你谈谈 HashMap 的工作原理
如果被问到 HashMap 相干的问题,它的工作原理都会被作为面试的开场白,这个时候先装作若有所思的样子沉着一下。首先 HashMap 是基于 hashing 的原理,咱们晓得 HashMap 有两个罕用的办法 put()、get(),将键值对传递给 put() 办法时,它调用键对象的 hashCode() 办法来计算 hashcode,而后找到 bucket 地位来贮存值对象。当获取对象时,通过键对象的 equals() 办法找到正确的键值对,而后返回值对象。
个别状况下,必定会问如果不同的键对象的 hashcode 值相等会呈现什么样的状况。他们必定是存储在同一个地位的链表中的,应用键对象的 equals() 办法找到键值对。
HashMap + 链表 + 红黑树 的图片援用自 开源中国
在 Java1.8 当前,HashMap 在数组、链表的根底上又减少了红黑树的数据结构。在一个数组地位的链表长度大于 8 时数据结构转换为红黑树的构造。
2、HashMap 和 HashTable 的区别有什么?
HashMap 和 HashTable 都实现了 Map 接口,次要的区别集中在线程、同步、速度方面的差异。
- HashMap 是非同步的,并且 HashMap 能够存储键值为 null 的对象,容许最多只有一个键能够为 null 对象、容许能够有多个值为 null。
- HashMap 是线程不平安的,HashTable 是线程平安的。
- 因为 HashTable 是多线程的,所以在单线程的状况下,HashMap 的速度要快一些。
- HashMap 不能保障存储程序是不变的。
3、HashMap 和 HashSet 的区别有什么?
- 两者实现的接口不一样,HashMap 实现的是 Map 接口、HashSet 则实现的是 Set 接口。
- HashMap 存储的是键值对、HashSet 存储的是对象。
- HashSet 的速度比 HashMap 的要慢一些。
- 计算 hashcode 值的形式不一样,HashMap 应用键对象来计算、HashSet 应用它自身的对象元素来计算。
4、当两个对象的 HashCode 雷同会产生什么?
因为 hashcode 雷同,所以它们的 bucket 地位雷同,‘碰撞’会产生。因为 HashMap 应用链表存储对象,这个 Entry(蕴含有键值对的 Map.Entry 对象) 会存储在链表中。
5、如果两个键的 HashCode 雷同,你如何获取值对象?
当咱们调用 get() 办法,HashMap 会应用键对象的 hashcode 找到 bucket 地位,而后获取值对象。找到 bucket 地位之后,会调用 keys.equals() 办法去找到链表中正确的节点,最终找到要找的值对象。
6、多线程状况下,调整 HashMap 的大小会有什么问题?
因为线程不平安的起因,在多线程条件下调整 HashMap 的大小时会存在多个 HashMap 对象的竞争关系,不晓得要给哪一个调整大小。如此一来,多线程状况调整 HashMap 的大小就会陷入死循环的状况,在 Java1.5 当前就减少了 ConcurrentHashMap 的对象解决多线程等问题。
更多精彩返回微信公众号【老王说编程】,专一后端编程实战,原创文章每天更新!