JavaRush /Java 博客 /Random-ZH /Java 开发人员访谈问答分析。第1部分

Java 开发人员访谈问答分析。第1部分

已在 Random-ZH 群组中发布
你好!各种各样的人聚集在 JavaRush 上。我们中的一些人只是想成为Java开发人员,投入大量的时间和精力进行开发,而另一些人已经是Java开发人员了。在某种情况下,您需要为测试(技术面试)做好准备。这次考试并不容易,除了道德上的准备,还需要技术上的准备。 面试问题及答案分析。 第 1 - 1 部分我最近在 dou 上看到了一大堆Java 开发者面试问题。这些问题分为不同的级别——初级、中级和高级。不要惊慌:并非所有问题都很简单,但带有星号的问题很少被问到。问题很好,但我想尝试回答其中的大部分问题。显然,我不会深入探讨一篇文章的范围;毕竟,那里有很多问题。因此,这将是一个完整的系列文章来回答这些问题。我马上强调几点:
  1. 有一篇很棒的文章,其中包含了他们的热门问题和答案。有些问题与上面列出的列表(250+)重叠,因此将跳过这些问题,以免再次重复信息。

  2. 问题是用乌克兰语提出的,但由于大多数 JavaRush 参与者都讲俄语(很大程度上我也是),所以答案将用俄语。

  3. 答案会很简短,因为如果您写得很详细,某些问题的答案可能需要单独的文章。在面试过程中,不需要如此详细和大量的答案,因为你的面试官只有一个小时就必要的主题面试你(而且,正如你所记得的,这已经足够了)。对于那些喜欢深入挖掘的人,我会留下链接。

那么,让我们开始吧。

初级问题与解答

面试问题及答案分析。 第 1 - 2 部分

一般问题

1.你知道哪些设计模式?告诉我们您在工作中使用的两个模板。

模板种类繁多:您可以从本文和本文开始熟悉它们。好吧,对于那些想要详细熟悉它们的人,我建议阅读《Head First》一书。设计模式”。借助它的帮助,您可以轻松详细地学习最基本的设计模式。当谈到可以在面试中用作示例的设计模式时,您会想到以下一些设计模式:
  • Builder是一个常用的模板,是经典对象创建的替代方案;
  • 策略模式,本质上代表了多态性。也就是说,我们有一个接口,但程序的行为将根据该接口的具体实现转移到功能而改变(现在该策略实际上在java应用程序中随处使用)。
如果这对您来说还不够,请关注Spring(如果您已经熟悉它),因为它是一个完整的框架平台,而框架又充满了上下模式。以下是我所讨论内容的几个示例:
  • Factory - 在ApplicationContext中(或在BeanFactory中);
  • Singleton——默认情况下所有bean都是单例;
  • 代理——基本上 Spring 中的所有内容都以这种或那种方式使用这种模式,例如 AOP;
  • 责任链是一种基于 Spring Security 工作原理的模式;
  • 模板- 在 Spring Jdbc 中使用。

Java核心

面试问题及答案分析。 第 1 - 3 部分

2. Java中有哪些数据类型?

Java 有基本数据类型:
  • byte — -128 到 127 范围内的整数,占 1 个字节;
  • Short — -32768 到 32767 范围内的整数,占 2 个字节;
  • int — 整数 -2147483648 到 2147483647,占 4 个字节;
  • long — 9223372036854775808 到 9223372036854775807 范围内的整数,占 8 个字节;
  • float — 范围为 -3.4E+38 到 3.4E+38 的浮点数,占 4 个字节;
  • double — 范围为 -1.7E+308 到 1.7E+308 的浮点数,占 8 个字节;
  • char — UTF-16 中的单个字符,重 2 个字节;
  • 布尔true/false,占 1 个字节。
以及引用数据类型,它指向堆上的对象。

3. 对象与原始数据类型有何不同?

第一个区别:占用的内存量:基元占用很少,因为它们只包含自己的值,而对象可以包含非常非常多的不同值:基元和对其他对象的引用。第二个区别:Java是一种面向对象的语言,所以它里面的一切都是通过对象之间的交互来工作的,而基元不太适合(事实上,这就是为什么Java不是100%面向对象的语言)。第三,接续第二点:由于Java专注于对象之间的交互,因此这些对象有许多不同的机制来管理它们。例如,构造函数、方法、异常(主要对对象进行操作)等。实际上,为了让基元能够以某种方式参与到这个面向对象的环境中(工作),基元类型(IntegerCharacterDoubleBoolean ...)发明了包装器。

4. 按引用传递参数和按值传递参数有什么区别?

原始字段存储它们的值:例如,如果我们设置int i = 9; 字段i存储值9。当我们有一个对象的引用时,就意味着我们有一个包含该对象引用的字段,或者换句话说,有一个对象在内存中的地址值。
Cat cat = new Cat();
事实证明,引用对象的字段也存储,即内存地址值。即cat将new Cat()对象的地址值存储在内存中。当我们将参数传递给方法时,它的值会被复制。对于基元,将复制基元的值。因此,该方法将适用于副本,更改副本不会影响原始版本。在引用类型的情况下,将分别复制内存地址的值,该地址将与其指向的对象相同。如果我们使用这个新链接更改对象,旧链接也会更改该对象(毕竟,它们都指向同一个对象)。

5.什么是JVM、JDK、JRE?

JVM - Java 虚拟机是运行编译器预先生成的 Java 字节码的虚拟机。 JRE——Java运行时环境——本质上是一个运行java应用程序的环境,它包含JVM、标准库和其他用于运行用Java编程语言编写的小程序和应用程序的组件。换句话说, JRE是运行已编译的 Java 程序所需的一切的包,但不包含用于应用程序开发的工具和实用程序,例如编译器或调试器。 JDK - Java Development Kit - JRE的扩展集,即不仅用于启动 Java 应用程序,还用于开发 Java 应用程序的环境。JDK 包含 JRE 中的所有内容,以及各种附加工具 - 用 Ja​​va 创建应用程序所需的编译器和调试器(还包含 java 文档)。面试问题及答案分析。 第 1 - 4 部分

6. 为什么使用JVM?

如上所述,Java虚拟机是运行编译器预先生成的Java字节码的虚拟机。也就是说,JVM 不理解 Java 源代码。因此,首先,编译.java文件,编译后该文件已经具有.class扩展名,并且以 JVM 理解的相同字节代码的形式呈现。每个操作系统都有自己的 JVM,因此在收到字节码文件后,JVM 会执行它,使其适应其发生的操作系统。实际上,由于 JVM 不同,不同操作系统的 JDK(或 JRE)版本也不同(每个操作系统都需要自己的 JVM)。让我们记住其他编程语言中的开发是如何进行的。你开发一个程序,然后它的代码被编译成特定操作系统的机器代码,然后你就可以运行它。换句话说,你需要为每个系统编写不同版本的程序。而在Java中,由于双重代码处理(JVM代码字节的编译和处理),您可以享受跨平台的好处。我们一旦创建了代码,将其重新编译为字节码,将其传输到任何操作系统,本地 JVM 就会运行该代码。这就是Java的传奇属性——一次编写,随处运行请阅读“在幕后编译和执行 Java 应用程序面试问题及答案分析。 第 1 - 5 部分”一文了解更多相关内容。

7.什么是字节码?

正如我上面所说,编译器将 Java 代码转换为中间字节码(扩展名为 .java 的文件转换为扩展名为 .class 的文件)。字节码在很多方面与机器代码相似,只是它使用的一组指令不是来自真实处理器,而是来自虚拟处理器。此外,它可能包括侧重于 JIT 编译器的使用的部分,该编译器优化了程序运行所在的真实处理器的命令的执行。JIT编译,也称为即时编译,是一种通过在程序运行时将字节码编译成机器或其他格式来提高使用字节码的程序的性能的技术。您可能已经猜到,JVM 在运行字节码时使用 JIT 编译器。让我们看一个字节码示例:面试问题及答案分析。 第 1 - 6 部分不太可读,是吗?嗯,这不是给我们的指令,而是给 JVM 的指令。这是一篇文章,可以帮助您更好地理解这个问题。

8. JavaBean有什么特点?

JavaBeans是一个具有一定规则的Java类。以下是编写JavaBean的一些规则:
  1. 该类必须包含一个带有 public 访问修饰符的空(无参数)公共访问构造函数。这个构造函数使得创建此类的对象成为可能,而不会出现不必要的问题(这样就不会出现不必要的参数问题)。

  2. 类的内部字段是通过getset方法访问的,这应该是标准的。例如,如果字段是 name,则getNamesetName等。这反过来又允许各种工具(框架)自动确定和更新 beans 的内容,而不会出现复杂情况。

  3. 该类必须包含equals()方法hashCode()toString()的重写版本。

  4. 该类必须是可序列化的,即它必须具有标记接口 - Serialized 或实现Externalized接口。这是必要的,以便能够可靠地保存、存储和恢复 bean 的状态。

面试问题及答案分析。 第 1 - 7 部分您可以在本材料中阅读有关 JavaBean 类型的信息。

9. 什么是内存不足错误?

OutOfMemoryError是与 Java 虚拟机 (JVM) 操作相关的严重运行时错误之一。当 JVM 由于没有足够的可用内存且垃圾收集器无法分配更多内存而无法分配对象时调用。某些类型的 OutOfMemoryError
  • OutOfMemoryError: Java 堆空间- 由于内存不足,无法在 Java 堆上分配对象。该错误可能是由内存泄漏或默认堆大小对于当前应用程序来说不够大引起的。

  • OutOfMemoryError:超出GC Overhead limit - 由于堆中的数据量几乎装不下,垃圾收集器一直在运行,而Java程序运行速度非常慢,因此,垃圾收集器的开销限制超出范围并且应用程序因此错误而崩溃。

  • OutOfMemoryError:请求的数组大小超出 VM 限制- 指示应用程序尝试为大于堆大小的数组分配内存,这也可能是由于默认内存分配不足所致。

  • OutOfMemoryError: Metaspace — 堆已用完为元数据分配的空间(元数据是类和方法的指令)。

  • OutOfMemoryError:出于原因请求大小字节。交换空间不足- 尝试从堆分配内存时发生一些失败,因此堆中内存不足。

10.什么是堆栈跟踪?如何获得?

堆栈跟踪是应用程序中到目前为止已调用的类和方法的列表。您可以在应用程序中的特定点调用堆栈跟踪,如下所示:
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
这样,我们将获得按 LIFO 顺序排列的堆栈跟踪元素数组- 后进先出面试问题及答案分析。 第 1 - 8 部分在 Java 中,通常,当我们谈论堆栈跟踪时,我们指的是发生错误(或异常)时在控制台中显示的堆栈跟踪。您可以像这样获取异常的堆栈跟踪:
StackTraceElement[] stackTraceElements;
try{
                ...
} catch (Exception e) {
   stackTraceElements = e.getStackTrace();
}
好吧,如果我们正在讨论在控制台中输出异常堆栈跟踪:
try{
                ...
} catch (Exception e) {
  e.printStackTrace();
}
此外,如果我们遇到错误、未经检查的异常或检查的异常,我们不会处理这些异常,而只会转发,那么当应用程序崩溃时,我们将自动在控制台中收到异常的堆栈跟踪。控制台中堆栈跟踪异常的一个小示例:您可以在此处面试问题及答案分析。 第 1 - 9 部分阅读有关堆栈跟踪的更多信息。今天我们就来重点讨论这个问题...面试问题及答案分析。 第 1 - 10 部分
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION