你必须知道的 60 个 Java 和 Spring 面试问题

2025-05-24

你必须知道的 60 个 Java 和 Spring 面试问题

你必须知道的 60 个 Java 和 Spring 面试问题
优秀的 Java 和 Spring 开发人员一直供不应求。根据 Indeed 的数据,目前全美有 29,694 个 Java 开发人员职位空缺,16,085 个 .Net 软件工程师职位空缺。请关注并阅读最新的 Java 和 Spring 面试热门问题。

🔴 最初发表于FullStack.Cafe - Kill Your Tech & Coding Interview

Q1:JDK和JRE有什么区别?

主题:Java
难度:⭐

Java 运行时环境 (JRE) 本质上是 Java 虚拟机 (JVM),用于执行 Java 程序。它还包含用于执行小程序的浏览器插件。Java 开发工具包 (JDK) 是功能齐全的 Java 软件开发工具包,包含 JRE、编译器和工具(例如 JavaDoc 和 Java 调试器),方便用户开发、编译和执行 Java 应用程序。

🔗来源: github.com/snowdream

Q2:Applet 和 Java 应用程序有什么区别?

主题:Java
难度:⭐

Applet 在支持 Java 的浏览器中执行,而 Java 应用程序是独立的 Java 程序,可以在浏览器之外执行。然而,它们都需要 Java 虚拟机 (JVM) 的支持。此外,Java 应用程序需要一个具有特定签名的 main 方法才能启动执行。而 Java Applet 则不需要这样的方法。最后,Java Applet 通常使用严格的安全策略,而 Java 应用程序通常使用较为宽松的安全策略。

🔗来源: github.com/snowdream

Q3:什么是 JSP 页面?

主题:Java
难度:⭐

Java 服务器页面 (JSP) 是一个文本文档,包含两种类型的文本:静态数据和 JSP 元素。静态数据可以用任何基于文本的格式表示,例如 HTML 或 XML。JSP 是一种将静态内容与动态生成内容混合的技术。

🔗来源: github.com/snowdream

Q4:什么是 Servlet?

主题:Java
难度:⭐

Servlet 是一种 Java 编程语言类,用于处理客户端请求并生成动态 Web 内容。Servlet 主要用于处理或存储 HTML 表单提交的数据、提供动态内容以及管理无状态 HTTP 协议中不存在的状态信息。

🔗来源: github.com/snowdream

Q5:什么是按引用传递和按值传递?

主题:Java
难度:⭐⭐

当对象按值传递时,这意味着传递的是该对象的副本。因此,即使对该对象进行了更改,也不会影响其原始值。当对象按引用传递时,这意味着传递的不是实际的对象,而是对象的引用。因此,外部方法所做的任何更改也会反映在所有地方。

🔗来源: github.com/snowdream

Q6:Java Collections Framework 的基本接口有哪些?

主题:Java
难度:⭐⭐

Java 集合框架提供了一组精心设计的接口和类,用于支持对对象集合的操作。Java 集合框架中最基本的接口包括:

  • 集合,代表一组称为其元素的对象。
  • Set,即不能包含重复元素的集合。
  • List,是一个有序集合,可以包含重复元素。
  • Map,是将键映射到值的对象,并且不能包含重复的键。

🔗来源: github.com/snowdream

Q7:HashMap和Hashtable有什么区别?

主题:Java
难度:⭐⭐

HashMapHashtable类都实现了 Map 接口,因此具有非常相似的特性。但是,它们在以下特性上有所不同:

  • HashMap允许存在空键和空值,而Hashtable不允许空键也不允许空值。
  • Hashtable是同步的,而HashMap不是。因此,HashMap适合单线程环境,而Hashtable更适合多线程环境。
  • HashMap提供其键的集合,Java 应用程序可以对其进行迭代。因此,HashMap具有快速失败的特性。另一方面,Hashtable提供其键的枚举
  • Hashtable被视为遗留类。

🔗来源: github.com/snowdream

Q8:System.gc() 和 Runtime.gc() 方法起什么作用?

主题:Java
难度:⭐⭐

这些方法可以作为对 JVM 的提示,以启动垃圾回收。但是,Java 虚拟机 (JVM) 可以自行决定是立即启动垃圾回收还是稍后启动。

🔗来源: github.com/snowdream

Q9:java中Exception和Error有什么区别?

主题:Java
难度:⭐⭐

ExceptionError类都是Throwable类的子类。Exception用于表示用户程序应该捕获的异常情况。Error用于表示用户程序不应捕获的异常情况。

🔗来源: github.com/snowdream

Q10:什么是 Java Applet?

主题:Java
难度:⭐⭐

Java Applet 是一种可以嵌入 HTML 页面并在支持 Java 的客户端浏览器中执行的程序。Applet 用于创建动态且交互式的 Web 应用程序。

🔗来源: github.com/snowdream

Q11:什么是JDBC?

主题:Java
难度:⭐⭐

JDBC 是一个允许用户在数据库之间进行选择的抽象层。JDBC使开发人员能够用 Java 编写数据库应用程序,而无需关心特定数据库的底层细节。

🔗来源: github.com/snowdream

Q12:JSP 请求是如何处理的?

主题:Java
难度:⭐⭐

当 JSP 请求到达时,浏览器首先请求一个扩展名为 .jsp 的页面。然后,Web 服务器读取该请求,并使用 JSP 编译器将 JSP 页面转换为 servlet 类。请注意,JSP 文件仅在页面首次请求时或 JSP 文件发生更改时才会被编译。生成的 servlet 类将被调用,以处理浏览器的请求。请求执行完成后,servlet 会将响应发送回客户端。了解如何在 JSP 中获取请求参数

🔗来源: github.com/snowdream

Q13:什么是声明?

主题:Java
难度:⭐⭐

声明类似于 Java 中的变量声明。声明用于声明变量,以便后续在表达式或脚本中使用。要添加声明,必须使用序列将声明括起来。

🔗来源: github.com/snowdream

Q14:使用 Spring 有什么好处?

主题:春天
难度:⭐⭐

以下列出了使用 Spring 框架的一些好处:

  • 轻量级- Spring 在大小和透明度方面非常轻量级。Spring 框架的基本版本大约为 2MB。
  • 控制反转(IOC) - Spring 使用控制反转技术实现松散耦合。对象提供其依赖关系,而不是创建或查找依赖对象。
  • 面向方面 (AOP) − Spring 支持面向方面的编程,并通过将应用程序业务逻辑与系统服务分离来实现有凝聚力的开发。
  • 容器- Spring 包含并管理应用程序对象的生命周期和配置。
  • MVC 框架- Spring 的 Web 框架是一个精心设计的 Web MVC 框架,它为 Struts 或其他过度设计或不太流行的 Web 框架提供了很好的替代方案。
  • 事务管理- Spring 提供了一致的事务管理接口,可以缩小到本地事务(例如,使用单个数据库)并扩展到全局事务(例如,使用 JTA)。
  • 异常处理- Spring 提供了一个方便的 API 来将特定于技术的异常(例如由 JDBC、Hibernate 或 JDO 引发的异常)转换为一致的、未经检查的异常。

🔗资料来源: tutorialspoint.com

Q15:什么是 Spring beans?

主题:春天
难度:⭐⭐

构成应用程序主干并由 Spring IoC 容器管理的对象称为Bean。Bean是由 Spring IoC 容器实例化、组装和管理的对象。这些 Bean 是使用您提供给容器的配置元数据(例如,以 XML<bean/>定义的形式)创建的。

🔗资料来源: tutorialspoint.com

Q16:Spring 的 ORM 支持哪些?

主题:春天
难度:⭐⭐

Spring 支持以下 ORM:

  • 休眠
  • 伊巴蒂斯
  • JPA(Java 持久性 API)
  • TopLink
  • JDO(Java数据对象)
  • 奥杰布

🔗资料来源: tutorialspoint.com

Q17:什么是 Spring Security?

主题:春天
难度:⭐⭐

Spring Security是 Spring 框架的一个独立模块,专注于在 Java 应用程序中提供身份验证和授权方法。它还可以处理大多数常见的安全漏洞,例如 CSRF 攻击。

要在 Web 应用程序中使用 Spring Security,您可以从一个简单的注释开始:@EnableWebSecurity

🔗资料来源: developersbook.com

Q18:什么是循环队列,为什么要使用它?

主题:数据结构
难度:⭐⭐⭐

循环队列是一种线性数据结构,其操作基于 FIFO(先进先出)原则执行,最后一个位置与第一个位置连接形成一个环。它也被称为环形缓冲区。循环队列避免了使用数组实现的常规队列中的空间浪费。

🔗资料来源: programiz.com

Q19:“针对接口编程,而不是针对实现编程”是什么意思?

主题:设计模式
难度:⭐⭐⭐

针对接口进行编码意味着客户端代码始终持有由工厂提供的接口对象

工厂返回的任何实例都将是接口类型,任何工厂候选类都必须实现该类型。这样,客户端程序就无需担心实现问题,接口签名决定了所有可以执行的操作。

这种方法可以用来在运行时改变程序的行为。从维护的角度来看,它还能帮助你编写更好的程序。

🔗资料来源: tutorialspoint.com

Q20:什么是观察者模式?

主题:设计模式
难度:⭐⭐⭐

观察者模式(又称发布-订阅模式)用于对象之间存在一对多关系的情况,例如,如果一个对象被修改,其依赖对象将自动收到通知。观察者模式属于行为模式。

一个与关注其状态的其他对象之间存在一对多关系的对象被称为主体发布者观察者会在主体状态发生改变时收到通知,并据此采取行动。主体可以拥有任意数量的依赖观察者,并向其发出通知;同时,任意数量的观察者可以订阅主体以接收此类通知。

观察者模式使用两个参与者类:

  • 观察者(OS订阅者)抽象类提供了一种update()方法,该方法将被主题调用以通知其主题状态的变化。
  • Subject(或Publisher)类也是一个抽象类,并定义了四种主要方法attach()、、detach()setState()notify()

🔗资料来源: sitepoint.com

Q21:可以在静态上下文中访问非静态变量吗?

主题:Java
难度:⭐⭐⭐

Java 中的静态变量属于其所属的类,其值对于该类的所有实例都保持不变。静态变量在 JVM 加载类时初始化。如果您的代码尝试访问非静态变量(没有任何实例),编译器会报错,因为这些变量尚未创建,并且未与任何实例关联。

🔗来源: github.com/snowdream

Q22:Java 支持多重继承吗?

主题:Java
难度:⭐⭐⭐

不,Java 不支持多重继承。每个类只能扩展一个类,但可以实现多个接口。

🔗来源: github.com/snowdream

问题23:解释一下创建线程的不同方法。你更喜欢哪一种?为什么?

主题:Java
难度:⭐⭐⭐

有三种方法可以创建线程

  • 一个类可以扩展Thread类。
  • 一个类可以实现Runnable接口。
  • 应用程序可以使用Executor框架来创建线程池。

Runnable接口是首选,因为它不需要对象继承Thread类。如果您的应用程序设计需要多重继承,那么只有接口才能帮到您。此外,线程池非常高效,并且易于实现和使用。

🔗来源: github.com/snowdream

Q24:什么是死锁?

主题:Java
难度:⭐⭐⭐

两个进程互相等待对方完成后才能继续执行的情况。其结果是两个进程都无限期地等待。

🔗来源: github.com/snowdream

Q25:快速失败和故障安全之间有什么区别?

主题:Java
难度:⭐⭐⭐

迭代器的故障安全 (fail-safe) 属性适用于底层集合的克隆,因此它不受集合中任何修改的影响。java.util 包中的所有集合类都具有快速故障 (fail-fast) 特性,而 java.util.concurrent 包中的集合类也具有故障安全 (fail-safe) 特性。快速故障 (fail-fast) 迭代器会抛出ConcurrentModificationException异常,而故障安全 (fail-safe) 迭代器则不会抛出此类异常。

🔗来源: github.com/snowdream

Q26:什么是 Java 优先级队列?

主题:Java
难度:⭐⭐⭐

PriorityQueue是一个基于优先级堆的无界队列,其元素按自然顺序排列。在创建它时,我们可以提供一个 Comparator 来对 PriorityQueue 中的元素进行排序。PriorityQueue不允许值、不提供自然顺序的对象或未关联任何比较器的对象。最后,Java 的PriorityQueue不是线程安全的,其入队和出队操作需要 O(log(n)) 的时间复杂度。

🔗来源: github.com/snowdream

Q27:finalize() 什么时候被调用? finalize 的目的是什么?

主题:Java
难度:⭐⭐⭐

finalize 方法由垃圾收集器在释放对象内存之前调用。通常建议在 finalize 方法中释放对象所持有的资源。

🔗来源: github.com/snowdream

Q28:Java 堆的结构是怎样的?

主题:Java
难度:⭐⭐⭐

JVM 有一个堆,它是运行时数据区域,所有类实例和数组的内存都从中分配。它在 JVM 启动时创建。对象的堆内存由自动内存管理系统(称为垃圾收集器)回收。堆内存由活动对象和死亡对象组成。活动对象可被应用程序访问,并且不会被垃圾收集器回收。死亡对象是指那些应用程序永远无法访问,但尚未被垃圾收集器回收的对象。这些对象会占用堆内存空间,直到最终被垃圾收集器回收。

🔗来源: github.com/snowdream

Q29:Java 小程序有哪些限制?

主题:Java
难度:⭐⭐⭐

主要是由于安全原因,对 Java 小程序施加了以下限制:

  • 小程序无法加载库或定义本机方法。
  • 小程序通常无法读取或写入执行主机上的文件。
  • 小程序无法读取某些系统属性。
  • 小程序无法与其来源主机以外的主机建立网络连接。
  • 小程序无法启动执行它的主机上的任何程序。

🔗来源: github.com/snowdream

Q30:什么是 Scriptlet?

主题:Java
难度:⭐⭐⭐

在 Java 服务器页面 (JSP) 技术中,Scriptlet 是嵌入在 JSP 页面中的一段 Java 代码。Scriptlet 指的是标签内的所有内容。用户可以在这些标签之间添加任何有效的 Scriptlet。

🔗来源: github.com/snowdream

Q31:说出界面的特点。

主题:OOP
难度:⭐⭐⭐

接口是一个仅包含方法签名的模板。方法签名由参数数量、参数类型(值、引用或输出)以及参数顺序组成。接口本身没有实现,因为它仅包含方法定义,而没有任何方法主体。接口使用interface关键字定义。此外,您无法实例化接口。接口具有以下各种特性:

  • 接口用于在代码中实现多重继承。接口的这一特性与抽象类截然不同,因为一个类不能继承多个类的特性,但可以轻松实现多个接口。
  • 它定义了一组特定的方法及其参数。
  • 接口中的变量必须声明为publicstaticfinal,而方法必须是publicabstract
  • 实现接口的类必须实现其所有方法。
  • 一个接口可以从多个接口派生。

🔗资料来源: indiabix.com

问题32:SOLID 代表什么?它的原理是什么?

主题:软件架构
难度:⭐⭐⭐

SOLID是罗伯特·C·马丁 (Robert C. Martin) 提出的前五个面向对象设计 (OOD) 原则的首字母缩写词。

  • S -单一职责原则。一个类应该有且仅有一个改变的理由,也就是说一个类应该只有一项工作。
  • O -开放封闭原则。对象或实体应该对扩展开放,但对修改关闭。
  • L -里氏替换原则。设 q(x) 是关于类型 T 的 x 对象可证明的属性。那么,q(y) 应该对于类型 S 的对象 y 可证明,其中 S 是 T 的子类型。
  • I -接口隔离原则。客户端不应该被强制实现它不使用的接口,也不应该被强制依赖它不使用的方法。
  • D -依赖倒置原则。实体必须依赖于抽象,而非具体。它规定高级模块不能依赖于低级模块,而应该依赖于抽象。

🔗来源: scotch.io

Q33:什么是DRY和DIE原则?

主题:软件架构
难度:⭐⭐⭐

在软件工程中,“不要重复自己”(DRY)“重复是邪恶的”(DIE)是软件开发的一个原则。

🔗来源: stackoverflow.com

Q34:如果函数/方法没有返回值,那么返回 NULL 或空值是否更好?

主题:软件架构
难度:⭐⭐⭐

null如果您想要表明没有可用数据,那么返回通常是最好的主意。

空对象意味着已返回数据,而返回则null明确表示未返回任何内容。

此外,如果您尝试访问对象中的成员,返回 anull将导致空异常,这对于突出显示错误代码非常有用 - 尝试访问空成员是没有意义的。访问空对象的成员不会失败,这意味着错误不会被发现。

🔗来源: stackoverflow.com

Q35:解释 Spring 框架中的 Bean 生命周期

主题:春天
难度:⭐⭐⭐

以下是 Spring 中 bean 生命周期的顺序:

  • 实例化- 首先,spring 容器从 XML 文件中找到 bean 的定义并实例化该 bean。
  • 填充属性- 使用依赖注入,spring 填充 bean 定义中指定的所有属性。
  • 设置 Bean 名称- 如果 Bean 实现了 BeanNameAware 接口,Spring 会将 Bean 的 id 传递给 setBeanName() 方法。
  • 设置 Bean 工厂- 如果 Bean 实现了 BeanFactoryAware 接口,spring 会将 beanfactory 传递给 setBeanFactory() 方法。
  • 预初始化- 也称为 Bean 的后处理。如果有任何与该 Bean 关联的 BeanPostProcessors,Spring 会调用 postProcesserBeforeInitialization() 方法。
  • 初始化 Bean - 如果 Bean 实现了 IntializingBean,则会调用其 afterPropertySet() 方法。如果 Bean 具有 init 方法声明,则会调用指定的初始化方法。
  • 后初始化- 如果有与该 bean 关联的任何 BeanPostProcessors,则会调用它们的 postProcessAfterInitialization() 方法。
  • 准备使用- 现在该 bean 已准备好供应用程序使用。
  • 销毁- 如果 bean 实现了 DisposableBean ,它将调用 destroy() 方法。

🔗资料来源: tutorialspoint.com

Q36:Spring MVC 框架中的 Controller 是什么?

主题:春天
难度:⭐⭐⭐

控制器提供对通常通过服务接口定义的应用程序行为的访问。控制器解释用户输入并将其转换为由视图呈现给用户的模型。Spring 以一种非常抽象的方式实现控制器,这使您能够创建各种各样的控制器。

🔗资料来源: tutorialspoint.com

Q37:Aspect是什么?

主题:春天
难度:⭐⭐⭐

切面 (Aspect)一个模块,它包含一组用于提供跨领域需求的 API。例如,日志模块可以被称为用于日志记录的 AOP 切面。一个应用程序可以根据需求拥有任意数量的切面。在 Spring AOP 中,切面可以使用常规类(基于 schema 的方法)或使用@aspect注解(@AspectJ样式)的常规类来实现。

🔗资料来源: tutorialspoint.com

Q38:Spring Bean Factory 容器中典型的 Bean 生命周期是什么?

主题:春天
难度:⭐⭐⭐

Spring Bean Factory容器中Bean的生命周期如下:

  • spring容器从XML文件中找到bean定义并实例化该bean。

  • 使用依赖注入,spring 填充 bean 定义中指定的所有属性

  • 如果 bean 实现了 BeanNameAware 接口,工厂就会调用setBeanName()并传递 bean ID。

  • 如果 Bean 实现了 BeanFactoryAware 接口,工厂就会调用setBeanFactory(),并传递其自身的实例。

  • 如果有任何与该 bean 关联的 BeanPostProcessors,ProcessBeforeInitialization()则会调用它们的 post 方法。

  • 如果为 bean 指定了 init 方法,则会调用该方法。

  • 最后,如果有任何与该 bean 关联的 BeanPostProcessors,postProcessAfterInitialization()则会调用它们的方法。

🔗资料来源: developersbook.com

Q39:如何在 Spring MVC 框架中处理异常?

主题:春天
难度:⭐⭐⭐

Spring MVC框架提供了以下方法来帮助我们实现健壮的异常处理。

  1. 基于控制器——我们可以在控制器类中定义异常处理方法。我们只需要在这些方法上添加 @ExceptionHandler 注解即可。
  2. 全局异常处理程序——异常处理是一个横切关注点,Spring 提供了@ControllerAdvice 注释,我们可以将其与任何类一起使用来定义我们的全局异常处理程序。
  3. HandlerExceptionResolver 实现– 对于通用异常,我们大多数情况下会提供静态页面。Spring 框架提供了HandlerExceptionResolver一些接口,我们可以实现这些接口来创建全局异常处理程序。之所以采用这种额外的方式定义全局异常处理程序,是因为 Spring 框架也提供了默认实现类,我们可以在 Spring Bean 配置文件中定义这些默认实现类,从而获得 Spring 框架异常处理的优势。

🔗资料来源: journaldev.com

Q40:什么是 Spring IoC 容器?

主题:春天
难度:⭐⭐⭐

控制反转(IoC) 是一种实现对象依赖关系之间松散耦合的机制。为了实现对象的松散耦合和运行时的动态绑定,对象需要定义其依赖关系,这些依赖关系会被其他组装对象注入。Spring IoC 容器是一个将依赖关系注入对象并使其准备好供我们使用的程序。

Spring Framework IoC 容器类是包的一部分org.springframework.beansorg.springframework.context并为我们提供了解耦对象依赖关系的不同方法。

我们使用的一些有用的 ApplicationContext 实现是;

  • AnnotationConfigApplicationContext:对于使用基于注释的配置的独立 Java 应用程序。
  • ClassPathXmlApplicationContext:对于使用基于 XML 配置的独立 Java 应用程序。
  • FileSystemXmlApplicationContext:与 ClassPathXmlApplicationContext 类似,不同之处在于 xml 配置文件可以从文件系统中的任何位置加载。
  • AnnotationConfigWebApplicationContext以及XmlWebApplicationContextWeb 应用程序。

🔗资料来源: journaldev.com

Q41:DispatcherServlet 是通过应用程序上下文实例化的吗?

主题:春天
难度:⭐⭐⭐

不可以,DispatcherServlet是由 Tomcat 或 Jetty 等 Servlet 容器实例化的。您必须在 web.xml 文件中定义,DispatcherServlet如下所示。

您可以看到 load-on-startup 标签为 1,这意味着DispatcherServlet当您将 Spring MVC 应用程序部署到 Tomcat 或任何其他 Servlet 容器时,它会被实例化。在实例化过程中,它会查找文件 servlet-name-context.xml,然后初始化此文件中定义的 Bean。

🔗资料来源: dzone.com

Q42:会话范围的用途是什么?

主题:春天
难度:⭐⭐⭐

会话作用域的目的是为 HTTP 会话创建 Bean 的实例。这意味着,如果同一个 Bean 被限定在会话作用域内,它可以服务于多个请求。您可以使用@ScopeSpring MVC 应用程序中的 scope 属性或注解来定义 Spring Bean 的作用域。

🔗资料来源: dzone.com

Q43:同步方法和同步块有什么区别?

主题:Java
难度:⭐⭐⭐⭐

在 Java 编程中,每个对象都有一个锁。线程可以使用 synchronized 关键字获取对象的锁。synchronized 关键字可以应用于方法级别(粗粒度锁)或代码块级别(细粒度锁)。

🔗来源: github.com/snowdream

Q44:如何保证N个线程可以访问N个资源而不发生死锁?

主题:Java
难度:⭐⭐⭐⭐

在使用 N 个线程时,避免死锁的一个非常简单的方法是强制每个线程遵循该顺序。因此,如果所有线程都以相同的顺序锁定和解锁互斥锁,就不会发生死锁。

🔗来源: github.com/snowdream

Q45:堆中的 Perm Gen 空间是什么?

主题:Java
难度:⭐⭐⭐⭐

Perm Gen 代表永久代。它是 Java 堆上的一块空间,用于保存描述用户类(不属于 Java 语言的类)的元数据。这类元数据的示例包括描述类和方法的对象,它们存储在永久代中。代码量较大的应用程序很快就会填满这部分堆内存,java.lang.OutOfMemoryError: PermGen无论你的内存分配池有多高-Xmx(内存分配池的最大大小)以及机器有多少内存,都会导致这种情况。

🔗来源: github.com/snowdream

Q46:什么是RMI?

主题:Java
难度:⭐⭐⭐⭐

Java 远程方法调用 (Java RMI) 是一种 Java API,它执行与远程过程调用 (RPC) 等效的面向对象操作,支持直接传输序列化的 Java 类和分布式垃圾收集。远程方法调用 (RMI) 也可以理解为在远程运行的对象上激活方法的过程。RMI 提供位置透明性,因为用户感觉方法是在本地运行的对象上执行的。

🔗来源: github.com/snowdream

Q47:解释不同类型的继承。

主题:OOP
难度:⭐⭐⭐⭐

OOP 中的继承有四种类型:

  • 单继承——包含一个基类和一个派生类
  • 层次继承- 包含一个基类和同一基类的多个派生类
  • 多级继承- 包含从派生类派生的类
  • 多重继承- 包含多个基类和一个派生类

所有 .NET 语言都支持单继承、分层继承和多继承。它们不支持多重继承,因为在这些语言中,一个派生类不能有多个基类。但是,您可以通过接口在 .NET 中实现多重继承。

🔗资料来源: indiabix.com

Q48:什么是 GOD 课程,为什么我们应该避免它?

主题:软件架构
难度:⭐⭐⭐⭐

破坏应用程序最有效的方法是创建“神类”( GOD classes)。这些类会跟踪大量信息并承担多项职责。一次代码更改很可能会影响该类的其他部分,从而间接影响所有使用它的其他类。这反过来会导致更大的维护混乱,因为除了添加新功能之外,没有人敢做任何更改。

🔗来源: stackoverflow.com

Q49: Spring 支持哪些 bean 作用域?解释一下。

主题:春天
难度:⭐⭐⭐⭐

Spring 框架支持以下五种范围,其中三种仅在使用支持 Web 的 ApplicationContext 时可用。

  • singleton--这将bean定义范围限定为每个Spring IoC容器的单个实例。
  • 原型- 这将单个 bean 定义限定为具有任意数量的对象实例。
  • request--这将bean定义范围限定为HTTP请求。仅在支持Web的Spring ApplicationContext上下文中有效。
  • session − 这会将 bean 定义的作用域限定为 HTTP 会话。仅在支持 Web 的 Spring ApplicationContext 上下文中有效。
  • global-session − 将 bean 定义范围限定于全局 HTTP 会话。仅在支持 Web 的 Spring ApplicationContext 上下文中有效。

🔗资料来源: tutorialspoint.com

Q50:什么是编织?

主题:春天
难度:⭐⭐⭐⭐

编织是将方面与其他应用程序类型或对象相链接以创建建议对象的过程。

🔗资料来源: tutorialspoint.com

Q51:Spring AOP中的关注点和横切关注点有什么区别?

主题:春天
难度:⭐⭐⭐⭐

  • 关注点- 关注点是我们希望在应用程序模块中拥有的行为。关注点可以定义为我们想要实现的功能。我们感兴趣的问题定义了我们的关注点。
  • 横切关注点- 这是适用于整个应用程序并影响整个应用程序的关注点。例如,日志记录,安全性和数据传输是应用程序几乎每个模块都需要关注的关注点,因此是横切关注点。

🔗资料来源: tutorialspoint.com

Q52:使用 Spring Transactions 有哪些好处?

主题:春天
难度:⭐⭐⭐⭐

  • 提供跨不同事务 API(如 JTA、JDBC、Hibernate、JPA 和 JDO)的一致编程模型
  • 支持声明式事务管理
  • 为编程式事务管理提供比 JTA 等一些复杂事务 API 更简单的 API
  • 与 Spring 的各种数据访问抽象很好地集成

🔗资料来源: baeldung.com

Q53:什么是面向方面编程?

主题:春天
难度:⭐⭐⭐⭐

方面通过向现有代码添加额外行为而不修改受影响的类,实现了跨切关注点(例如跨多个类型和对象的事务管理)的模块化。

🔗资料来源: baeldung.com

Q54:什么是 Spring WebFlux?

主题:春天
难度:⭐⭐⭐⭐

Spring WebFlux 是 Spring 的响应式 Web 框架,它是 Spring MVC 的替代方案。为了实现这种响应式模型并实现高度可扩展性,整个堆栈都是非阻塞的。

🔗资料来源: baeldung.com

Q55:比较@Component(v2.5)和@bean(v 3.0)

主题:春天
难度:⭐⭐⭐⭐

是否可以重新使用@Component注释而不是引入@bean注释?


@Component@Bean做两件完全不同的事情,不应该混淆。

  • @Component(以及@Service@Repository)用于通过类路径扫描自动检测和自动配置 bean。注解类和 bean 之间存在隐式的一对一映射(即每个类对应一个 bean)。由于这种方法是纯声明式的,因此对装配的控制非常有限。

  • @Bean用于明确声明单个 bean,而不是让 Spring 来做

回答你的问题
当然,可能吧;但他们选择不这么做,因为两者完全不同。Spring 本身已经够让人困惑的了,不用再进一步混淆了。

🔗来源: stackoverflow.com

Q56:依赖注入和服务定位器模式之间有什么区别?

主题:设计模式
难度:⭐⭐⭐⭐⭐

  • 使用ServiceLocator时,该类仍然负责创建其依赖项。它只是使用服务定位器来执行此操作。
  • 服务定位器隐藏了依赖关系——当对象从定位器获取连接时,您无法通过查看对象来判断它是否访问数据库(例如)。
  • 使用DI,类会被赋予依赖项。它既不知道也不关心这些依赖项来自哪里。

这样做的一个重要结果是,DI 示例更容易进行单元测试——因为你可以传递其依赖对象的模拟实现。你可以将两者结合起来——并根据需要注入服务定位器(或工厂)。

🔗来源: stackoverflow.com

Q57:RMI 架构有哪些层次?

主题:Java
难度:⭐⭐⭐⭐⭐

RMI 体系结构由以下层组成:

  • 存根和骨架层:此层位于开发人员视图之下。该层负责拦截客户端对接口的方法调用,并将这些调用重定向到远程 RMI 服务。
  • 远程引用层:RMI 架构的第二层,负责解释客户端对服务器远程对象的引用。该层负责解释和管理客户端对远程服务对象的引用。连接是一对一(单播)的。
  • 传输层:此层负责连接参与服务的两个 JVM。此层基于网络中机器之间的 TCP/IP 连接。它提供基本的连接,以及一些防火墙穿透策略。

🔗来源: github.com/snowdream

Q58:关联、聚合和组合有什么区别?

主题:OOP
难度:⭐⭐⭐⭐⭐

  • 关联是一种所有对象都有自己的生命周期并且没有所有者的关系。

让我们以“老师”和“学生”为例。多个学生可以与单个老师关联,单个学生也可以与多个老师关联,但对象之间没有所有权,并且都有各自的生命周期。两者都可以独立创建和删除。

  • 聚合是关联的一种特殊形式,其中所有对象都有自己的生命周期,但有所有权,子对象不能属于另一个父对象。

让我们以部门和老师为例。一个老师不能同时属于多个部门,但如果我们删除部门,老师对象不会销毁。我们可以将其视为一种“has-a”关系。

  • 组合又是聚合的一种特殊形式,我们可以称之为“死亡”关系。它是一种强聚合。子对象没有生命周期,如果父对象被删除,所有子对象也将被删除。

让我们再举一个房屋 (House) 和房间 (Rooms) 关系的例子。房屋可以包含多个房间 - 每个房间没有独立的生命周期,并且任何房间都不能属于两个不同的房屋。如果我们删除房屋,房间也会被自动删除。

让我们再举一个问题和选项之间关系的例子。单个问题可以有多个选项,而选项不能同时属于多个问题。如果我们删除问题,选项也会被自动删除。

🔗来源: stackoverflow.com

Q59:Spring 框架的一些最佳实践是什么?

主题:春天
难度:⭐⭐⭐⭐⭐

  1. 避免在架构参考中使用版本号,以确保我们拥有最新的配置。
  2. 根据关注点划分 spring bean 配置,例如 spring-jdbc.xml、spring-security.xml。
  3. 对于 Spring MVC 中多个上下文中使用的 Spring Bean,在根上下文中创建它们并使用监听器进行初始化。
  4. 尽可能配置bean依赖,尽量避免自动装配。
  5. 对于应用程序级属性,最好的方法是创建一个属性文件并在 spring bean 配置文件中读取它。
  6. 对于较小的应用程序,注解很有用,但对于较大的应用程序,注解可能会很麻烦。如果我们将所有配置都放在 XML 文件中,维护起来会更容易。
  7. 为组件使用正确的注解,以便于理解其用途。对于服务,请使用 @Service;对于 DAO bean,请使用 @Repository。
  8. Spring 框架有很多模块,使用你需要的即可。移除通过 Spring Tool Suite 模板创建项目时通常会添加的所有额外依赖项。
  9. 如果您正在使用方面,请确保连接点尽可能窄,以避免对不必要的方法发出建议。请考虑使用更易于使用且可避免任何问题的自定义注解。
  10. 当有实际好处时使用依赖注入,仅仅为了松散耦合不要使用它,因为它更难维护。

🔗资料来源: journaldev.com

Q60:自动装配在 Spring 中如何工作?

主题:春天
难度:⭐⭐⭐⭐⭐

首先,也是最重要的——所有 Spring bean 都是可管理的——它们“生存”在一个容器中,称为“应用程序上下文”。

其次,每个应用程序都有一个指向该上下文的入口点。Web 应用程序使用 Servlet,JSF 使用 el-resolver,等等。此外,还有一个地方用于引导应用程序上下文并自动装配所有 bean。在 Web 应用程序中,这可以是一个启动监听器。

自动装配是通过将一个 bean 的实例放置到另一个 bean 实例的所需字段中来实现的。两个类都应该是 bean,也就是说,它们应该被定义为存在于应用程序上下文中。

在应用程序上下文中,“存活”是什么意思?这意味着上下文会实例化对象,而不是你。也就是说,你永远不会创建new UserServiceImpl()实例,容器会找到每个注入点并在那里设置一个实例。

🔗来源: stackoverflow.com

感谢🙌的阅读,祝你面试顺利!
如果喜欢,请分享给你的开发者同事!
更多 FullStack 面试问答,请访问👉 www.fullstack.cafe

文章来源:https://dev.to/aershov24/60-java-and-spring-interview-questions-you-must-know-802
PREV
9 个软件架构面试问题及答案
NEXT
2018 年 22 个 Angular 专家面试问题及答案