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 的对象解决多线程等问题。
更多精彩返回微信公众号【老王说编程】,专一后端编程实战,原创文章每天更新!