Bootstrap

Java基础常见面试题学习1

1、JVM vs JDK vs JRE

①Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的JVM实现是Java语言“一次编译,随处可以运行”的关键所在。JVM并不是只有一种!只要满足JVM规范,每个公司、组织或者个人都可以开发属于自己的专属JVM。

速记:JVM-Java虚拟机-运行Java字节码-不同系统相同字节码相同结果-JVM不只有一个

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

速记:JDK-功能齐全JavaSDK-能够创建和编译程序

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

速记:JRE-Java运行时环境-不能创建程序

拓展:如果只是运行Java程序,安装JRE即可,如果需要Java编程方面的工作,则需要JDK。但这不是绝对的,当要使用JSP部署Web应用程序时,从技术上讲只是在应用程序服务器中运行Java程序,但应用程序服务器会将JSP转换为Java servlet,并且需要使用JDK来编译servlet。

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

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

Java程序从源代码到运行的过程:.java->javac编译->.class->解释器&JIT->机器码

注:在 .class->机器码 这一步中,JVM类加载器先加载字节码文件,然后通过解释器逐行解释执行,这种方式效率低,而且有些方法和代码块是经常需要被调用(即热点代码),所以引进了JIT编译器,JIT属于运行时编译。当JIT编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。这也解释了为什么Java是编译与解释共存的语言。

速记:字节码-JVM能理解的代码-.class文件-不面向处理机只面向虚拟机-解决传统解释型语言效率低但保留其可移植性-好处为Java程序无需重新编译便可在不同操作系统的计算机上运行

Java是编译与解释共存的语言-JIT运行时编译-JIT完成第一次编译后保留字节码对应的机器码

3、为什么不全部使用AOT(编译器)呢?

JDK支持分层编译和AOT协作使用,AOT可以提前编译节省启动时间。举个例子:CGLIB动态代理使用的是ASM技术,这种技术原理是运行时直接在内存中生成并加载修改后的字节码文件,如果全部使用AOT提前编译,就不能使用ASM技术。为了支持Java语言的动态特性,所以选择使用JIT即即时编译器。

速记:不用AOT-为了支持Java语言的动态特性

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

高级编程语言按程序的执行方式可分为两类:

①编译型:编译型语言会通过编译器将源代码一次性翻译成可被该平台执行的机器码。一般情况下,编译语言的执行速度比较快,开发效率比较低。常见的编译性语言有C、C++、Go等。

②解释型:解释型语言会通过解释器一句一句的将代码解释为机器代码后再执行。解释型语言开发效率比较快,执行速度比较慢。常见的解释型语言有Python、JavaScript、PHP等。

Java语言既有编译型语言的特征,也具有解释型语言的特征。因为Java程序要经过先编译,后解释两个步骤,由Java编写的程序需要先经过编译步骤,生成字节码,这种字节码必须由Java解释器来解释执行。

速记:Java语言“编译与解释”并存-具有两种特性-先编译成字节码再解释为机器码

编译型语言-生成目标代码-速度快效率低;解释型语言-一句一句-不生成目标代码-速度慢效率高

5、Oracle JDK vs Open JDK

①Open JDK存储库中的源代码与用于构建Oracle JDK的代码非常接近,Oracle JDK版本的构建过程是基于Open JDK7构建的,只添加了几个部分。

②Oracle JDK大概6个月发布一次版本,而Open JDK大概三个月发布一次版本,因此Oracle JDK相对更稳定。

③Open JDK是一个参考模型并且完全开源,而Oracle JDK是Open JDK的一个实现,并不是完全开源。

④在响应性和JVM性能方面,Oracle JDK更好

⑤Oracle JDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本

⑥Oracle JDK使用BCL/OTN协议获得许可,而OpenJDK根据GPL v2许可获取许可。

速记:Oracle JDK基于Open JDK7构建-Oracle JDK更稳定,性能更好-Open JDK为参考模型并且完全开源-Oracle JDK不会为新发布版本提供长期支持

6、Java语言关键字有哪些?

①访问控制:private,protected,public...

②类,方法和变量修饰符:abstract,class,extends,final,implements,interface,native,new,static,strictfp,synchronized,transient,volatile,enum...

③程序控制:break,continue,return,do,while,if,else,for,instanceof,switch,case,default,assert...

④错误处理:try,catch,throw,throws,finally...

⑤包相关:import,package...

⑥基本类型:boolean,byte,int,short,long,double,float,char

⑦变量引用:super,this,void

⑧保留字:goto,const

注:default很特殊,属于程序控制、类,方法和变量修饰符、访问控制三种

--在程序控制中,当switch匹配不到任何情况,使用default编写默认匹配

--在类,方法和变量修饰符中,从JDK8开始有默认方法,用default来定义

--在访问控制中,如果一个方法前没有任何修饰符,默认有一个修饰符default,但是这个修饰符加上就会报错

注意:虽然true,false和null看起来像关键字但它们是字面量,同时也不能用作标识符。

;