为什么面试老问HashMap,9道HashMap面试题帮你搞定90%

前言:

为什么面试问hashmap?

HashMap的工作原理是目前java面试问的较为常见的问题之一,这里面主要会包含是否用过Hashmap,hashMap的hash碰撞的机制是什么,hashMap是如何扩容的,hashMap的底层数据结构是什么,jdk1.8中对hash算法和寻址算法是如何优化的等问题

今天给大家整理了九道面试题,我认为这些问题面试被问到的几率已经超过我今年能找到女朋友了!
在这里插入图片描述

1. HashMap的原理,内部数据结构?

  • 底层使用哈希表(数组 + 链表),当链表过长会将链表转成 红黑树以实现 O(logn) 时间复杂度内查找

2. 讲一下 HashMap 中 put 方法过程?

  • 对 Key 求 Hash 值,然后再计算 下标。
  • 如果没有碰撞,直接放入桶中,
  • 如果碰撞了,以链表的方式链接到后面,
  • 如果链表长度超过阀值(TREEIFY_THRESHOLD == 8),就把链表转成红黑树。
  • 如果节点已经存在就替换旧值
  • 如果桶满了(容量 * 加载因子),就需要 resize。

3. HashMap 中 hash 函数怎么是是实现的? 还有哪些 hash 的实现方式?

4. HashMap 怎样解决冲突,讲一下扩容过程,假如一个值在原数组中,现在移动了新数组,位置肯定改变了,那是什么定位到在这个值新数组中的位置,

  • 将新节点加到链表后,
  • 容量扩充为原来的两倍,然后对每个节点重新计算哈希值。
  • 这个值只可能在两个地方,一个是原下标的位置,另一种是在下标为 <原下标+原容量> 的位置。

5. 抛开 HashMap,hash 冲突有那些解决办法?

  • 开放定址,链地址法

针对 HashMap 中某个 Entry 链太长,查找的时间复杂度可能达到 O(n),怎么优化?

  • 将链表转为红黑树, JDK1.8 已经实现了。

数组和 ArrayList 的区别;

  • 数组可以包含基本类型和对象类型,ArrayList 只能包含对象类型
  • 数组大小固定,ArrayList 大小可以动态变化
  • ArrayList 提供了更多的特性(addAllremoveAll)。

Arraylist 如何实现排序

  • Collections.sort(List<T> list);
  • sort(List<T> list, Comparator<? super T> c);

6. HashMap

  • 数组 + 链表方式存储

  • 默认容量: 16(2^n 为宜,若定义的初始容量不是 2^n,容量会定义为大于该初始容量的最小 2^n)

    • 例如:初始容量为 13,则真正的容量是 16.

put:

  • 索引计算 : ((key.hashCode() ^ (key.hashCode() >>> 16)) & (table.length - 1))

  • 在链表中查找,并记录链表长度,若链表长度达到了 TREEIFY_THRESHOLD(8),则将该链转成红黑树。

  • 若在链表中找到了,则替换旧值,若未找到则继续

  • 当总元素个数超过容量*加载因子时,扩容为原来 2 倍并重新散列

    • (元素的下标要么不变,要么变为【原下标+原容量】)。
  • 将新元素加到链表尾部

  • 线程不安全

7. HashTable

  • 数组 + 链表方式存储

  • 默认容量: 11(质数 为宜)

  • put:

    • 索引计算 : (key.hashCode() & 0x7FFFFFFF)% table.length
    • 若在链表中找到了,则替换旧值,若未找到则继续
    • 当总元素个数超过容量*加载因子时,扩容为原来 2 倍并重新散列。
    • 将新元素加到链表头部
  • 对修改 Hashtable 内部共享数据的方法添加了 synchronized,保证线程安全。

8. HashMap ,HashTable 区别

  • 默认容量不同。
  • 索引计算方式不同。
  • HashMap 特有的将过长链表转换为红黑树。
  • 新元素的位置不同。
  • 线程安全性

9. HashMap、ConcurrentHashMap 区别。

  • 索引计算消除了最高位的影响
  • 默认容量: 16(若定义了初始容量©,容量会定义为大于(c + (c >>> 1) +1) 的最小 2^n)
    • 例如:初始容量为 13,则真正的容量是 32.
  • 线程安全,并发性能较好
    • 并发性能好的原因是 ConcurrentHashMap 并不是定义 synchronized 方法,而是在链表头上同步,不同的链表之间是互不影响的。

个人比比

上述面试题答案都整理成文档笔记。 也还整理了一些面试资料&最新2020收集的一些大厂的面试真题(都整理成文档,小部分截图),有需要的小伙伴可以点这里、这里,暗号:CSDN。如果你最近在面试 说不定能帮助到你!

在这里插入图片描述
在这里插入图片描述

点关注,不迷路!如果本文对你有帮助的话不要忘记点赞支持哦!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41770757/article/details/109743700