首页 > 编程语言 >Java常见面试真题之中级进阶(HashMap篇)

Java常见面试真题之中级进阶(HashMap篇)

时间:2024-10-29 17:48:33浏览次数:5  
标签:Java HashMap 真题 线程 Hashtable key 红黑树 节点 进阶

前言

本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!说说Hashtable 与 HashMap 的区别?HashMap 中的 key 我们可以使用任何类作为 key 吗?HashMap 的长度为什么是 2 的 N 次方呢?HashMap 与 ConcurrentHashMap 的异同?红黑树有哪几个特征?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘

*** 12万字的java面试题整理 ***

说说Hashtable 与 HashMap 的区别

  1. 都实现了 Map、Cloneable、Serializable(当前 JDK 版本 1.8)。
  2. Hashtable 中大部分 public 修饰普通方法都是synchronized 字段修饰的,是线程安全的,HashMap 是非线程安全的。
  3. Hashtable 的 key 不能为 null,value 也不能为 null,这个可以从 Hashtable 源码中的 put 方法看到,判断如果 value 为 null 就直接抛出空指针异常,在 put 方法中计算 key 的 hash 值之前并没有判断 key 为 null 的情况,那说明,这时候如果 key 为空,照样会抛出空指针异常。
  4. HashMap 的 key 和 value 都可以为 null。在计算 hash 值的时候,有判断,如果key==null ,则其 hash=0 ;至于 value 是否为 null,根本没有判断过。
  5. Hashtable 直接使用对象的 hash 值。hash 值是 JDK 根据对象的地址或者字符串或者数字算出来的 int 类型的数值。然后再使用除留余数法来获得最终的位置。然而除法运算是非常耗费时间的,效率很低。HashMap 为了提高计算效率,将哈希表的大小固定为了 2 的幂,这样在取模预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。
  6. 默认情况下,初始容量不同,Hashtable 的初始长度是 11,之后每次扩充容量变为之前的2n+1(n 为上一次的长度)而 HashMap 的初始长度为 16,之后每次扩充变为原来的两倍。
    另外在 Hashtable 源码注释中有这么一句话:
Hashtable is synchronized. If a thread-safe implementation is not needed, it is
recommended to use HashMap in place of Hashtable . If a thread-safe highly-
concurrent implementation is desired, then it is recommended to useConcurrentHashMap in place of Hashtable

大致意思:Hashtable 是线程安全,推荐使用 HashMap 代替 Hashtable;如果需要线程安全高并发的话,推荐使用 ConcurrentHashMap 代替 Hashtable。
这个回答完了,面试官可能会继续问:HashMap 是线程不安全的,那么在需要线程安全的情况下还要考虑性能,有什么解决方式?
这里最好的选择就是 ConcurrentHashMap 了,但面试官肯定会叫你继续说一下ConcurrentHashMap 数据结构以及底层原理等。

HashMap 中的 key 我们可以使用任何类作为 key 吗?

平时可能大家使用的最多的就是使用 String 作为 HashMap 的 key,但是现在我们想使用某个自定义类作为 HashMap 的 key,那就需要注意以下几点:

  • 如果类重写了 equals 方法,它也应该重写 hashCode 方法。
  • 类的所有实例需要遵循与 equals 和 hashCode 相关的规则。
  • 如果一个类没有使用 equals,你不应该在 hashCode 中使用它。
  • 咱们自定义 key 类的最佳实践是使之为不可变的,这样,hashCode 值可以被缓存起来,拥有更好的性能。不可变的类也可以确保 hashCode 和 equals 在未来不会改变,这样就会解决与可变相关的问题了。

HashMap 的长度为什么是 2 的 N 次方呢?

为了能让 HashMap 存数据和取数据的效率高,尽可能地减少 hash 值的碰撞,也就是说尽量把数据能均匀的分配,每个链表或者红黑树长度尽量相等。

我们首先可能会想到 % 取模的操作来实现。下面是回答的重点哟:

取余(%)操作中如果除数是 2 的幂次,则等价于与其除数减一的与(&)操作(也就是说hash % length == hash &(length - 1) 的前提是 length 是 2 的 n 次方)。并且,采用二进制位操作 & ,相对于 % 能够提高运算效率。

这就是为什么 HashMap 的长度需要 2 的 N 次方了。

HashMap 与 ConcurrentHashMap 的异同

  1. 都是 key-value 形式的存储数据;
  2. HashMap 是线程不安全的,ConcurrentHashMap 是 JUC 下的线程安全的;
  3. HashMap 底层数据结构是数组 + 链表(JDK 1.8 之前)。JDK 1.8 之后是数组 + 链表 + 红黑树。当链表中元素个数达到 8 的时候,链表的查询速度不如红黑树快,链表会转为红黑树,红黑树查询速度快;
  4. HashMap 初始数组大小为 16(默认),当出现扩容的时候,以 0.75 * 数组大小的方式进行扩容;
  5. ConcurrentHashMap 在 JDK 1.8 之前是采用分段锁来现实的 Segment + HashEntry,Segment 数组大小默认是 16,2 的 n 次方;JDK 1.8 之后,采用 Node + CAS + Synchronized来保证并发安全进行实现

红黑树有哪几个特征?

红黑树是一种自平衡二叉查找树,它在每个节点上增加了一个存储位来表示节点的颜色(红色或黑色),通过颜色的约束和一些旋转操作来保持树的平衡。红黑树具有以下特征:

  1. 节点是红色或黑色:每个节点都有一个颜色属性,可以是红色或黑色。
  2. 根节点是黑色:树的根节点总是黑色的。
  3. 所有叶子节点都是黑色:这里的“叶子”指的是空(null)节点,它们不包含数据,并且被认为是黑色的。
  4. 红色节点的子节点必须是黑色:如果一个节点是红色的,则它的两个孩子节点都必须是黑色的。这意味着从任意节点到其子孙叶节点的所有路径上不会有两个连续的红色节点。
  5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点:这条规则保证了没有一条路径会比其他路径长出两倍以上,从而维持了大致的平衡。
    这些性质确保了红黑树的高度最多为2log(n+1),其中n是树中节点的数量。因此,红黑树上的基本操作如插入、删除、查找的时间复杂度都是O(log n),这使得红黑树成为一种高效的平衡二叉搜索树实现方式。

红黑树通过一系列的操作如左旋、右旋以及颜色变化来维护上述性质。当插入或删除节点时,可能会破坏红黑树的性质,这时需要通过调整来恢复这些性质,以确保树仍然满足红黑树的所有特征。

标签:Java,HashMap,真题,线程,Hashtable,key,红黑树,节点,进阶
From: https://www.cnblogs.com/xswz/p/18514052

相关文章

  • 实验四 JavaBean及Servlet使用
    1.完整代码下载:实验三代码2.完整代码下载:实验四代码2.导入代码到eclipse运行【如何处理导入后的报错】......
  • Java两个集合取差集4种方式举例
    Java两个集合取差集4种方式举例 更新时间:2024年08月03日10:30:45 作者:只吹45°风  在Java 编程中,经常需要对集合进行一些操作,比如取两个集合的交集、并集和差集,下面这篇文章主要给大家介绍了关于Java两个集合取差集的4种方式,需要的朋友可以参考下 +目录......
  • javaCV图片OCR文字识别
    springboot项目pom文件中添加以下依赖 1<dependency>2<groupId>org.bytedeco</groupId>3<artifactId>javacv-platform</artifactId>4<version>1.5.5</version>5</depend......
  • java计算机毕业设计作业管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,教育领域也在不断探索和应用新技术,以提高教学质量和管理效率。传统的作业管理方式通常依赖于纸质媒介和面对面的交流,这种方式......
  • java 基础 实训第七天
    Java(OOP)其他知识1、static(静态)      被static修饰的成员(属性,方法),称为静态成员也叫类成员。他们是在类加载时完成   初始化。而且静态成员可以在没有创建对象时直接通过类就可以访问。      类成员也属于所有对象共享的成员。      静态变......
  • Django知识进阶
    一、接口文档编写步骤: 1、学习Markdown语法     2、编写文档公共部分      3、编写接口文档MD语法入门:1、#一级标题2、##二级标题3、引入图片/跳转连接:[超链接名](超链接地址“超链接title”)4、引用内容:```代码引用```5、列表:无序列表-......
  • JAVA对于图片的花式操作(不定期更新)
    JAVA对于图片的花式操作(不定期更新)MultipartFile转Base64字符串图片url转Base64字符串图片url转MultipartFile图片url转File流base64图片压缩引入依赖代码编写抠图MultipartFile转Base64字符串/***MultipartFile文件转bash64字符串**@parammult......
  • Java 23 新特性一览 + Java 24 新动态抢先看
    最近Oracle发布了Java编程语言和虚拟机的最新版本:Java23。作为Java21之后的第二个非LTS版本,该如果你还没了解过,那就一起了解一下吧(内含赠书)。最后,我们再一起看看Java24新动态。Java23 新特性通过ProjectAmber提供的语言特性JEP455:PrimitiveTypesinPatterns,i......
  • Java 中的类型推断是如何工作的?_2
    在Java中,类型推断是编译时进行的过程,它可以自动推导出表达式的类型、减少代码冗余及增强可读性。Java的类型推断通过以下方式工作:自动推导泛型参数类型、省略冗余类型信息、简化Lambda表达式的编写。特别是在Java8及以后的版本中,类型推断的特性得到了极大加强。单独展开描述,自动......
  • java计算机毕业设计翰明教育教学管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着教育事业的不断发展,学校规模的扩大以及教育管理要求的日益提高,传统的教育教学管理方式已经难以满足需求。在当今数字化时代,教育领域也迫切需......