ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Java 面试问题 > 原文: [https://howtodoinjava.com/java-interview-questions/](https://howtodoinjava.com/java-interview-questions/) 未来几天有计划的面试吗? 本指南包含 100 多个 **Java 面试问题**,将帮助您针对经验丰富的开发人员以及从小型初创公司到大型公司的大多数 Java 核心面试问题进行修订。 从这些基本的核心 Java 问题开始。 我写这些教程是为了帮助您回答您可能会遇到的一些题目。 我试图在每个答案后面尽可能多地推理。 尽管如此,仍不可能在本指南中包含所有可能的问题,因此我在本面试指南的末尾提供了一些很好的资源。 ## 1.核心 Java 面试问题 #### 1.1 [核心 Java 面试问题系列](//howtodoinjava.com/java/interviews-questions/core-java-interview-questions-series-part-1/) 通常,每位访问者都将从 Java 核心概念入手,然后再进入更高级的主题。 原因很简单,他想放松您并使您感到舒适。 这些问题的范围可能从简单的面向对象原理到最常用的 Java 类,例如`String`或`HashMap`。 我之所以说这些简单问题,是因为它们测试了您的基础,基础知识以及对细节的好奇心。 尝试回答所有此类问题。 它们是低挂的水果,您不应该错过。 该系列分为 3 部分。 这些问题将帮助您在很短的时间内快速修订最常见的核心 Java 问题。 开始准备下一次面试的最佳方法。 * [核心 Java 面试问题 – 第 1 部分](//howtodoinjava.com/java/interviews-questions/core-java-interview-questions-series-part-1/) * [核心 Java 面试问题 – 第 2 部分](//howtodoinjava.com/java/interviews-questions/core-java-interview-questions-series-part-2/) * [核心 Java 面试问题 – 第 3 部分](//howtodoinjava.com/java/interviews-questions/core-java-interview-questions-series-part-3/) #### 1.2 [对象初始化最佳实践](//howtodoinjava.com/java/related-concepts/object-initialization-best-practices-internal-caching-in-wrapper-classes/) 在 Java 中,**对象初始化**被认为是一个繁重的过程,您应该了解每个新创建的对象如何影响内存和应用性能。 一个简单的例子是 Java 包装器类,它从外部看起来很简单,就像**原始类型**一样,但是它们并不像它们看起来那么简单。 了解 Java 如何在包装类(例如`Double`,`Long`或`Integer`)内对对象进行内部缓存。 #### 1.3 [`HashMap`在 Java 中的工作方式](//howtodoinjava.com/java/collections/how-hashmap-works-in-java/ "How hashmap works in java") 如果您参加任何初级或中级面试,[`HashMap`](https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html)可能是讨论最多且最具争议的话题。 如果您知道`hashmap`在内部如何工作,您可以面对与`HashMap`相关的任何面试问题。 这篇文章将帮助您回答一些很好的问题,例如: * `HashMap`如何存储键值对? * `HashMap`如何解决冲突? * `HashMap`中如何使用`hashCode()`和`equals()`方法? * 键的随机/固定`hashCode()`值的影响? * 在多线程环境中使用`HashMap`? #### 1.4 [为`HashMap`设计一个好的键](//howtodoinjava.com/java/collections/how-to-design-a-good-key-for-hashmap/) 因此,您现在知道`HashMap`的工作原理吗? 现在了解有关为`HashMap`设计一个好的键的信息。 这是测试您是否正确理解`HashMap`内部工作的一种好方法。 这将帮助您回答以下问题: * 为什么`String`是`HashMap`的好钥匙? * 您将如何设计用作键的类? * 您将覆盖`Key`类中的`hashCode()`方法吗? 有什么影响? * 为可以作为`HashMap`关键对象的类编写语法? #### 1.5 [关于`ConcurrentHashMap`的问题](//howtodoinjava.com/tag/concurrenthashmap/ "concurrenthashmap") `HashMap`不是线程安全的。 我们可以在并发应用中使用`HashTable`,但这会影响应用性能。 所以我们有`ConcurrentHashMap`。 它是`HashMap`的并发版本,具有与`HashMap`相同的性能,并且同时也是线程安全的。 您应该进一步了解`ConcurrentHashMap`。 仅此一个类就有很多概念。 这也是准备下一次面试时要学习的另一个好话题。 #### 1.6 [Java 集合面试问题](//howtodoinjava.com/java/collections/useful-java-collection-interview-questions/) 我是否应该建议您准备**集合框架**及其所有主要类别? 我想你已经足够聪明了。 如果没有任何与集合框架有关的问题,则任何面试(初中和中级)都将是不完整的。 它真正测试您的编程技能和对核心 Java API 的了解。 问题可能像集合层次结构一样简单,而困难的问题例如队列和栈。 这是此类常见集合面试问题的列表: * 解释集合层次? * `Set`和`List`之间的区别? * `Vector`和`ArrayList`之间的差异? * `HashMap`和`HashTable`之间的区别? * `Iterator`和`ListIterator`之间的区别? * 为什么`Map`接口没有扩展`Collection`接口? * 如何将`String`数组转换为`ArrayList`? * 如何扭转列表? * `HashSet`如何存储元素? * 是否可以将空元素添加到`TreeSet`或`HashSet`? * 什么是`IdentityHashMap`和`WeakHashMap`? * 什么时候使用`HashMap`或`TreeMap`? * 如何使集合只读? * 如何使集合线程安全? * **故障快速**和**故障安全**有什么区别? * 什么是`Comparator`和`Comparable`接口? * 什么是集合和**数组**类? * 什么是**队列**和**栈**? 列出他们的差异? #### 1.7 [Java 中的多态是什么?](//howtodoinjava.com/object-oriented/what-is-polymorphism-in-java/) 简而言之,**多态性**是一种能力,通过它我们可以创建在不同程序环境下表现不同的函数或引用变量。 与继承,抽象和封装一样,多态是面向对象编程的主要构建块之一。 通过示例更详细地了解该概念。 这是如此重要。 #### 1.8 [Java 中的抽象是什么?](//howtodoinjava.com/object-oriented/understanding-abstraction-in-java/) 在上一个问题中,您学习了多态。 现在是时候通过理解**抽象**来扩展您的知识了。 任何 Java 面试的话题都非常复杂。 #### 1.9 [抽象与封装?](//howtodoinjava.com/object-oriented/encapsulation-in-java-and-its-relation-with-abstraction/ "Encapsulation in java and its relation with abstraction") 了解抽象和**封装**之间的区别是深入理解这两个概念的关键。 您不能孤立地学习两者。 它们采用 Java 编写,因此必须加以集体理解。 在这篇文章中,我已经解释了封装并通过抽象来区分它。 在继续之前,必须阅读 Java 面试问题。 #### 1.10 [接口和抽象类之间的区别?](//howtodoinjava.com/object-oriented/exploring-interfaces-and-abstract-classes-in-java/ "Exploring interfaces and abstract classes in java") 自从 Java 语言诞生以来,在**抽象类**和**接口**中就有非常清晰的分离。 但是自从 Java8 发行到市场以来,发生了很多变化。 它的核心概念之一是函数式接口。 [**函数式接口**](https://howtodoinjava.com/java8/functional-interface-tutorial/)完全改变了我们查看 Java 语言的两个基本构建块的方式。 如果您的简历说您使用 Java8,就不能跳过这个问题。在链接的教程中,我将向您展示正确的场景,这将帮助您解决一些复杂的面试问题和案例研究。 #### 1.11 [枚举面试问题](//howtodoinjava.com/java-5/guide-for-understanding-enum-in-java/) 枚举已成为核心构建块很长时间了。 在大多数流行的 Java 库中都可以看到它们。 它们帮助您以更加面向对象的方式管理常量。 它们看起来非常简单,但是如果您深入研究,它们会隐藏很多复杂性。 一些枚举问题可能是: * 枚举与枚举类之间的区别? * 枚举可以与`String`一起使用吗? * 我们可以扩展枚举吗? * 写枚举的语法? * 如何在枚举中实现反向查找? * 什么是`EnumMap`和`EnumSet`? #### 1.12 [Java 序列化和`Serializable`接口](//howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/) 如果您准备对电信公司或在其应用流程中使用**序列化**的任何此类域进行 Java 面试,那么您将从本教程中受益匪浅。 用 Java 进行序列化的可做与不可做的一个很好的列表。 可能的问题可能包括: * 什么是`serialVersionUID`? * 什么是`readObject`和`writeObject`? * 您将如何序列化和反序列化一个类? * 您将如何对类进行更改,以使序列化不中断? * 我们可以序列化静态字段吗? #### 1.13 [Java `main`方法](//howtodoinjava.com/java/related-concepts/a-mini-guide-to-main-method-in-java/ "A mini guide to main method in java") 有没有想过为什么`main()`是公开的,静态的和`void`? 在 Java 面试中,这不是一个经常问到的面试问题,但我仍然建议您阅读这篇文章来回答以下问题: * Java `main`方法语法? * 为什么`main`方法是公开的? * 为什么`main`方法是静态的? * 为什么`main`方法是`void`? * 当您调用`main`方法时,内部会发生什么? #### 1.14 [Java 对象克隆](//howtodoinjava.com/java/cloning/a-guide-to-object-cloning-in-java/ "A guide to object cloning in java") Java 中的对象**克隆**并非易事。 我自己花了很长时间了解 Java 的克隆。 看起来真的很简单; 使用`Cloneable`接口并覆盖`clone()`方法。 可是等等; 在面试中还有很多要说的和要问的。 例如: * `clone()`方法如何工作? * Java 中的浅表复制是什么? * 什么是复制构造器? * Java 中的深层复制是什么? * 创建对象的深层副本的不同方法? #### 1.15 [什么是 `CountDownLatch`?](//howtodoinjava.com/java/multi-threading/when-to-use-countdownlatch-java-concurrency-example-tutorial/) 从 Java 5 开始,`java.uti.concurrent`包具有许多有用的但很复杂的类来在并发应用上工作。 `CountDownLatch`是在任何 Java 面试大型企业中都要求很高的类之一。 在本教程中,`CountDownLatch`附带示例和概念进行了解释。 #### 1.16 [为什么字符串是不可变的?](//howtodoinjava.com/java/string/java-interview-question-why-strings-are-immutable/ "Java interview question: Why Strings are immutable?") 这个问题是初学者中非常受欢迎的面试问题。 基本上,面试官测试您对`String`类,**字符串池**,内存区域和对象创建的了解。 我分开写这篇文章是因为这个概念非常重要。 实际上,**不变性**本身是 Java 中非常重要的概念。 感受冰山一角。 #### 1.17 [如何使 Java 类不可变?](//howtodoinjava.com/java/related-concepts/how-to-make-a-java-class-immutable/ "How to make a java class immutable") 不变类是一种一旦创建便无法更改其状态的类。 在 Java 中创建不可变的类有某些准则,您必须知道它们才能正确回答此问题。 请注意,不变性在许多设计方面都很重要,并且是所有 Java 专家推荐的设计模式。 了解如何使 Java 类不可变,如何使 Java 类受益于应用设计,并准备在其上遇到更多软件设计面试问题。 ## 2\. Java 并发面试问题 #### 2.1 [什么是线程安全性?](//howtodoinjava.com/java/multi-threading/what-is-thread-safety/ "What is Thread Safety?") 定义**线程安全性**非常棘手。 线程安全性的任何合理定义的核心是正确性的概念。 因此,在了解线程安全性之前,我们应该首先了解这种“正确性”。 在这个必读的 Java 教程中,清除您的疑问并准备回答一些流行的面试问题。 例如: * 线程安全的正确性是什么? * 举个线程安全类的例子吗? * 您将如何设计线程安全的 Java 类? * 不变类线程安全吗? #### 2.2 [对象级别锁定与类级别锁定](//howtodoinjava.com/java/multi-threading/thread-synchronization-object-level-locking-and-class-level-locking/) **并发**的核心是对象锁定的概念。 锁定发生在实例级别以及类级别。 * 当您要同步非静态方法或非静态代码块时,只有一个线程将能够在给定的类实例上执行代码块,因此对象级锁定是一种机制。 应该始终这样做以确保实例级数据线程安全。 * 类级别锁定可防止多个线程在运行时在所有可用实例中的任何一个中进入同步块。 这意味着,如果在运行时有`DemoClass`的 100 个实例,则一次只有一个线程能够在任何一个实例中执行`demoMethod()`,而所有其他实例将被其他线程锁定。 为了确保静态数据线程的安全,应该始终这样做。 在本教程中详细了解整个概念。 #### 2.3 [“`Runnable`的实现”和“扩展线程”之间的区别?](//howtodoinjava.com/java/multi-threading/difference-between-implements-runnable-and-extends-thread-in-java/) 这也是一个非常受欢迎的面试问题。 如果您的角色要求为并发应用创建设计,那么您必须知道此问题的正确答案。 这个问题的答案决定了您在两者之间选择哪种结构。 此外,它将帮助您回答一些基本问题,例如: * 线程和可运行之间的区别? * 编写 Java 代码以使用`Runnable`接口创建线程? * 两者之间应首选哪种方法? #### 2.4 [比较和交换(CAS)算法](//howtodoinjava.com/java/multi-threading/compare-and-swap-cas-algorithm/) 此问题针对中级或高级开发人员。 在回答这个问题之前,这需要对其他并发概念有深刻的理解。 因此,这是测试 Java 并发知识的好方法。 * 什么是乐观锁定和悲观锁定? * 什么是比较和交换算法? * 什么是原子操作? * `AtomicInteger`和`AtomicLong`如何工作? #### 2.5 [什么是 Fork/Join 框架?](https://howtodoinjava.com/java7/forkjoin-framework-tutorial-forkjoinpool-example/) 自 Java8 发行以来,这不是一个新概念,但现在已以多种方式使用。Fork-Join 将手头的任务分解为多个微型任务,直到该微型任务足够简单,无需进一步分解即可解决。 这就像分而治之的算法。 在此框架中要注意的一个重要概念是,理想情况下,没有工作线程处于空闲状态。 他们实现了一种偷窃工作的算法,即闲置的工作器从忙碌的工作器那里窃取了工作。 学习这个精巧而高效的算法,以更好地准备下一次面试。 #### 2.6 [什么是`ThreadPoolExecutor`?](https://howtodoinjava.com/java/multi-threading/java-thread-pool-executor-example/) 在并发 Java 应用中,创建线程是一项昂贵的操作。 而且,如果您每次都开始创建新的线程实例来执行任务,则应用性能肯定会降低。 `ThreadPoolExecutor`解决了此问题。 `ThreadPoolExecutor`将任务创建和执行分开。 使用`ThreadPoolExecutor`,您仅需实现`Runnable`对象并将其发送给执行器。 它负责它们的执行,实例化以及使用必要的线程运行。 阅读`ThreadPoolExecutor`如何解决各种问题以及如何与[`BlockingQueue`](https://howtodoinjava.com/java/multi-threading/how-to-use-blockingqueue-and-threadpoolexecutor-in-java/)一起使用。 #### 2.7 [Java 执行器框架教程和最佳实践](//howtodoinjava.com/java-5/java-executor-framework-tutorial-and-best-practices/ "Java executor framework tutorial and best practices") 您将在上一个链接中学习执行器,但是要想有效地使用这些执行器,您需要了解某些事情。 #### 2.8 [如何用 Java 编写并解决死锁](//howtodoinjava.com/java/multi-threading/writing-a-deadlock-and-resolving-in-java/) 它可能以题目的形式出现。 最好为此做好准备。 面试官可以测试您的并发知识以及对`wait()`和`notify()`方法调用的深刻理解。 指尖准备好一个**死锁**源代码示例。 您将需要它。 > 在出现任何 Java 面试之前,必须阅读以上给出的问题。 但是,它们仍无法提供完整的覆盖范围。 您需要了解的越来越多,才能在面试中表现更好。 我建议您按照给定的顺序阅读以下各节中的更多主题。 ## 3.有经验的开发人员的 Java 面试问题 #### 3.1 [最佳实践指南](//howtodoinjava.com/java-best-practices/ "Best practices") 强烈推荐的最佳实践列表。 他们将打开您的思路,朝着不同的方向思考。 简而言之,他们将为您的下一次 Java 面试提供帮助。 #### 3.2 [解决一些题目](//howtodoinjava.com/category/puzzles/ "Puzzles") 解决这些**题目**并在它们周围玩耍。 您永远不知道在糟糕的一天会遇到什么。 #### 3.3 [整理设计模式](//howtodoinjava.com/category/design-patterns/ "Design patterns") 为了在下一次 Java 面试中获得更高的职位,您必须知道这些设计模式可以处理一些复杂的应用设计问题,这些问题通常在当今的所有面试中都得到讨论。 #### 3.4 [随机浏览核心 Java 主题](//howtodoinjava.com/category/java/ "Core java topics") 仍然有实力阅读更多。 在此处浏览更多 Java 面试问题。 ## 4.Spring 面试题 #### 4.1 [Spring 核心面试问题](https://howtodoinjava.com/interview-questions/top-spring-core-interview-questions-with-answers/) 我已经尝试收集一些 Spring 热门核心面试问题,您将在下次技术面试中面对这些问题,例如: * 什么是控制反转(IoC)和依赖注入(DI)? * `BeanFactory`和`ApplicationContext`之间的区别? * 什么是基于 Spring Java 的配置? * 解释 Spring Bean 的生命周期? * Spring Bean 范围有哪些不同? * 在 Spring 框架中,单例 bean 线程安全吗? * 解释 Bean 自动装配的不同模式? * 用示例解释`@Qualifier`注解? * 构造器注入和设置器注入之间的区别? * 命名 Spring 框架中使用的一些设计模式? #### 4.2 [Spring AOP 面试问题](https://howtodoinjava.com/interview-questions/top-spring-aop-interview-questions-with-answers/) Spring **AOP** (面向方面​​的编程)在某种意义上补充了 OOP,因为它也提供了模块化。 在 OOP 中,关键单位是“对象”,但在 AOP 中,关键单位是方面或横切关注点,例如日志记录和安全性。 AOP 提供了一种使用简单的可插拔配置在实际逻辑之前,之后或周围动态添加横切关注点的方法 通过这些最常见的 AOP 面试问题: * 关注点和跨领域关注点之间的区别? * 有哪些可用的 AOP 实现? * Spring AOP 中有哪些不同的建议类型? * 什么是 Spring AOP 代理? * 什么是**连接点**和**切入点**? * 什么是混合织入? #### 4.3 [Spring MVC 面试问题](https://howtodoinjava.com/interview-questions/spring-mvc-interview-questions-with-answers/) 这些 Spring MVC 面试问题和答案已被编写,可帮助您为面试做准备,并快速地对总体概念进行修订。 如果有多余的时间,我强烈建议您更深入地研究每个概念。 一般来说,您应该能够回答以下问题: * 什么是 MVC 架构? * 什么是`DispatcherServlet`和`ContextLoaderListener`? * 如何使用基于 Java 的配置? * 我们如何使用 Spring 创建返回 JSON 响应的 Restful Web 服务? * `<context:annotation-config>`与`<context:component-scan>`之间的区别? * `@Component`,`@Controller`,`@Repository`和`@Service`注解之间的区别? * Spring MVC 如何提供验证支持? * 什么是 Spring MVC 拦截器以及如何使用? * 如何在 Spring MVC 框架中处理异常? * 如何在 Spring MVC 应用中实现本地化? ## 5.测试您的知识 #### 5.1 [针对 Oracle 企业管理器项目的 Java 真实面试问题](https://howtodoinjava.com/interview-questions/real-java-interview-questions-asked-for-oracle-enterprise-manager-project/) 到目前为止,您已经学习了 Java 中的所有不同概念,这些概念可以通过面试问题的形式出现在您面前。 现在该看看您是否准备好了。 在接受 Oracle 公司的面试时,请回答 Sreenath Ravva 提出的一些实际问题。 * 您可以开始讲述自己和您的项目吗? * 什么是 Java 中的抽象和封装? * 方法重载规则? * Java 的扩大和缩小? * 我在代码中可以只有`try`块吗? * 线程:生产者和消费者的问题? * 为什么在`Object`类中定义了`wait()`,`notify()`和`notifyAll()`? * 我们可以覆盖`wait()`或`notify()`方法吗? * `wait()`,`sleep()`和`yield()`之间的区别? * 解释一下线程类中的`join()`方法? * 您是否遇到了内存不足错误? 如果是,您如何解决? 告诉不同的情况为什么会这样? * 数据库连接泄漏? * 编写程序以使用第三个变量交换两个数字? * 编写程序对数组进行排序并删除重复项? * 在单例上编写程序? * 写一个程序合并两个数组? * `final`和`finally`关键字有什么用? * 我可以将类声明为静态还是私有的吗? * 为什么要更改公司? #### 5.2 [针对中级开发人员的 Java 面试问题](//howtodoinjava.com/interviews-questions/java-interview-questions-for-mid-level-developers/) Nikhil 在 Java/j2ee 开发人员方面有 6 年的经验,他打算改变公司。 我向他提出了这些中级面试问题。 他的面试很成功。 您也可以从中受益。 ## 6.推荐书籍 #### 6.1 [Java 题目](https://www.amazon.com/gp/offer-listing/032133678X/ "java puzzlers") 每种编程语言都有其怪癖。 本书通过编程题目揭示了 Java 编程语言的奇特之处。 #### 6.2 [实践中的 Java 并发性](https://www.amazon.com/gp/offer-listing/ " Java Concurrency in Practice ") 实践中的 Java 并发为您提供了为当今和未来的系统编写安全且可扩展的 Java 程序所需的概念和技术。 #### 6.3 [Joshua Bloch 撰写的《Effective Java》](https://www.amazon.com/gp/offer-listing/0321356683/ "Effective Java") 第二版的《有效 Java》汇集了七十八个不可或缺的程序员经验法则:针对您每天遇到的编程挑战提供可行的最佳实践解决方案。 学习愉快!