「Java面试题精华集」Java基础知识篇(2022最新版)附PDF版

两个星期前,我和我的好朋友决定做一系列的 Java 知识点常见重要问题的小册。小册的标准就一个,那就是:取精华,取重点。每一本小册,我们都会充分关注我们所总结的知识点是否达到这个标准。

昨天晚上终于把 Java 基础部分的知识点肝完了,转换成 PDF 一共 43 页,后台回复:“面试突击” 即可免费获取下载地址。

然后还发了一个朋友圈,发了之后发现票圈真是还有好多人没睡,果然是程序猿本猿。大家注意身体啊!还嫌头发多么?哈哈哈!

1. Java 基本功

1.1. Java 入门(基础概念与常识)

1.1.1. Java 语言有哪些特点?

  1. 简单易学;
  2. 面向对象(封装,继承,多态);
  3. 平台无关性( Java 虚拟机实现平台无关性);
  4. 可靠性;
  5. 安全性;
  6. 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
  7. 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便);
  8. 编译与解释并存;
“修正(参见:issue#544):C++11 开始(2011 年的时候),C++就引入了多线程库,在 windows、linux、macos 都可以使用 std::threadstd::async来创建线程。参考链接: http://www.cplusplus.com/reference/thread/thread/?kw=thread

1.1.2. 关于 JVM JDK 和 JRE 最详细通俗的解答

1.1.2.1. JVM

Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。

什么是字节码?采用字节码的好处是什么?

“在 Java 中,JVM 可以理解的代码就叫做 字节码(即扩展名为  .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。

Java 程序从源代码到运行一般有下面 3 步:

Java程序运行过程

我们需要格外注意的是 .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT 编译器,而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言。

“HotSpot 采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。JVM 会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT 预热等各方面的开销。JDK 支持分层编译和 AOT 协作使用。但是 ,AOT 编译器的编译质量是肯定比不上 JIT 编译器的。

总结:

Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。

1.1.2.2. JDK 和 JRE

JDK 是 Java Development Kit,它是功能齐全的 Java SDK。它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序。

JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不能用于创建新程序。

如果你只是为了运行一下 Java 程序的话,那么你只需要安装 JRE 就可以了。如果你需要进行一些 Java 编程方面的工作,那么你就需要安装 JDK 了。但是,这不是绝对的。有时,即使您不打算在计算机上进行任何 Java 开发,仍然需要安装 JDK。例如,如果要使用 JSP 部署 Web 应用程序,那么从技术上讲,您只是在应用程序服务器中运行 Java 程序。那你为什么需要 JDK 呢?因为应用程序服务器会将 JSP 转换为 Java servlet,并且需要使用 JDK 来编译 servlet。

1.1.3. Oracle JDK 和 OpenJDK 的对比

可能在看这个问题之前很多人和我一样并没有接触和使用过 OpenJDK 。那么 Oracle 和 OpenJDK 之间是否存在重大差异?下面我通过收集到的一些资料,为你解答这个被很多人忽视的问题。

对于 Java 7,没什么关键的地方。OpenJDK 项目主要基于 Sun 捐赠的 HotSpot 源代码。此外,OpenJDK 被选为 Java 7 的参考实现,由 Oracle 工程师维护。关于 JVM,JDK,JRE 和 OpenJDK 之间的区别,Oracle 博客帖子在 2012 年有一个更详细的答案:

“问:OpenJDK 存储库中的源代码与用于构建 Oracle JDK 的代码之间有什么区别?
答:非常接近 - 我们的 Oracle JDK 版本构建过程基于 OpenJDK 7 构建,只添加了几个部分,例如部署代码,其中包括 Oracle 的 Java 插件和 Java WebStart 的实现,以及一些封闭的源代码派对组件,如图形光栅化器,一些开源的第三方组件,如 Rhino,以及一些零碎的东西,如附加文档或第三方字体。展望未来,我们的目的是开源 Oracle JDK 的所有部分,除了我们考虑商业功能的部分。

总结:

  1. Oracle JDK 大概每 6 个月发一次主要版本,而 OpenJDK 版本大概每三个月发布一次。但这不是固定的,我觉得了解这个没啥用处。详情参见:https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadence 。
  2. OpenJDK 是一个参考模型并且是完全开源的,而 Oracle JDK 是 OpenJDK 的一个实现,并不是完全开源的;
  3. Oracle JDK 比 OpenJDK 更稳定。OpenJDK 和 Oracle JDK 的代码几乎相同,但 Oracle JDK 有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择 Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用 OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到 Oracle JDK 就可以解决问题;
  4. 在响应性和 JVM 性能方面,Oracle JDK 与 OpenJDK 相比提供了更好的性能;
  5. Oracle JDK 不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本;
  6. Oracle JDK 根据二进制代码许可协议获得许可,而 OpenJDK 根据 GPL v2 许可获得许可。

1.1.4. Java 和 C++的区别?

我知道很多人没学过 C++,但是面试官就是没事喜欢拿咱们 Java 和 C++ 比呀!没办法!!!就算没学过 C++,也要记下来!

  • 都是面向对象的语言,都支持封装、继承和多态
  • Java 不提供指针来直接访问内存,程序内存更加安全
  • Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
  • Java 有自动内存管理机制,不需要程序员手动释放无用内存
  • 在 C 语言中,字符串或字符数组最后都会有一个额外的字符‘\0’来表示结束。但是,Java 语言中没有结束符这一概念。 这是一个值得深度思考的问题,具体原因推荐看这篇文章:https://blog.csdn.net/sszgg2006/article/details/49148189

1.1.5. 什么是 Java 程序的主类 应用程序和小程序的主类有何不同?

一个程序中可以有多个类,但只能有一个类是主类。在 Java 应用程序中,这个主类是指包含 main()方法的类。而在 Java 小程序中,这个主类是一个继承自系统类 JApplet 或 Applet 的子类。应用程序的主类不一定要求是 public 类,但小程序的主类要求必须是 public 类。主类是 Java 程序执行的入口点。

1.1.6. Java 应用程序与小程序之间有哪些差别?

简单说应用程序是从主线程启动(也就是 main() 方法)。applet 小程序没有 main() 方法,主要是嵌在浏览器页面上运行(调用init()或者run()来启动),嵌入浏览器这点跟 flash 的小游戏类似。

1.1.7. import java 和 javax 有什么区别?

刚开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展 API 包来使用。然而随着时间的推移,javax 逐渐地扩展成为 Java API 的组成部分。但是,将扩展从 javax 包移动到 java 包确实太麻烦了,最终会破坏一堆现有的代码。因此,最终决定 javax 包将成为标准 API 的一部分。

所以,实际上 java 和 javax 没有区别。这都是一个名字。

1.1.8. 为什么说 Java 语言“编译与解释并存”?

高级编程语言按照程序的执行方式分为编译型和解释型两种。简单来说,编译型语言是指编译器针对特定的操作系统将源代码一次性翻译成可被该平台执行的机器码;解释型语言是指解释器对源程序逐行解释成特定平台的机器码并立即执行。比如,你想阅读一本英文名著,你可以找一个英文翻译人员帮助你阅读, 有两种选择方式,你可以先等翻译人员将全本的英文名著(也就是源码)都翻译成汉语,再去阅读,也可以让翻译人员翻译一段,你在旁边阅读一段,慢慢把书读完。

Java 语言既具有编译型语言的特征,也具有解释型语言的特征,因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(*.class 文件),这种字节码必须由 Java 解释器来解释执行。因此,我们可以认为 Java 语言编译与解释并存。

1.2. Java 语法

1.2.1. 字符型常量和字符串常量的区别?

  1. 形式上: 字符常量是单引号引起的一个字符; 字符串常量是双引号引起的若干个字符
  2. 含义上: 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)
  3. 占内存大小 字符常量只占 2 个字节; 字符串常量占若干个字节 (注意:char 在 Java 中占两个字节)
“java 编程思想第四版:2.2.2 节

1.2.2. 关于注释?

Java 中的注释有三种:

  1. 单行注释
  2. 多行注释
  3. 文档注释。

在我们编写代码的时候,如果代码量比较少,我们自己或者团队其他成员还可以很轻易地看懂代码,但是当项目结构一旦复杂起来,我们就需要用到注释了。注释并不会执行,是我们程序员写给自己看的,注释是你的代码说明书,能够帮助看代码的人快速地理清代码之间的逻辑关系。因此,在写程序的时候随手加上注释是一个非常好的习惯。

《Clean Code》这本书明确指出:

代码的注释不是越详细越好。实际上好的代码本身就是注释,我们要尽量规范和美化自己的代码来减少不必要的注释。
若编程语言足够有表达力,就不需要注释,尽量通过代码来阐述。
举个例子:
去掉下面复杂的注释,只需要创建一个与注释所言同一事物的函数即可
// check to see if the employee is eligible for full benefits
if ((employee.falgs & HOURLY_FLAG) && (employee.age > 65))

应替换为
if (employee.isEligibleForFullBenefits())

1.2.3. 标识符和关键字的区别是什么?

在我们编写程序的时候,需要大量地为程序、类、变量、方法等取名字,于是就有了标识符,简单来说,标识符就是一个名字。但是有一些标识符,Java 语言已经赋予了其特殊的含义,只能用于特定的地方,这种特殊的标识符就是关键字。因此,关键字是被赋予特殊含义的标识符。比如,在我们的日常生活中 ,“警察局”这个名字已经被赋予了特殊的含义,所以如果你开一家店,店的名字不能叫“警察局”,“警察局”就是我们日常生活中的关键字。

1.2.4. Java中有哪些常见的关键字?

1.2.5. 自增自减运算符

在写代码的过程中,常见的一种情况是需要某个整数类型变量增加 1 或减少 1,Java 提供了一种特殊的运算符,用于这种表达式,叫做自增运算符(++)和自减运算符(--)。

++和--运算符可以放在操作数之前,也可以放在操作数之后,当运算符放在操作数之前时,先自增/减,再赋值;当运算符放在操作数之后时,先赋值,再自增/减。例如,当“b=++a”时,先自增(自己增加 1),再赋值(赋值给 b);当“b=a++”时,先赋值(赋值给 b),再自增(自己增加 1)。也就是,++a 输出的是 a+1 的值,a++输出的是 a 值。用一句口诀就是:“符号在前就先加/减,符号在后就后加/减”。

1.2.6. continue、break、和return的区别是什么?

在循环结构中,当循环条件不满足或者循环次数达到要求时,循环会正常结束。但是,有时候可能需要在循环的过程中,当发生了某种条件之后 ,提前终止循环,这就需要用到下面几个关键词:

  1. continue :指跳出当前的这一次循环,继续下一次循环。
  2. break :指跳出整个循环体,继续执行循环下面的语句。

return 用于跳出所在方法,结束该方法的运行。return 一般有两种用法:

  1. return; :直接使用 return 结束方法执行,用于没有返回值函数的方法
  2. return value; :return 一个特定值,用于有返回值函数的方法

1.2.7. Java泛型了解么?什么是类型擦除?介绍一下常用的通配符?

Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 您好,以下是Java基础面试题2022最新版汇总): 1. Java中的四种访问修饰符是什么?它们分别代表什么含义? 答:Java中的四种访问修饰符是public、protected、default和private。它们分别代表公共的、受保护的、默认的和私有的含义。 2. Java中的八种基本数据类型是什么? 答:Java中的八种基本数据类型是byte、short、int、long、float、double、char和boolean。 3. Java中的自动装箱和拆箱是什么? 答:Java中的自动装箱和拆箱是指将基本数据类型自动转换为对应的包装类类型,以及将包装类类型自动转换为对应的基本数据类型。 4. Java中的final关键字有哪些用途? 答:Java中的final关键字有三种用途:用于修饰变量,表示该变量的值不可改变;用于修饰方法,表示该方法不可被重写;用于修饰类,表示该类不可被继承。 5. Java中的抽象类和接口有什么区别? 答:Java中的抽象类和接口都不能被实例化,但是抽象类可以包含非抽象方法,而接口只能包含抽象方法。另外,一个类只能继承一个抽象类,但是可以实现多个接口。 6. Java中的多态是什么? 答:Java中的多态是指同一个方法可以根据不同的对象调用出不同的行为。它实现的方式有两种:重载和重写。 7. Java中的异常处理机制是什么? 答:Java中的异常处理机制是指通过try-catch-finally语句块来捕获和处理程序运行时可能出现的异常情况,保证程序的稳定性和可靠性。 8. Java中的线程是什么?如何创建线程? 答:Java中的线程是指程序执行的最小单位,它可以独立运行,也可以与其他线程共享资源。创建线程的方式有两种:继承Thread类和实现Runnable接口。 9. Java中的合框架有哪些?它们之间有什么区别? 答:Java中的合框架包括List、Set、Map和Queue等。它们之间的区别在于:List是有序的、可重复的合;Set是无序的、不可重复的合;Map是键值对的合;Queue是先进先出的队列。 10. Java中的反射是什么?有什么作用? 答:Java中的反射是指在程序运行时动态地获取类的信息,并可以在运行时操作类的属性和方法。它的作用在于:可以实现动态代理、动态生成代码、动态加载类等功能。 ### 回答2: Java是一种广泛使用的编程语言,它的应用覆盖多个领域,包括机器学习、大数据、企业级应用等。而Java开发人员也是当前市场上非常火热的职业之一。为了进入一家Java开发企业或者获取Java开发岗位,需要通过Java基础面试。 下面我将介绍Java基础面试题,并提供一些答案和解释: 1. 什么是Java? Java是一种面向对象的编程语言,被广泛应用于开发各种应用程序,包括Web应用程序、移动应用程序、桌面应用程序等。 2. 什么是面向对象编程? 面向对象编程是一种编程范型,它将程序分解为对象,每个对象都有自己的数据和方法,对象之间可以相互交互。面向对象编程通常具有封装、继承和多态等特性。 3. Java应用程序的基本结构是什么? Java应用程序的基本结构包括类定义,变量定义,方法定义和语句执行。 4. 什么是Java虚拟机? Java虚拟机是Java平台的核心组件之一,它提供了一个运行Java程序的环境。Java虚拟机可以在不同的操作系统上运行Java程序,实现了跨平台运行的目的。 5. 什么是Java语言的基本数据类型? Java语言的基本数据类型包括byte、short、int、long、float、double、boolean和char。 6. 如何声明一个变量? 在Java中,声明一个变量需要指定变量的类型和名称。例如,int count = 10; 7. 什么是包? 包是在Java中管理类和接口的一种方式。包可以将相关的类和接口组织在一起,以便更好地管理代码。 8. 什么是Java中的异常? 异常是在程序执行期间出现的错误,它包含了错误信息、错误类型和错误的上下文。 9. 什么是Java中的多线程? 多线程是Java中一种并发处理的方法,它允许程序同时执行多个任务。Java中的线程可以通过继承Thread类或实现Runnable接口来创建。 10. Java中的继承关系是什么? 继承是Java中一种对象之间的关系,它允许子类继承父类的属性和方法。子类可以通过继承父类来扩展自己的功能。 以上是常见的Java基础面试题,希望能够对Java开发者提供帮助。在面试过程中,还需要我们展示自己的编程能力和实际应用经验。只有掌握了扎实的Java基础、熟悉常见的应用场景、具备实际经验并且具备坚实的编程能力,才能获得Java开发岗位。 ### 回答3: Java作为目前最热门的编程语言之一,在面试中也是一个重点考察的领域。下面对于Java基础面试题进行汇总和解答。 1. Java常见的数据类型有哪些? 答:Java常见的数据类型有基本数据类型和引用数据类型两种。基本数据类型包括byte、short、int、long、float、double、boolean、char;引用数据类型包括类、数组、接口。 2. int和Integer有什么区别? 答:int是Java中的一种基本数据类型,使用时直接声明并赋值即可;而Integer是int的包装类型,是一个对象,需要通过new来进行初始化,也可以使用自动装箱和拆箱进行转换。 3. String和StringBuilder的区别? 答:String是一个不可变的类,一旦创建就不能修改,修改需要重新创建对象;StringBuilder是一个可变的类,可以通过append、insert等方法修改字符串,节省内存和时间。 4. 抽象类和接口的区别? 答:抽象类和接口都是用于描述行为的概念,但是抽象类更偏向于在类层次结构中描述一种抽象的类,它可以拥有抽象方法和具体实现方法,可以有构造函数,但不能被实例化;而接口更偏向于描述一种能力,只能包含抽象方法、常量和默认方法,不能有构造函数,需要实现接口才能使用。 5. 静态和非静态的区别? 答:静态属性或方法属于类,而非静态属性或方法属于实例,也就是说同一个类属性或方法,静态的只有一份,非静态每次实例化时都有自己的一份;静态变量在类的加载时初始化,公用一份内存,一旦被修改,则所有的对象都会共享该值;非静态变量在每次实例化时初始化,属于独立变量。 6. final关键字的作用? 答:final关键字可以修饰类、方法和变量,表示不可修改、不可继承或不可重写。final修饰的变量是一个常量,一旦初始化后就不能修改;final修饰的方法不能被子类重写;final修饰的类不能被继承。 7. try-catch-finally语句的应用? 答:try-catch-finally语句用于捕获程序中的异常,在try块中尝试执行一段可能会出现异常的代码,如果出现异常则会转到catch块中处理异常,最后无论是否出现异常都会执行finally块中的语句。finally块一般用于释放资源或进行清理操作,如关闭数据库、文件等。 8. 在Java中如何实现多线程? 答:Java中实现多线程有两种方式:继承Thread类和实现Runnable接口。继承Thread类需要重写run方法,而实现Runnable接口需要实现run方法。另外,还可以使用线程池、同步锁、信号量、线程等待等方式实现多线程。 9. 快速判断一个字符串是否是数字? 答:可以使用正则表达式或Java自带的API进行判断。正则表达式可以使用\d+匹配数字,Java自带的API可以使用try-catch捕获NumberFormatException异常来判断。 10. Java中的反射是什么? 答:Java中的反射是指程序在运行时可以动态获取和操控类的信息和对象的属性或方法,包括类的名称、属性和方法。可以通过反射来获取类的所有信息,包括私有的成员变量和方法,也可以在运行时创建对象、调用方法等。但是由于反射操作需要消耗一定的资源,因此不适合在频繁执行的代码中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值