概念常识
Java 语言有哪些特点(特性)?
- 面向对象
具有代码扩展,代码复用等功能,其三大核心概念:封装,继承,多态
面向对象是Java的核心中的核心,这不是八股文能简单概括的,详情见:深挖⾯向对象编程三⼤特性 --封装、继承、多态
- 支持多平台
在一个平台上编写的任何应用程序都可以轻松移植到另一个平台上, 是Java 虚拟机实现平台无关性
- 安全性
Java 被编译成字节码,由 Java 运行时环境解释。编译后会将所有的代码转换为字节码,人类无法读取。它使开发无病毒,无篡改的系统/应用成为可能
- 健壮性
Java 有强大的内存管理功能,在编译和运行时检查代码,它有助于消除错误
- 支持多线程
多线程是指允许一个应用程序同时存在两个或两个以上的线程,用于支持事务并发和多任务处理。
C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持
Java除了内置的多线程技术之外,还定义了一些类、方法等来建立和管理用户定义的多线程。
- 动态性
它具有适应不断变化的环境的能力,Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。它能够支持动态内存分配,从而减少了内存浪费,提高了应用程序的性能。
- 分布式
Java 提供的功能有助于创建分布式应用。使用远程方法调用(RMI),程序可以通过网络调用另一个程序的方法并获取输出。您可以通过从互联网上的任何计算机上调用方法来访问文件。这是革命性的一个特点,对于当今的互联网来说太重要了。
- 高性能
Java 最黑的科技就是字节码编程,Java 代码编译成的字节码可以轻松转换为本地机器代码。
如果内存足够,Java的速度是不慢的,它可以JIT 即时编译器在运行时直接将目标代码翻译成机器指令,翻译目标代码的速度与C/C++的性能差不了多少
- 简单易学
Java 会让你的工作变得更加轻松,使你把关注点放在主要业务逻辑上
尤其是Java语言没有指针,并提供了自动的垃圾回收机制,使得程序员不必为内存管理而担忧
JVM、JRE和JDK的关系
- JVM
Java虚拟机(JVM)
是运行Java字节码的虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,JVM在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够"一次编译,到处运行"的原因。因此Java语言可以实现跨平台
字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在
只要满足 JVM 规范,任何公司、组织或者个人都可以开发自己的专属 JVM
- JRE
JRE(Java Runtime Environment)是 Java 运行时环境。包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,但是系统缺省加载这个包,不能用于创建新程序
- JDK
Java Development Kit
是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等,它能够创建和编译程序。
Java是如何实现跨平台性的
跨平台是指,用Java
写的同一份代码可以 在不同的操作系统或平台上运行,而无需进行修改或重新编译。这种技术可以使开发人员在不同的平台上开发、测试和部署应用程序,从而提高效率和灵活性。
而导致跨平台困难的主要原因是由于每一个操作系统或平台支持不同的指令集,我们所写的代码经过编译之后,产生的机器代码只能适用于一个平台,换一个平台自然就不支持了。
Java实现跨平台性的关键在于JVM,也叫Java虚拟机,它是java运行时的环境,能够直接解释执行字节码,无需特定平台的转换或适配,另外每个平台都有一个对应的JVM虚拟机
Java编译器将Java源代码编译成字节码(.class文件),而不是依赖于某个平台的机器代码。然后JVM在目标平台上解释执行字节码,从而实现跨平台的能力,体现了“编写一次,到处运行”的理念。所以Java是编译和解释共存的语言
Java的跨平台性虽然提高了开发效率和程序的可移植性,但也带来一些性能上的挑战,特别是在不同操作系统上运行时
什么是字节码?
字节码:Java源代码编译后产生的文件(即扩展名为.class的文件)。
.java源代码是给人类读的,而.class字节码只面向JVM(Java虚拟机)
采用字节码的好处:
- Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效的(但和无需GC的语言 c、c++、rust等的运行效率还是有所差距)
- 由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
一般Java程序运行的流程:
Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行
为什么说 Java 语言是“编译与解释并存”?
由于计算机只看得懂0100011
机器码,而语言比如C语言,是给人看的。我们通过这些语言编写出来的代码,需要先转换成机器码,然后计算机才能去执行。
- 编译型 :先将源代码一次性转换成另一种相对来说更低级的语言(字节码,汇编,机器码…),计算机再去执行。常见的编译性语言有 C、C++、Go、Rust 等等。
注意这边的机器码 是代码对应的平台计算机的机器码
- 解释型 :解释器动态将代码逐句解释(interpret)为机器码(编译器自身的机器码)并运行(边解释边执行)。常见的解释性语言有 Python、JavaScript、PHP 等等。
为什么经常说java是解释性语言也是编译型语言?
JVM的类加载器首先加载字节码文件,然后通过解释器逐行解释执行,每次执行都需要加载、解析,速度慢,还有热点代码重复加载问题。
所以引进了JIT编译器(运行时编译),JIT完成一次编译后会将字节码对应的机器码保存下来,下次直接执行
解释和编译都只是程序从源码到运行时的一种动作,跟语言本身无关,所以我们无需过于纠结这个问题!
Oracle JDK 和OpenJDK的区别
这个大家理解一下历史即可,Java最早由SUN公司(Sun Microsystems,发起于美国斯坦福大学,SUN是Stanford University Network的缩写)发明,2006年SUN公司将Java开源,此时的JDK即为OpenJDK。
OpenJDK是Java SE的开源实现,他由SUN和Java社区提供支持,2009年Oracle收购了Sun公司,自此Java的维护方之一的SUN也变成了Oracle
大多数JDK都是在OpenJDK的基础上编写实现的,比如IBM J9, Azul Zulu, Azul Zing和Oracle JDK
。几乎现有的所有JDK都派生自OpenJDK,
他们之间不同的是许可证:
- OpenJDK根据许可证GPL v2发布。
- Oracle JDK根据Oracle二进制代码许可协议获得许可。
Oracle JDK比OpenJDK更稳定。在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能。OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的类和更稳定
OpenJDK是一个参考模型并且是完全开源的,但是Oracle JDK是OpenJDK的一个实现,并不是完全开源的
OracleJDK和OpenJDK这2者区别大家还是要记住的
Java 和 C++ 的区别?
Java和C++都是面向对象的语言,都支持封装、继承和多态
,但是它们还是有挺多不相同:
- Java不提供指针来直接访问内存,程序内存更加安全
- Java的类是单继承的,
C++
支持多重继承;虽然Java
的类不可以多继承,但是接口可以多继承 - Java有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存
- Java不提供指针来直接访问内存,程序内存更加安全
什么是JIT?
JIT是just in time
的缩写,也就是即时编译。通过JIT技术,能够做到Java程序执行速度的加速。
Java通过编译器javac先将源程序编译成与平台无关的Java字节码文件(.class),再由JVM解释执行字节码文件,从而做到平台无关。 但是有利必有弊,对字节码的解释执行过程实质为:JVM先将字节码翻译为对应的机器指令,然后执行机器指令。很显然,这样经过解释执行,其执行速度必然不如直接执行二进制字节码文件
而为了提高执行速度,便引入了JIT技术。当JVM发现某个方法或代码块运行特别频繁的时候,就会认为这是热点代码Hot Spot Code
。然后JIT会把部分“热点代码”编译成本地机器相关的机器码,并进行优化,然后再把编译后的机器码缓存起来,以备下次使用。