Map类面试题

1. Map 的面试题分类

    1. HashMap的数据结构,面试官考察的是对 Map 内部的存储结构了解;
    1. HashMap 的增删查改操作,面试官考察的是对 map 内部操作流程的熟悉程度,既要知其然,还要知其所以然;
    1. HashMap 的应用,面试官考察的是灵活运用HashMap的能力。
    1. 其他Map类面试题,面试官考察的是系统掌握Map类的能力。

2.经典面试题

    1. Java 集合你有了解么?平常项目比较常用的集合类有哪些?

HashMap 和 ArrayList。

    1. 那你知道 HashMap 内部的数据结构吗?

各个版本的实现略有不同。JDK1.7 及以前的 HashMap 采用数组 + 链表的结构来存储数据; JDK8 中的 HashMap 采用了数组 + 链表或树的结构来存储数据。

  • HashMap 的存储数据的过程是什么样的?

​不同的 JDK 版本版本的存储过程略有差异。在 JDK1.8 中,HashMap 存储数据的过程可以分为以下几步:

1. 对 key 的 hashCode () 进行 hash 后计算数组获得下标 index;

2. 如果当前数组为 null,进行容量的初始化,初始容量为 16;

3. 如果 hash 计算后没有碰撞,直接放到对应数组下标里;

4. 如果 hash 计算后发生碰撞且节点已存在,则替换掉原来的对象;

5. 如果 hash 计算后发生碰撞且节点已经是树结构,则挂载到树上。

6 / 如果 hash 计算后发生碰撞且节点是链表结构,则添加到链表尾,并判断链表是否需要转换成树结构
(默认大于 8 的情况会转换成树结构);
  1. 完成 put 后,是否需要 resize () 操作(数据量超过 threshold,threshold 为初始容量和负载因子之积,默认为 12)。

而在 1.7 的版本中,5/6 是合在一起的,即如果发生哈希碰撞且节点是链表结构,则放在链表头。

    1. 如果 hashCode 相同,如何获取对象呢?

hashCode 相同,说明这些对象的数据都在同一个数组下标对应的链表或者树上。get 方法的签名是 V get (Object key) ,入参只有一个 key,因此通过遍历链表或者树,取出每一个节点对比 hash 值是否相等且 key 是否相等 (= 或者 equals)。

    1. HashMap 和 HashTable 有什么区别?

​ HashMap 是 JDK1.2 才出现的;HashTable 是 JDK1.0 就出现的。JDK 里面也说了 HashMap 可以大致相当于 HashTable(The HashMap class is roughly equivalent to Hashtable, except that it is
unsynchronized and permits nulls)。

至于具体的差异:

1.HashMap 是线程不安全的,HashTable 是线程安全的。

2.HashMap 的键需要重新计算对象的 hash 值,而 HashTable 直接使用对象的 hashCode。

3.HashMap 的值和键都可以为 null,HashTable 的值和键都不能为 null。

4.HashMap 的数组的默认初始化大小为 16,HashTable 为 11;HashMap 扩容时会扩大两倍,HashTable 扩大两倍 + 1;

猜你喜欢

转载自www.cnblogs.com/masters-/p/12897212.html
今日推荐