Java基础常见知识、面试题总结 (上)
Java语言有哪些特点
-
简单易学;
-
面向对象(封装,继承,多态);
-
平台无关性( Java 虚拟机实现平台无关性);
-
支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持)(C++ 在2011年 c++11 的时候引用了多线程库 在windows linux macos 上都可以使用 以下语法来创4*5建线程、参考链接:http://www.cplusplus.com/reference/thread/thread/?kw=thread )
std::thread 、std::async -
可靠性、安全性、支持网络编程、(Java语言设计的初衷就是为简化网络编程设计的、因此Java语言不仅支持网络编程而且很方便)
-
编译与解释共存
🌈拓展:
“Write Once, Run Anywhere(一次编写,随处运行)”这句宣传口号,真心经典,流传了好多年!以至于,直到今天,依然有很多人觉得跨平台是 Java 语言最大的优势。实际上,跨平台已经不是 Java 最大的卖点了,各种 JDK 新特性也不是。目前市面上虚拟化技术已经非常成熟,比如你通过 Docker 就很容易实现跨平台了。在我看来,Java 强大的生态才是!
JVM ? JDK ? JRE ?
📌JVM:
-
Java虚拟机(JVM)、是运行Java字节码的虚拟机、JVM有针对不同系统的特定实现(Windows Linux MacOs)、目的是使用相同的字节码、它们都会有相同的结果。 字节码和不同的系统是JVM实现Java语言 “一次编译、随处运行”的关键所在。
-
JVM并不是只有一种的、只要满足JVM规范、每个公司、组织或者个人都有可以开发专属的JVM、就是我们平常接触的HotSpot VM 也仅仅 是JVM规范一种实现而已。
-
常见的JVM虚拟机:除了我们平时最常用的 HotSpot VM 外,还有 J9 VM、Zing VM、JRockit VM 等 JVM 。维基百科上就有常见 JVM 的对比:Comparison of Java virtual machinesopen in new window ,感兴趣的可以去看看。并且,你可以在 Java SE Specificationsopen in new window 上找到各个版本的 JDK 对应的 JVM 规范。
-
历史背景:
Sun公司在java1.0的时候发布了一款名为:Sun Classic VM 的Java虚拟机、它是世界上第一款商用的Java虚拟机、2000年JDK1.3版本发布的时候、HotSpot VM虚拟机成为了默认的虚拟机、延续至今;
-
JVM虚拟机 是一款软件、用来执行一系列虚拟计算指令。大体上虚拟机可以分为、系统虚拟机和程序虚拟机、大名鼎鼎的Visual Box 、VMWare 就是系统虚拟机、它们完全是对物理计算机的仿真、提供了一个可运行 操作系统的软件平台、程序虚拟机的典型代表就是Java虚拟机、他专门为执行单个计算机程序而设计、在Java虚拟机中执行的指令我们成为Java字节码指令、Java虚拟机拥有独力的运行机制、其运行的Java字节码未必由Java语言编译而成.JVM平台的各种语言可以共享Java虚拟机带来的 跨平台性、优秀的垃圾回收机制、可靠的即时编译器、可以说Java技术的核心就是Java虚拟机、因为所有的Java程序 都运行在Java虚拟机内部。
-
Java 虚拟机的特点:Java虚拟机就是二进制字节码的运行环境、负责装载字节码到其内部、解释和编译为对应的平台上的机器指令执行、每一条Java指令虚拟机规范都有详细的定义、怎么取操作数、怎么处理操作数、处理结果放在那里、等等、Java虚拟机的三大特征:一次编译随处运行、自动内存管理、自动垃圾回收机制。
-
JDK与JRE
JDK是Java开发工具包.Java Development Kit的英文缩写,它是功能最齐全的Java SDK 、它拥有JRE 所拥有的一起功能,还有Java编译工具javac和工具javadoc、 jdb。能够创建和编译程序。
什么是字节码? 为什么使用字节码?
📌 字节码
是一种二进制的文件、类似于机器指令。但是并不能在真机上运行,需要借助虚拟机,而虚拟机就可以理解为一种在计算机上模拟出来的一台CPU指令集为字节码的虚拟计算机。
📌 Java中的字节码
在Java种JVM可以理解的代码就叫做字节码(就是拓展名为.class的文件),它不面向任何特定的处理器,仅面向虚拟机,Java通过编译字节码的方式,在一定的程度上解决了 传统解释性语言效率低的问题。同时曲线救国的保留了传统解释性语言可移植性的特点。性能而言比比较 Go Rust C++ 还有提升的空间。
-
插一嘴
什么是编译型语言? 答: 1.代码编写完毕、直接打包成 对应各个OS的包、直接在OS运行. 2.代表:C、golang 、C++ 3.通俗点来说:在Windows环境下写的代码、c/c++/go 打包后拓展名为 .exe; windows下的软件拓展名也是.exe 双击直接运行在Dos窗口了。无需安装任何环境。 什么是解释型语言? 答: 1.代码编写完毕不需要编译、执行的时候通过语言的解释器进行翻译+执行 2.代表:Python、JavaScript、Ruby 3.通俗点来说就是 代码编写完毕 执行时,对应会存在一个解释器去翻译代码、像JavaScript中是运行在浏览器的、对应的解释器就是 浏览器内核 像 Chrome的V8、IE的Chakra、Safari的Jscore,用于翻译代码并执行。 Java属于那种? 答:Java属于 编译+解释 1.何为编译? Java需要通过javac命令 将.java 文件编译成 .class文件。 2.何为解释? 编译后的.class文件是无法直接在OS平台上运行的、需要借助Java的JVM环境。在JVM中进行逐行解释、逐行运行。因执行效率相对较慢。其中部分代码是经常需要被加载的、也称之为热代码。后JVM引用了 JIT技术(just-in-time compilation)技术、将热代码翻译成机器码后 保存下来。后期直接调用不在进行翻译。以提升部分效率。 JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT 预热等各方面的开销。JDK 支持分层编译和 AOT 协作使用。 为什么不直接使用AOT? 长话短说,这和 Java 语言的动态特性有千丝万缕的联系了。举个例子,CGLIB 动态代理使用的是 ASM 技术,而这种技术大致原理是运行时直接在内存中生成并加载修改后的字节码文件也就是 .class 文件,如果全部使用 AOT 提前编译,也就不能使用 ASM 技术了。为了支持类似的动态特性,所以选择使用 JIT 即时编译器。 Java 从源代码 到 运行的过程 如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)