2022年Java(1~5年经验)面试题100题.pdf





《2022年Java(1~5年经验)面试题100题.pdf》由会员分享,可在线阅读,更多相关《2022年Java(1~5年经验)面试题100题.pdf(23页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2022年Java(l5年经验)面试题100题(一)一、Java基础篇1、抽象类必须要有抽象方法吗?【仅供参考】不需要,抽象类不一定非要有抽象方法。示例代码:a b s t r a c t c la s s Ca t p u b lic s t a t ic v oid s a y H i()Sy s t em,ou t.p r int in(hi );上面代码,抽象类并没有抽象方法但完全可以正常运行。2、O b jec t 常用方法有哪些?【仅供参考】J a v a 面试经常会出现的一道题目,O b jec t 的常用方法。下面给大家整理一下。O b jec t 常用方法有:t oSt r
2、ing O、eq u a ls。、ha s hCod e()、c lone。等。3、J DK/J RE/J V M 三者的关系【仅供参考】J V M英文名称(J a v a V ir t u a l M a c hine),就是我们耳熟能详的J a v a 虚拟机。J a v a 能够跨平台运行的核心在于J V M o所有的ja v a 程序会首先被编译为.c la s s 的类文件,这种类文件可以在虚拟机上执行。也就是说c la s s 文件并不直接与机器的操作系统交互,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。针对不同的系统有不同的jv m实现,有 L inu x
3、 版 本 的 jv m实现,也有W ind ow s 版 本 的 jv m实现,但是同一段代码在编译后的字节码是一样的。这就是J a v a 能够跨平台,实现一次编写,多处运行的原因所在。J RE英文名称(J a v a Ru nt ime Env ir onment),就是J a v a 运行时环境。我们编写的J a v a 程序必须要在J RE才能运行。它主要包含两个部分,J V M 和 J a v a 核心类库。J RE是J a v a 的运行环境,并不是一个开发环境,所以没有包含任何开发工具,如编译器和调试器等。如果你只是想运行J a v a 程序,而不是开发J a v a 程序的话,
4、那么你只需要安装J RE即可。J DK第1/23页J DK 目录下有个J RE,也就是J DK 中已经集成了 J RE,不用单独安装J RE。另外,J DK 中还有一些好用的工具,如jinfo,jp s,js t a c k等。J RE=J V M +J a v a 核心类库J DK =J RE+J a v a 工 具+编 译 器+调试器4、阐述 fina l、fina lly、fina liz e 的区别。【仅供参考】其实是三个完全不相关的东西,只是长的有点像。fina l如上所示。fina lly:fina lly 是 对 J a v a 异常处理机制的最佳补充,通常配合t r y、c a
5、 t c h 使用,用于存放那些无论是否出现异常都一定会执行的代码。在实际使用中,通常用于释放锁、数据库连接等资源,把资源释放方法放到f i na lly 中,可以大大降低程序出错的几率。f i na li z e:Ob j e c t 中的方法,在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。f i na li z e。方法仅作为了解即可,在 J a v a 9中该方法已经被标记为废弃,并添加新的j a v a.la ng.r e f.C le a ne r,提供了更灵活和有效的方法来释放资源。这也侧面说明了,这个方法的设计是失败的,因此更加不能去使用它。5、J D K 1.8 之后
6、有哪些新特性?【仅供参考】接口默认方法:J a v a 8 允许我们给接口添加一个非抽象的方法实现,只需要使用d e f a u lt 关键字即可La mb d a 表达式和函数式接口:La mb d a 表达式本质上是一段匿名内部类,也可以是一段可以传递的代码。La mb d a 允许把函数作为一个方法的参数(函数作为参数传递到方法中),使用La mb d a 表达式使代码更加简洁,但是也不要滥用,否则会有可读性等问题,E f f e c t i v eJ a v a 作 者 J o s h B lo c h 建议使用La mb d a 表达式最好不要超过3 行。S t r e a m AP
7、I:用函数式编程方式在集合类上进行复杂操作的工具,配合La mb d a 表达式可以方便的对集合进行处理。J a v a 8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用S t r e a m A P I 对集合数据进行操作,就类似于使用S QL执行的数据库查询。也可以使用S t r e a m A P I 来并行执行操作。简而言之,S t r e a m A P I 提供了一种高效且易于使用的处理数据的方式。方法引用:方法引用提供了非常有用的语法,可以直接引用已有Ja v a 类或对象(实例)的方法或构造器。与l a m b
8、d a 联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。日期时间AP I:Ja v a 8 引入了新的日期时间AP I改进了日期时间的管理。Op t i o n a l 类:著名的Nu l l P o i n t e r Ex c e p t i o n 是引起系统失败最常见的原因。很久以前G o o g l e G u a v a 项目引入了 Op t i o n a l 作为解决空指针异常的一种方式,不赞成代码被n u l l 检查的代码污染,期望程序员写整洁的代码。受G o o g l e G u a v a 的鼓励,Op t i o n a l 现在是Ja v a 8库的一
9、部分。新工具:新的编译工具,如:Na s h o r n 引 擎 j j s、类依赖分析器j d e p s。6、讲讲什么是泛型?【仅供参考】T 。工开|曰T N/C r+i P I 的 入立匚灶,卜 4 士,/来 工 门 士 也 Lt 钻1 A W A U 来并I I 五期r 主 口 口第2/2 3 页ja v a忆生7E JD A。十71 HJ 丁捌付1 土,儿好伍止乂天他攸1TJTJ1I天1丈 天生经奴。尸叨TJ失型参数在使 时 具体的类型来替换。泛 型 最的 好 处 是 可 以 提 代 码 的 复 性。以Li s t 接口为例,我们可以将S t r i n g、In t e g e r
10、 等类 型 放 Li s t 中,如 不 泛 型,存放S t r i n g 类 型 要 写 个 Li s t 接口,存放In t e g e r 要写另外个Li s t 接口,泛型可以很好的解决这个问题。7、为什么要使用克隆?【仅供参考】克隆的对象可能包含一些已经修改过的属性,而 n e w 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了。8、为什么不能用浮点型表示金额?【仅供参考】由于计算机中保存的小数其实是十进制的小数的近似值,并不是准确值,所以,千万不要在代码中使用浮点数来表示金额等重要的指标。建议使用B i g D e c i m
11、a l,或者Lo n g 来表示金额。9、说说类实例化的顺序【仅供参考】静态属性,静态代码块。普通属性,普通代码块。构造方法。1 0、B IO、N IO、A I 0 有什么区别?【仅供参考】B IO:B l o c k 1 0 同步阻塞式1 0,就是我们平常使用的传统1 0,它的特点是模式简单使用方便,并发处理能力低。N IO:N o n 1 0 同步非阻塞1 0,是 传 统 1 0 的升级,客户端和服务器端通过C h a n n e l (通道)通讯,实现了多路复用。A IO:A s y n c h r o n o u s 1 0 是 N I 0 的升级,也 叫 N I0 2,实现了异步非堵
12、塞1 0 ,异 步 1 0 的操作基于事件和回调机制。1 1、抽象类能使用f i n a l 修饰吗?【仅供参考】不能,定义抽象类就是让其他类继承的,如果定义为f i n a l 该类就不能被继承,这样彼此就会产生矛盾,所 以 f i n a l 不能修饰抽象类,编辑器也会提示错误信息:1 2、两个对象的h a s h C o d e 0 相同,则 e q u a l s()也一定 为 t r u e,对吗?【仅供参考】不对,两个对象的h a s h C o d e()相 同,e q u a l s()不一定 t r u e。代码示例:第3/2 3 页St r i n g s t r l =通
13、话;St r i n g s t r 2 =重地”;Sy s t e m,o u t.p r i n t i n (St r i n g,f o r m a t (/zs t r l :%d|s t r 2:%d”,s t r l.h a s h C o d e (),s t r 2.h a s h C o d e ();Sy s t e m,o u t.p r i n t i n(s t r l.e q u a l s(s t r 2);执行的结果:s t r l:1 1 7 9 3 9 5 s t r 2:1 1 7 9 3 9 5f a l s e代码解读:很显然“通话”和“重地”的h
14、a s h C o d e 0相同,然 而e q u a l s()则 为f a l s e,因为在散列表中,h a s h C o d e 0相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。1 3、面向对象和面向过程的区别?【仅供参考】面向对象和面向过程是一种软件开发思想。面向过程就是分析出解决问题所需要的步骤,然后用函数按这些步骤实现,使用的时候依次调用就可以了。面向对象是把构成问题事务分解成各个对象,分别设计这些对象,然后将他们组装成有完整功能的系统。面向过程只用函数实现,面向对象是用类实现各个功能模块。以五子棋为例,面向过程的设计思路就是首先分析问题的步骤:1、
15、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为:黑白双方棋盘系统,负责绘制画面规则系统,负责判定诸如犯规、输赢等。黑白双方负责接受用户的输入,并告知棋盘系统棋子布局发生变化,棋盘系统接收到了棋子的变化的信息就负责在屏幕上面显示出这种变化,同时利用规则系统来对棋局进行判定。1 4、那为什么S t r i n g要设计成不可变的?【仅供参考】主要有以下几点原因:线程安全。同一个字符串实例可以被多个线程共享,因
16、为字符串不可变,本身就是线程安全的。支持h a s h映射和缓存。因为S t r i n g的h a s h值经常会使用到,比如作为M a p的键,不可变的特性使 得h a s h值也不会变,不需要重新计算。出于安全考虑。网络地址UR L、文件路径p a t h、密码通常情况下都是以S t r i n g类型保存,假若S t r i n g不是固定不变的,将会引起各种安全隐患。比如将密码用S t r i n g的类型保存,那么它将一直留在内存中,直到垃圾收集器把它清除。假如S t r i n g类不是固定不变的,那么这个密码可能会被改变,导致出现安全隐患。第4/2 3页字符串常量池优化。Str
17、ing对象创建之后,会缓存到字符串常量池中,下次需要创建同样的对象时,可以直接返回缓存的引用。15、重 载(Overload)和 重 写(Override)的区别?【仅供参考】方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载:一个类中有多个同名的方法,但是具有有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)。重写:发生在子类与父类之间,子类对父类的方法进行重写,参数都不能改变,返回值类型可以不相同,但是必须是父类返回值的派生类。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。16、J a v a中
18、操作字符串都有哪些类?它们之间有什么区别?【仅供参考】操作字符串的类有:String StringBuffer、StringBuilder。String和StringBuffer、StringBuilder的区别在于String声明的是不可变的对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer、StringBuilder可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用StringoStringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的,而StringBuilde
19、r是非线程安全的,但StringBuilder的性能却高于StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用StringBuffer。17、final、finally、finalize 有什么区别?【仅供参考】final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。final
20、ize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,J a v a中允许使用finalize。方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。18、Error和Exception区别是什么?【仅供参考】Error类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这第5/23页类错误进行检测,J A V A 应用程序也不应对这类错误进行捕获,一旦这类错误发生,通常应用程序会被终止,仅靠应用程序本身无法恢复;E x c e p t i o n 类的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错误,应对其进行处理,使应用程序
21、可以继续正常运行。19、t r y-c at c h-f in al l y 中,如果 c at c h 中 r e t u r n 了,f in al l y 还会执行吗?【仅供参考】f in al l y 一定会执行,即使是c at c h中 r e t u r n 了,c at c h中 的 r e t u r n 会 等 f in al l y 中的代码执行完之后,才会执行。2 0、运行时异常和一般异常(受检异常)区别是什么?【仅供参考】运行时异常包括R u n t im e E x c e p t ion 类及其子类,表 示 J VM在运行期间可能出现的异常。J av a 编译器不会
22、检查运行时异常。受检异常是E x c e p t ion 中 除 R u n t im e E x c e p t ion 及其子类之外的异常。J av a编译器会检查受检异常。R u n t im e E x c e p t ion 异常和受检异常之间的区别:是否强制要求调用者必须处理此异常,如果强制要求调用者必须进行处理,那么就使用受检异常,否则就选择非受检异常(R u n t im e E x c e p t ion)o 一般来讲,如果没有特殊的要求,我们建议使用R u n t im e E x c e p t ion 异常。二、Java进阶篇1、如何决定使用l l as hMap 还
23、是 T r e e Map?【仅供参考】对 于 在 M a p 中插入、删除、定位一个元素这类操作,H as hMap 是最好的选择,因为相对而言l l as hMap 的插入会更快,但如果你要对一个k e y 集合进行有序的遍历,那 T r e e Map 是更好的选择。2、怎么唤醒一个阻塞的线程【仅供参考】如果线程是因为调用了 w ait。、s l e e p。或 者 j oin()方法而导致的阻塞,可以中断线程,并且通过抛出I n t e r r u p t e d E x c e p t ion 来唤醒它;如果线程遇到了 1 0 阻塞,无能为力,因 为 10是操作系统实现的,J av
24、a代码并没有办法直接接触到操作系统。3、R e ad W r it e L oc k 是什么第6/2 3 页首先明确一下,不 是 说 R e e n t r an t L oc k 不好,只 是 R e e n t r an t L oc k 某些时候有局限。如果使用 R e e n t r an t L oc k,可能本身是为了防止线程A在写数据、线 程 B在读数据造成的数据不一致,但这样,如果线程C 在读数据、线 程 D也在读数据,读数据是不会改变数据的,没有必要加锁,但是还是加锁了,降低了程序的性能。因为这个,才诞生了读写锁R e a d W r i t e L o c k R e a
25、d W r i t e L o c k 是 一 个 读 写 锁 接 口 ,R e e n t r a n t R e a d W r i t e L o c k 是R e a d W r i t e L o c k接口的一个具体实现,实现了读写的分离,读锁是共享的,写锁是独占的,读和读之间不会互斥,读和写、写和读、写和写之间才会互斥,提升了读写的性能。4、什么是线程池?有哪几种创建方式?【仅供参考】线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022 Java 经验 试题 100

限制150内