31道Java核⼼⾯试题,⼀次性打包送给你
先看再点赞,给⾃⼰⼀点思考的时间,微信搜索【沉默王⼆】关注这个靠才华苟且的程序员。本⽂GitHub已收录,⾥⾯还有⼀线⼤⼚整
理的⾯试题,以及我的系列⽂章。
⼆哥,你好,找⼯作找了仨⽉,还没有找到,很焦虑,我该怎么办呢?你那有没有Java⽅⾯的⾯试题可以分享⼀波啊?
以上是读者⽥⽥给我发的私信,看完后于我⼼有戚戚焉啊,最近境况确实不容乐观,并⾮是个⼈的原因造成的。那,既然需要
⾯试题,⼆哥就义不容辞,必须得准备⼀波。
这次我花了⼀周的时间,准备了31道Java核⼼⾯试题,希望能够帮助到⽥⽥,以及其他和⽥⽥类似情况的读者朋友。
(后续我打算再花⼀周时间,更新第⼆波,同样有31道,敬请期待)
01、请说出Java14版本中更新的重要功能
Java14发布于2020年3⽉17⽇,更新的重要功能有:
switch表达式
instanceo离开英语 f增强表达式,预览功能
⽂本块,第⼆次预览
Records,预览功能
刚好我之前写过⼀篇⽂章,关于Java14的开箱体验,很⾹,读者朋友需要的话,可以点下⾯的链接看⼀看。
02、请说出Java13版本中更新的重要功能
Java13发布于2019年9⽉17⽇,更新的重要功能有:
⽂本块,预览功能
switch表达式,预览功能
JavaSocket重新实现
eSystem()⽅法
⽀持Unicode12.1
可伸缩、低延迟的垃圾收集器改进,⽤于返回未使⽤的内存
03、请说出Java12版本中更新的重要功能
Java12发布于2019年3⽉19⽇,更新的重要功能有:
JVM更新
ch()⽅法
紧凑型数字格式
String类新增了⼀些⽅法,⽐如说indent()
04、请说出Java11版本中更新的重要功能
Java11是继Java8之后的第⼆个商⽤版本,如果你下载的是OracleJDK,则需要进⾏付费;如果想继续使⽤免费版
本,需要下载OpenJDK。
OracleJDK中会有⼀些OpenJDK没有的、商⽤闭源的功能。
Java11更新的重要功能有:
可以直接使⽤java命令运⾏Java程序,源代码将会隐式编译和运⾏。
String类新增了⼀些⽅法,⽐如说isBlank()、lines()、strip()等等。
Files类新增了两个读写⽅法,readString()和writeString()。
可以在Lambda表达式中使⽤var作为变量类型。
05、请说出Java10版本中更新的重要功能
Java10更新的重要功能有:
局部变量类型推断,举个例⼦,varlist=newArrayList();,可以使⽤var来作为变量类型,Java编译器知道list的类型为
字符串的ArrayList。
增强。
提供了⼀组默认的根证书颁发机构(CA)。
06、请说出Java9版本中更新的重要功能
Java9更新的重要功能有:
模块系统
不可变的List、Set、Map的⼯⼚⽅法
接⼝中可以有私有⽅法
垃圾收集器改进
07、请说出Java8版本中更新的重要功能
Java8发布于2014年3⽉份,可以说是Java6之后最重要的版本更新,深受开发者的喜爱。
函数式编程和
JavaDateTimeAPI
中可以使⽤默认⽅法和静态⽅法
我强烈建议点开上⾯的链接阅读以下,以正确理解这些概念。
08、请说出Java⾯向对象编程中的⼀些重要概念
封装
多态
09、Java声称的平台独⽴性指的是什么?
常见的操作系统有Windows、Linux、OS-X,那么平台独⽴性意味着我们可以在任何操作系统中运⾏相同源代码的Java程
序,⽐如说我们可以在Windows上编写Java程序,然后在Linux上运⾏它。
10、什么是JVM?
JVM(JavaVirtualMachine)俗称Java虚拟机。之所以称为虚拟机,是因为它实际上并不存在。它提供了⼀种运⾏环
境,可供Java字节码在上⾯运⾏。
JVM提供了以下操作:
加载字节码
验证字节码
执⾏字节码
提供运⾏时环境
JVM定义了以下内容:
存储区
类⽂件格式
寄存器组
垃圾回收堆
致命错误报告等
我们来尝试理解⼀下JVM的内部结构,它包含了类加载器(ClassLoader)、运⾏时数据区(RuntimeDataAreas)和
执⾏引擎(ExcutionEngine)。
1)类加载器
类加载器是JVM的⼀个⼦系统,⽤于加载类⽂件。每当我们运⾏⼀个Java程序,它都会由类加载器⾸先加载。Java中有
三个内置的类加载器:
启动类加载器(BootstrapClass-Loader),加载jre/lib包下⾯的jar⽂件,⽐如说常见的(包含了Java标
准库下的所有类⽂件,⽐如说包下的类,包下的类,包下的类,包下的类,java.
sql包下的类)。
扩展类加载器(ExtensionorExtClass-Loader),加载jre/lib/ext包下⾯的jar⽂件。
应⽤类加载器(ApplicationorAppClas-Loader),根据程序的类路径(classpath)来加载Java类。
⼀般来说,Java程序员并不需要直接同类加载器进⾏交互。JVM默认的⾏为就已经⾜够满⾜⼤多数情况的需求了。不过,如
果遇到了需要和类加载器进⾏交互的情况,⽽对类加载器的机制⼜不是很了解的话,就不得不花⼤量的时间去调试
ClassNotFoundException和NoClassDefFoundError等异常。
对于任意⼀个类,都需要由它的类加载器和这个类本⾝⼀同确定其在JVM中的唯⼀性。也就是说,如果两个类的加载器不
同,即使两个类来源于同⼀个字节码⽂件,那这两个类就必定不相等(⽐如两个类的Class对象不equals)。
是不是有点晕,来来来,通过⼀段简单的代码了解下。
publicclassTest{
publicstaticvoidmain(String[]args){
ClassLoaderloader=ssLoader();
while(loader!=null){
n(ng());
loader=ent();
}
}
}
每个Java类都维护着⼀个指向定义它的类加载器的引⽤大叫英文 ,通过类名.ssLoader()可以获取到此引⽤;然后通过l
ent()可以获取类加载器的上层类加载器。
上⾯这段代码的输出结果如下:
er$AppClassLoader@18b4aac2
er$ExtClassLoader@4617c264
第⼀⾏输出为Test的类加载器,即应⽤类加载器,它是er$AppClassLoader类的实例;第⼆⾏输出为扩展
类加载器,是er$ExtClassLoader类的实例。那启动类加载器呢?
按理说,扩展类加载器的上层类加载器是启动类加载器,但在我这个版本的JDK中,扩展类加载器的getParent()返回nul
l。所以没有输出。
2)运⾏时数据区
运⾏时数据区⼜包含以下内容。
PC寄存器(PCRegister),也叫程序计数器(ProgramCounterRegister),是⼀块较⼩的内存空间,它的作⽤可
以看做是当前线程所执⾏的字节码的信号指⽰器。
JVM栈(JavaVirtualMachineStack),与PC寄存器⼀样,JVM栈也是线程私有的。每⼀个JVM线程都有⾃⼰
的JVM栈,这个栈与线程同时创建,它的⽣命周期与线程相同。
本地⽅法栈(NativeMethodStack),JVM可能会使⽤到传统的栈来⽀持Native⽅法(使⽤Java语⾔以外的其它
语⾔[C语⾔]编写的⽅法)的执⾏,这个栈就是本地⽅法栈。
堆(Heap),在JVM中,堆是可供各条线程共享的运⾏时内存区域,也是供所有类实例和数据对象分配内存的区域。
⽅法区(Methodarea),在JVM中,被加载类型的信息都保存在⽅法区中。包括类型信息(TypeInformation)和
⽅法列表(MethodTables)。⽅法区是所有线程共享的,所以访问⽅法区信息的⽅法必须是线程安全的。
运⾏时常量池(RuntimeConstantPool),运⾏时常量池是每⼀个类或接⼝的常量池在运⾏时的表现形式,它包括了
编译器可知的数值字⾯量,以及运⾏期解析后才能获得的⽅法或字段的引⽤。简⽽⾔之,当⼀个⽅法或者变量被引⽤
时,JVM通过运⾏时常量区来查找⽅法或者变量在内存⾥的实际地址。
3)执⾏引擎
执⾏引擎包含了:
解释器:读取字节码流,然后执⾏指令。因为它⼀条⼀条地解释和执⾏指令,所以它可以很快地解释字节码,但是执⾏起
来会⽐较慢。
即时(Just-In-Time,JIT)编译器:即时编译器⽤来弥补解释器的缺点,提⾼性能。执⾏引擎⾸先按照解释执⾏的⽅式来
执⾏,然后在合适的时候,即时编译器把整段字节码编译成本地代码。然后,执⾏引擎就没有必要再去解释执⾏⽅法了,
它可以直接通过本地代码去执⾏。执⾏本地代码⽐⼀条⼀条进⾏解释执⾏的速度快很多。编译后的代码可以执⾏的很快,
因为本地代码是保存在缓存⾥的。
11、JDK和JVM有什么区别?
JDK是JavaDevelopmentKit的⾸字母缩写,是提供给Java开发⼈员的软件环境,包含JRE和⼀组开发⼯具。可分为
以下版本:
标准版(⼤多数开发⼈员⽤的就是这个)
企业版
微型版
JDK包含了⼀个私有的JVM和⼀些其他资源,⽐如说编译器(javac命令)、解释器(java命令)等,帮助Java程序员
完成开发⼯作。
12、JVM和JRE有什么区别?
JavaRuntimeEnvironment(JRE)是JVM的实现。JRE由JVM和Java⼆进制⽂件以及其他类组成,可以执⾏任何
程序。JRE不包含Java编译器,调试器等任何开发⼯具。
13、哪个类是所有类的超类?
是所有Java类的超类,我们不需要继承它,因为是隐式继承的。
14、为什么Java不⽀持多重继承?
如果有两个类共同继承(extends)⼀个有特定⽅法的⽗类,那么该⽅法会被两个⼦类重写。然后,如果你决定同时继承这两
个⼦类,那么在你调⽤该重写⽅法时,编译器不能识别你要调⽤哪个⼦类的⽅法。这也正是著名的菱形问题,见下图。
ClassC同时继承了ClassA和ClassB,ClassC的对象在调⽤ClassA和ClassB中重载的⽅法时,就不知道该调⽤
ClassA的⽅法,还是ClassB的⽅法。
15、为什么Java不是纯粹的⾯向对象编程语⾔?
之所以不能说Java是纯粹的⾯向对象编程语⾔,是因为Java⽀持基本数据类型,⽐如说int、short、long、double
等,尽管它们有⾃⼰的包装器类型,但它们的确不能算是对象。
16、path和classpath之间有什么区别?
path是操作系统⽤来查找可执⾏⽂件的环境变量,我的电脑上就定义了下图这些path变量,⽐如Java和Maven的。
classpath是针对Java⽽⾔的,⽤于指定Java虚拟机载⼊的字节码⽂件路径。
17、Java中`main()`⽅法的重要性是什么?
每个程序都需要⼀个⼊⼝,对于Java程序来说,⼊⼝就是main⽅法。
publicstaticvoidmain(String[]args){}
public关键字是另外⼀个访问修饰符,除了可以声明⽅法和变量(所有类可见),还可以声明类。main()⽅法必须声明
为public。
static关键字表⽰该变量或⽅法是静态变量或静态⽅法,可以直接通过类访问,不需要实例化对象来访问。
void关键字⽤于指定⽅法没有返回值。
另外,main关键字为⽅法的名字,Java虚拟机在执⾏程序时会寻找这个标识符;args为main()⽅法的参数名,它的类型
为⼀个String数组,也就是说,在使⽤java命令执⾏程序的玩雪的作文 时候,可以给main()⽅法传递字符串数组作为参数。
javaHelloWorld沉默王⼆沉默王三
javac命令⽤来编译程序,java命令⽤来执⾏程序,HelloWorld为这段程序的类名,沉默王⼆和沉默王三为字符串数组,中
间通过空格隔开,然后就可以在main()⽅法中通过args[0]和args[1]获取传递的参数值了。
publicclassHelloWorld{
publicstaticvoidmain(String[]args){
if("沉默王⼆".equals(args[0])){
}
if("沉默王三".equals(args[1])){
}
}
}
main()⽅法的写法并不是唯⼀的,还有其他⼏种变体,尽管它们可能并不常见,可以简单来了解⼀下。
第⼆种,把⽅括号[]往args靠近⽽不是String靠近:
publicstaticvoidmain(String[]args){}
第三种,把⽅括号[]放在args的右侧:
publicstaticvoidmain(Stringargs[]){}
第四种,还可以把数组形式换成可变参数的形式:
args){}
第五种,在main()⽅法上添加另外⼀个修饰符strictfp,⽤于强调在处理浮点数时的兼容性:
publicstrictfpstaticvoidmain(String[]args){}
也可以在main()⽅法上添加final关键字或者synchronized关键字。
第六种,还可以为args参数添加final关键字:
publicstaticvoidmain(finalString[]args){}
第七种,最复杂的⼀种,所有可以添加的关键字统统添加上:
finalstaticsynchronizedstrictfpvoidmain(finalString[]args){}
当然了,并不需要为了装逼特意把main()⽅法写成上⾯提到的这些形式,使⽤IDE提供的默认形式就可以了。
18、Java的重写(Override)和重载(Overload)有什么区别?
先来看⼀段重写的代码吧。
classLaoWang{
publicvoidwrite(){
n("⽼王写了⼀本《基督⼭伯爵》");
}
}
publicclassXiaoWangextendsLaoWang{
@Override
publicvoidwrite(){
n("⼩王写了⼀本《茶花⼥》");
}
}
重写的两个⽅法名相同,⽅法参数的个数也相同;不过⼀个⽅法在⽗类中,另外⼀个在⼦类中。就好像⽗类LaoWang有⼀个
write()⽅法(⽆参),⽅法体是写⼀本《基督⼭伯爵》;⼦类XiaoWang重写了⽗类的write()⽅法(⽆参),但⽅法体
是写⼀本《茶花⼥》。
来写⼀段测试代码。
publicclassOverridingTest{
publicstaticvoidmain(String[]args){
LaoWangwang=newXiaoWang();
();
}
}
⼤家猜结果是什么?
⼩王写了⼀本《茶花⼥》
在上⾯的代码中,们声明了⼀个类型为LaoWang的变量wang。在编译期间,编译器会检查LaoWang类是否包含了writ
e()⽅法,发现LaoWang类有,于是编译通过。在运⾏期间,new了⼀个XiaoWang对象,并将曹操简介资料 其赋值给wang,此时
Java虚拟机知道wang引⽤的是XiaoWang对象,所以调⽤的是⼦类XiaoWang中的write()⽅法⽽不是⽗类
LaoWang中的write()⽅法,因此输出结果为“⼩王写了⼀本《茶花⼥》”。
再来看⼀段重载的代码吧。
classLaoWang{
publicvoidread(){
n("⽼王读了⼀本《Web全栈开发进阶之路》");
}
publicvoidread(Stringbookname){
n("⽼王读了⼀本《"+bookname+"》");
}
}
重载的两个⽅法名相同,但⽅法参数的个数不同,另外也不涉及到继承,两个⽅法在同⼀个类中。就好像类LaoWang有两个
⽅法,名字都是read(),但⼀个有参数(书名),另外⼀个没有(只能读写死的⼀本书)。
来写⼀段测试代码。
publicclassOverloadingTest{
publicstaticvoidmain(String[]args){
LaoWangwang=newLaoWang感恩图片带字唯美图片 ();
();
("⾦瓶");
}
}
这结果就不⽤猜了。变量wang的类型为LaoWang,流行音乐 ()调⽤的是⽆参的read()⽅法,因此先输出“⽼王读了
⼀本《Web全栈开发进阶之路》”;("⾦瓶")调⽤的是有参的read(bookname)⽅法,因此后输出“⽼王读了⼀本
《⾦瓶》”。在编译期间,编译器就知道这两个read()⽅法时不同的,因为它们的⽅法签名(=⽅法名称+⽅法参数)不同。
简单的来总结⼀下:
1)编译器⽆法决定调⽤哪个重写的⽅法,因为只从变量的类型上是⽆法做出判断的,要在运⾏时才能决定;但编译器可以明确
地知道该调⽤哪个重载的⽅法,因为引⽤类型是确定的,参数个数决定了该调⽤哪个⽅法。
2)多态针对的是重写,⽽不是重载。
如果在⼀个类中有多个相同名字的⽅法,但参数不同,则称为⽅法重载。
⽗类中有⼀个⽅法,⼦类中有另外⼀个和它有相同签名(⽅法名相同,参数相同、修饰符相同)的⽅法时,则称为⽅法重
写。⼦类在重写⽗类⽅法的时候可以加⼀个@Override注解。
19、`main()`⽅法可以重载吗?
可以,⼀个类中可以有多个名称为“main”的⽅法:
publicclassMainTest{
publicstaticvoidmain(String[]args){
n("main(String[]args)");
}
publicstaticvoidmain(String[]args,Stringarg){
n("(String[]args,Stringarg");
}
}
但该类在运⾏的时候,只会找到⼀个⼊⼝,即publicstaticvoidmain(String[]args)。
20、⼀个Java源⽂件中有多个public类吗?
⼀个Java源⽂件中不能有多个public类。
21、什么是Java的package(包)?
在Java中,我们使⽤package(包)对相关的类、接⼝和⼦包进⾏分组。这样做的好处有:
使相关类型更容易查找
避免命名冲突,⽐如说和不同
通过包和访问权限控制符来限定类的可见性
可以使⽤package关键字来定义⼀个包名,需要注意的是,这⾏代码必须处于⼀个类中的第⼀⾏。强烈建议在包中声明类,
不要缺省,否则就失去了包结构的带来的好处。
包的命名应该遵守以下规则:
应该全部是⼩写字母
可以包含多个单词,单词之间使⽤“.”连接,⽐如说
名称由公司名或者组织名确定,采⽤倒序的⽅式,⽐如说,我个⼈博客的域名是,所以我创建的包名是就
是。
每个包或者⼦包都在磁盘上有⾃⼰的⽬录结构,如果Java⽂件时在包下,那么该⽂件所在的⽬录结构就
应该是com->itwanger->xxxx。
默认情况下,包是默认导⼊的,我们不需要显式地导⼊该包下的任何类。
;
publicclassPackageTest{
publicstaticvoidmain(String[]args){
ng(true);
}
}
Boolean类属于包,当使⽤它的时候并不需要显式导⼊。
22、什么是访问权限修饰符?
访问权限修饰符对于Java来说,⾮常重要,⽬前共有四种:public、private、protected和default(缺省)。
⼀个类只能使⽤public或者default修饰,public修饰的类你之前已经见到过了,现在我来定义⼀个缺省权限修饰符的类
给你欣赏⼀下。
classDog{
}
哈哈,其实也没啥可以欣赏的。缺省意味着这个类可以被同⼀个包下的其他类进⾏访问;⽽public意味着这个类可以被所有
包下的类进⾏访问。
假如硬要通过private和protected来修饰类的话,编译器会⽣⽓的,它不同意。
private可以⽤来修饰类的构造⽅法、字段和⽅法,只能被当前类进⾏访问。protected也可以⽤来修饰类的构造⽅法、字段
和⽅法,但它的权限范围更宽⼀些,可以被同⼀个包中的类进⾏访问,或者当前类的⼦类。
可以通过下⾯这张图来对⽐⼀下四个权限修饰符之间的差别:
同⼀个类中,不管是哪种权限修饰符,都可以访问;
同⼀个包下,private修饰的⽆法访问;
⼦类可以访问public和protected修饰的;
public修饰符⾯向世界,哈哈,可以被所有的地⽅访问到。
23、什么是final关键字?
final关键字修饰类的时候,表⽰该类⽆法被继承。⽐如,String类就是final的,⽆法被继承。
final关键字修饰⽅法的时候,表⽰⼦类⽆法覆盖它。
final关键字修饰变量的时候,表⽰该变量只能被赋值⼀次,尽管变量的状态可以更改。
关于final更详细的内容,可以参照我之前写了另外⼀篇⽂章:
24、什么是static关键字?
static关键字可以⽤来修饰类变量,使其具有全局性,即所有对象将共享同⼀个变量。
static关键字可以⽤来修饰⽅法,该⽅法称为静态⽅法,只可以访问类的静态变量,并且只能调⽤类的静态⽅法。
关于static更详细的内容,可以参照我之前写了另外⼀篇⽂章:
25、finally和finalize有什么区别?
finally通常与try-catch块⼀起使⽤,即使try-catch块引发了异常,finally块中的代码也会被执⾏,⽤于释放try块中
创建的资源。
finalize()是Object类的⼀个特殊⽅法,当对象正在被垃圾回收时,垃圾收集器将会调⽤该⽅法。可以重写该⽅法⽤于释放
系统资源。
26、可以将⼀个类声明为static的吗?
不能将⼀个外部类声明为static的,但可以将⼀个内部类声明为static的——称为静态内部类。
27、什么是静态导⼊?
如果必须在⼀个类中使⽤其他类的静态变量或者静态⽅法,通常我们需要先导⼊该类,然后使⽤“类名.变量/⽅法”的形式调
⽤。
;
doubletest=*5;
也可以通过静态导⼊的⽅式,就不需要再使⽤类名了。
;
doubletest=PI*5;
不过,静态导⼊容易引发混乱(变量名或者⽅法名容易冲突),因此最好避免使⽤静态导⼊。
28、什么是try-with-resources?
try-with-resources是Java7时引⼊的⼀个⾃动资源管理语句,在此之前,我们必须通过try-catch-finally的⽅式⼿动
关闭资源,当我们忘记关闭资源的时候,就容易导致内存泄漏。
关于try-with-resources更详细的内容,可以参照我之前写了另外⼀篇⽂章:
29、什么是multi-catch?
Java7改进的另外⼀个地⽅就是multi-catch,可以在单个catch中捕获多个异常,当⼀个try块抛出多个类似的异常
时,这种写法更短,更清晰。
catch(IOException|SQLExceptionex){
(ex);
thrownewMyException(sage());
}
当有多个异常的时候,可以使⽤管道表⽰符“|”隔开。
30、什么是static块?
static块是由JavaClassLoader将类加载到内存中时执⾏的代码块。通常⽤于初始化类的静态变量或者创建静态资源。
31、什么是接⼝?
接⼝是Java编程语⾔中的⼀个核⼼概念,不仅在JDK源码中使⽤很多,还在Java设计模式、框架和⼯具中使⽤很多。接
⼝提供了⼀种在Java中实现抽象的⽅法,⽤于定义⼦类的⾏为约定。
关于接⼝更详细的内容,可以参照我之前写了另外⼀篇⽂章:
鸣谢
说句实在话,这31道Java核⼼⾯试题在⾯试的过程中还是很常见的,值得好好复习⼀遍。关键是还有下⼀波,同样31
道,望眼欲穿吧?
好了,我亲爱的⼩伙伴们,能看到这⾥绝逼是最优秀的程序员,⼆哥必须伸出帅⽓的⼤拇指为你点个赞!
我是沉默王⼆,⼀枚有颜值却靠才华苟且的程序员。关注即可提升学习效率,别忘了三连啊,点赞、收藏、留⾔,我不挑,奥
利给。
注:如果⽂章有任何问题,欢迎毫不留情地指正。
很多读者都同情我说,“⼆哥母猪似的⽇更原创累不累?”我只能说写作不易,且⾏且珍惜啊,欢迎微信搜索「沉默王⼆」第
⼀时间阅读,回复「简历」更有我精⼼为你准备的简历模板,本⽂GitHub已收录,欢迎star。
本文发布于:2023-03-16 22:46:15,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1678977976144803.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:jre是什么.doc
本文 PDF 下载地址:jre是什么.pdf
留言与评论(共有 0 条评论) |