2020Java高频面试题--Java知识点汇总

时间:2022-07-28
本文章向大家介绍2020Java高频面试题--Java知识点汇总,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Java高频面试题

1. JDK和JRE有什么区别?

  • JDK:Java Development Kit的简称,Java开发工具包,它提供了Java程序的开发环境和运行环境,同时包括编译Java程序的编译器和调试器。
  • JRE:Java Runtime Environment的简称,Java运行环境,JRE提供Java程序运行所需的环境(运行库和JVM,不包括编译器),注:JDK工具包括JRE。

2. 什么是Java Virtual Machine(JVM)?

Java Virtual Machine(JVM)是一个抽象的计算机,能够执行Java字节码。能针对不同的软件和硬件提供不同的JVM。因此JVM是平台独立的,JVM在平台上负责执行指令、字节码加载、检查和执行,同时还要管理数据、内存和寄存器。

Java 编译器将 Java 程序编译成虚拟机能够识别的二进制代码,这种代码称为字节码(Bytecode)。字节码就是虚拟机的机器指令,它与平台无关,有统一的格式,不依赖于具体的硬件环境,只运行在 JVM 上。JVM 在执行字节码文件时,把字节码解释成具体的机器指令执行。

Java 程序可以经解释器得到字节码,所生成的字节码经过精心设计,并进行优化,提高了运行速度。现在的 Java 版本中又加入了即时编译功能(just-in-time 编译器,简称 JIT 编译器),编译器将字节码转换成本机的机器代码,然后能够以较高速度执行,使得执行效率大幅度提高,基本达到了编译语言的水平。

3. JVM分配哪些不同类型的内存区域?

在Java中,JVM将内存分配给不同的进程,方法和对象。 JVM分配的一些内存区域是:

  1. 类加载器:在JVM中用来加载类文件
  2. 类(方法)区:它存储每个类的结构,例如运行时常量池,字段和方法数据以及方法代码。
  3. 堆:堆创建了一个运行时,它包含在其中分配对象的运行时数据区域。
  4. 栈:栈在运行时存储局部变量和部分结果。 它还有助于方法调用和返回值。 每个线程在创建线程时都会创建一个私有JVM栈。
  5. 程序计数寄存器:该存储区包含当前正在执行的Java虚拟机指令的地址。
  6. 本地方法栈:该区域保留用于应用程序中使用的所有本机方法。

4. 什么是JIT?

即时编译器(Just In Time,也称为JIT编译器)用于提高Java的性能。 默认情况下启用。 它是在执行时(而不是更早)完成的。 Java通过将JIT编译器包含在JVM中来普及其使用。

5. Java平台与其他平台有何不同?

Java是与平台无关的语言。 Java编译器将Java代码转换为可由JVM解释的字节代码。 JVM为世界上几乎所有流行的平台编写。

Java字节码可以相同的方式在任何受支持的平台上运行。 与其他语言一样,需要为特定平台编译的库才能运行。

6. 为什么说Java是“write once and run anywhere”的语言?

你可以在Windows平台编写Java代码,同时在Windows上编译它。在Windows上编写的类和jar文件能够运行在Unix环境下。所以Java是真正的平台无关的语言。

所有这些可移植性的背后是Java字节码。 Java编译器生成的字节码可以由任何JVM解释。 因此,用Java编写程序并期望它们可以在任何平台上运行变得容易得多。 Java编译器javac编译Java代码,而JVM java运行该代码。

javac HelloWorld.java
java HelloWorld

7. Java中的类加载器是怎么工作的?

在Java中,ClassLoader是用于在JVM中加载文件的类。 ClassLoader从其物理文件位置加载文件,例如 文件系统,网络位置等

Java中有三种主要的类加载器:

  1. Bootstrap ClassLoader。第一种类加载器,从rt.jar文件中加载类。
  2. Extension ClassLoader。从jre/lib/ext等位置加载类文件。
  3. Application ClassLoader。这一种取决于 CLASSPATH,从该位置找到类文件。如果你指定了CLASSPATHjars,那么类加载器就会加载它们。

8. 你认为用于main方法的“ main”是Java中的关键字吗?

不,main只是方法的名称。 一个类文件中可以有多个具有相同名称main的方法。 它不是Java中的关键字。

9. 我们可以将main方法写为public void static而不是public static void吗?

不,你不能这样写。 任何方法都必须首先指定修饰符,然后再指定返回值。 修饰符的顺序可以更改。 我们可以编写static public void main(),而不是public static void main()

10.在Java中,如果我们不为局部变量指定任何值,那么局部变量的默认值是什么?

Java不会使用任何默认值初始化局部变量。 因此,这些变量默认情况下将为null。

11.假设我们在不传递任何参数的情况下运行Java类。 Main方法中参数的String数组的值是什么?

默认情况下,Java中参数的String数组的值为空。 不为空。

12.Java中的字节和字符数据类型有什么区别?

byte和char都是Java中的数字数据类型。 它们用于表示特定范围内的数字。 它们之间的主要区别是字节可以存储原始二进制数据,而char则可以存储字符或文本数据。

char的用法是 char ch ='x';

字节值的范围是-128至127。

一个字节由8位组成。 但是一个char由16位组成。 因此,它相当于2个字节。