没有合适的资源?快使用搜索试试~ 我知道了~
首页2022年Java基础面试精华汇总:提升面试竞争力
2022年Java基础面试精华汇总:提升面试竞争力
0 下载量 141 浏览量
更新于2024-06-19
收藏 3.18MB PDF 举报
"Java基础面试题(汇总)"是一份全面的备考资料,适合Java开发者在求职面试中提升表现。该文档涵盖了Java语言的基础知识,包括语言特点如简单易学、面向对象编程、平台无关性、可靠安全性和多线程支持,这些都是面试官常问的问题点。文档深入剖析了面向对象编程与面向过程的差异,强调了Java面向对象的封装、继承和多态性优势,以及其在系统设计中的低耦合性。 关于数据类型,文档详述了Java的八种基本数据类型,如byte、short、int、long、float、double、boolean和char,以及它们的大小、默认值和对应的封装类(如Integer、Long等)。特别指出,尽管Java有基本数据类型,但如Integer这样的引用类型实际上存储的是对象引用,而不是实际值,这在理解空值(null)的处理时尤为重要。 文档还提到,虽然Java支持boolean类型,但在底层实现中,并没有为其提供专用的指令,布尔运算在编译后转化为虚拟机的指令。此外,文档还讲解了基本类型和引用类型在内存管理上的不同,以及数组作为引用对象的特性,即修改一个数组会影响到其他引用到同一数组的对象。 这份PDF文档不仅有助于开发者应对面试中关于Java基础知识的提问,还提供了解决问题的策略和面试实战经验,是Java开发者系统学习和巩固知识的重要参考资料。无论是初学者还是经验丰富的开发者,都可以从中受益。
资源详情
资源推荐
+=操作符会对右边的表达式结果强转匹配左边的数据类型,所以没错.
1.23.try catch finally,try⾥有return,finally还执⾏么?
执⾏,并且 finally 的执⾏早于 try ⾥⾯的 return
结论:
1、不管有⽊有出现异常, finally 块中代码都会执⾏;
2、当 try 和 catch 中有 return 时, finally 仍然会执⾏;
3、 finally 是在 return 后⾯的表达式运算后执⾏的(此时并没有返回运算后的值,⽽是先把要返回的值保存起来,管 finally 中的代码怎
么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在 finally 执⾏前确定的;
4、 finally 中最好不要包含 return ,否则程序会提前退出,返回值不是 try 或 catch 中保存的返回值
1.24.Excption与Error包结构
Java可抛出( Throwable )的结构分为三种类型:被检查的异常( CheckedException ),运⾏时异常( RuntimeException ),错误( Error )。
1、运⾏时异常
定义: RuntimeException 及其⼦类都被称为运⾏时异常。
特点:Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有⽤ try-
catch 语句捕获它",还是会编译通过。例如,除数为零时产⽣的 ArithmeticException 异常,数组越界时产⽣
的 IndexOutOfBoundsException 异常, fail-fast 机制产⽣的 ConcurrentModificationException 异常( java.util 包下⾯的所有的集合类都是快速
失败的,“快速失败”也就是fail-fast,它是Java集合的⼀种错误检测机制。当多个线程对集合进⾏结构上的改变的操作时,有可能
会产⽣fail-fast机制。记住是有可能,⽽不是⼀定。例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中
的元素,在某个时候线程2修改了集合A的结构(是结构上⾯的修改,⽽不是简单的修改集合元素的内容),那么这个时候程序就会抛
出 ConcurrentModificationException 异常,从⽽产⽣fail-fast机制,这个错叫并发修改异常。Fail-safe, java.util.concurrent 包下⾯的所
有的类都是安全失败的,在遍历过程中,如果已经遍历的数组上的内容变化了,迭代器不会抛出 ConcurrentModificationException 异常。
如果未遍历的数组上的内容发⽣了变化,则有可能反映到迭代过程中。这就是 ConcurrentHashMap 迭代器弱⼀致的表现。
ConcurrentHashMap 的弱⼀致性主要是为了提升效率,是⼀致性与效率之间的⼀种权衡。要成为强⼀致性,就得到处使⽤锁,甚⾄是全
局锁,这就与 Hashtable 和同步的 HashMap ⼀样了。)等,都属于运⾏时异常。
常见的五种运⾏时异常:
ClassCastException(类转换异常)
IndexOutOfBoundsException(数组越界)
NullPointerException(空指针异常)
ArrayStoreException(数据存储异常,操作数组是类型不⼀致)
BufferOverflowException
short s1= 1;
s1 += 1;
1
2
2、被检查异常
定义: Exception 类本⾝,以及 Exception 的⼦类中除了"运⾏时异常"之外的其它⼦类都属于被检查异常。
特点 : Java编译器会检查它。 此类异常,要么通过 throws 进⾏声明抛出,要么通过try-catch进⾏捕获处理,否则不能通过编译。例
如, CloneNotSupportedException 就属于被检查异常。当通过clone()接⼝去克隆⼀个对象,⽽该对象对应的类没有实现 Cloneable 接
⼝,就会抛出 CloneNotSupportedException 异常。被检查异常通常都是可以恢复的。
如:
IOException
FileNotFoundException
SQLException
被检查的异常适⽤于那些不是因程序引起的错误情况,⽐如:读取⽂件时⽂件不存在引发的 FileNotFoundException 。然⽽,不被检查
的异常通常都是由于糟糕的编程引起的,⽐如:在对象引⽤时没有确保对象⾮空⽽引起的 NullPointerException 。
3、错误
定义 : Error类及其⼦类。
特点 : 和运⾏时异常⼀样,编译器也不会对错误进⾏检查。
当资源不⾜、约束失败、或是其它程序⽆法继续运⾏的条件发⽣时,就产⽣错误。程序本⾝⽆法修复这些错误的。例
如, VirtualMachineError 就属于错误。出现这种错误会导致程序终⽌运⾏。
OutOfMemoryError、ThreadDeath 。
Java虚拟机规范规定JVM的内存分为了好⼏块,⽐如堆,栈,程序计数器,⽅法区等
1.25.OOM你遇到过哪些情况,SOF你遇到过哪些情况
OOM:
1, OutOfMemoryError 异常
除了程序计数器外,虚拟机内存的其他⼏个运⾏时区域都有发⽣ OutOfMemoryError(OOM) 异常的可能。
Java Heap 溢出:
⼀般的异常信息: java.lang.OutOfMemoryError:Java heap spacess 。
java堆⽤于存储对象实例,我们只要不断的创建对象,并且保证 GC Roots 到对象之间有可达路径来避免垃圾回收机制清除这些对象,
就会在对象数量达到最⼤堆容量限制后产⽣内存溢出异常。
出现这种异常,⼀般⼿段是先通过内存映像分析⼯具(如 Eclipse Memory Analyzer )对 dump 出来的堆转存快照进⾏分析,重点是确认内
存中的对象是否是必要的,先分清是因为内存泄漏( Memory Leak )还是内存溢出( Memory Overflow )。
如果是内存泄漏,可进⼀步通过⼯具查看泄漏对象到 GCRoots 的引⽤链。于是就能找到泄漏对象是通过怎样的路径与 GC Roots 相关联
并导致垃圾收集器⽆法⾃动回收。
如果不存在泄漏,那就应该检查虚拟机的参数(-Xmx与-Xms)的设置是否适当。
2,虚拟机栈和本地⽅法栈溢出
如果线程请求的栈深度⼤于虚拟机所允许的最⼤深度,将抛出 StackOverflowError 异常。
如果虚拟机在扩展栈时⽆法申请到⾜够的内存空间,则抛出 OutOfMemoryError 异常
这⾥需要注意当栈的⼤⼩越⼤可分配的线程数就越少。
3,运⾏时常量池溢出
异常信息: java.lang.OutOfMemoryError:PermGenspace
如果要向运⾏时常量池中添加内容,最简单的做法就是使⽤ String.intern() 这个Native⽅法。该⽅法的作⽤是:如果池中已经包含⼀个
等于此String的字符串,则返回代表池中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并且返回
此String对象的引⽤。由于常量池分配在⽅法区内,我们可以通过 -XX:PermSize和-XX:MaxPermSize 限制⽅法区的⼤⼩,从⽽间接限制
其中常量池的容量。
4,⽅法区溢出
⽅法区⽤于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、⽅法描述等。也有可能是⽅法区中保存的class对象没
有被及时回收掉或者class信息占⽤的内存超过了我们配置。
异常信息: java.lang.OutOfMemoryError:PermGenspace
⽅法区溢出也是⼀种常见的内存溢出异常,⼀个类如果要被垃圾收集器回收,判定条件是很苛刻的。在经常动态⽣成⼤量Class的应⽤
中,要特别注意这点。
SOF(堆栈溢出 StackOverflow ):
StackOverflowError 的定义:当应⽤程序递归太深⽽发⽣堆栈溢出时,抛出该错误。
因为栈⼀般默认为1-2m,⼀旦出现死循环或者是⼤量的递归调⽤,在不断的压栈过程中,造成栈容量超过1m⽽导致溢出。
栈溢出的原因:递归调⽤,⼤量循环或死循环,全局变量是否过多,数组、List、map数据过⼤。
1.26.简述线程、程序、进程的基本概念。以及他们之间关系是什么?
线程与进程相似,但线程是⼀个⽐进程更⼩的执⾏单位。⼀个进程在其执⾏的过程中可以产⽣多个线程。与进程不同的是同类的多个
线程共享同⼀块内存空间和⼀组系统资源,所以系统在产⽣⼀个线程,或是在各个线程之间作切换⼯作时,负担要⽐进程⼩得多,也
正因为如此,线程也被称为轻量级进程。
程序是含有指令和数据的⽂件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。
进程是程序的⼀次执⾏过程,是系统运⾏程序的基本单位,因此进程是动态的。系统运⾏⼀个程序即是⼀个进程从创建,运⾏到消亡
的过程。简单来说,⼀个进程就是⼀个执⾏中的程序,它在计算机中⼀个指令接着⼀个指令地执⾏着,同时,每个进程还占有某些系
统资源如 CPU 时间,内存空间,⽂件,输
⼊输出设备的使⽤权等等。换句话说,当程序在执⾏时,将会被操作系统载⼊内存中。 线程是进程划分成的更⼩的运⾏单位。线程和
进程最⼤的不同在于基本上各进程是独⽴的,⽽各线程则不⼀定,因为同⼀进程中的线程极有可能会相互影响。从另⼀⾓度来说,进
程属于操作系统的范畴,主要是同⼀段时间
内,可以同时执⾏⼀个以上的程序,⽽线程则是在同⼀程序内⼏乎同时执⾏⼀个以上的程序段。
1.27.线程有哪些基本状态?这些状态是如何定义的?
新建(new):新创建了⼀个线程对象。
可运⾏(runnable):线程对象创建后,其他线程(⽐如main线程)调⽤了该对象的 start() ⽅法。该状态的线程位于可运⾏线程池中,等
待被线程调度选中,获取cpu的使⽤权。
运⾏(running) :可运⾏状态( runnable )的线程获得了cpu时间⽚( timeslice ),执⾏程序代码。
阻塞(block) :阻塞状态是指线程因为某种原因放弃了cpu使⽤权,也即让出了cpu timeslice,暂时停⽌运⾏。直到线程进⼊可运⾏
( runnable )状态,才有 机会再次获得cpu timeslice转到运⾏( running )状态。
阻塞的情况分三种:
(⼀). 等待阻塞:运⾏( running )的线程执⾏ o.wait() ⽅法,JVM会把该线程放 ⼊等待队列(waitting queue)中。
(⼆). 同步阻塞:运⾏( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占⽤,则JVM会把该线程放⼊锁池(lock pool)
中。
(三). 其他阻塞: 运⾏(running)的线程执⾏ Thread.sleep(long ms)或t.join() ⽅法,或者发出了I/O请求时,JVM会把该线程置为阻塞状
态。当 sleep() 状态超时 join() 等待线程终⽌或者超时、或者I/O处理完毕时,线程重新转⼊可运⾏(runnable)状态。
死亡(dead):线程 run()、main() ⽅法执⾏结束,或者因异常退出了 run() ⽅法,则该线程结束⽣命周期。死亡的线程不可再次复⽣。
1.28.Java 中 IO 流
Java 中 IO 流分为⼏种?
按照流的流向分,可以分为输⼊流和输出流;
按照操作单元划分,可以划分为字节流和字符流;
按照流的⾓⾊划分为节点流和处理流。
Java Io 流共涉及 40 多个类,这些类看上去很杂乱,但实际上很有规则,⽽且彼此之间存在⾮常紧密的联系, Java I0 流的 40 多个类都
是从如下 4 个抽象类基类中派⽣出来的。
InputStream/Reader : 所有的输⼊流的基类,前者是字节输⼊流,后者是字符输⼊流。
OutputStream/Writer : 所有输出流的基类,前者是字节输出流,后者是字符输出流。
按操作⽅式分类结构图:
1.29.java反射的作⽤于原理
1、定义:
反射机制是在运⾏时,对于任意⼀个类,都能够知道这个类的所有属性和⽅法;对于任意个对象,都能够调⽤它的任意⼀个⽅法。在java
中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。
这种动态获取的信息以及动态调⽤对象的⽅法的功能称为Java语⾔的反射机制。
2、哪⾥会⽤到反射机制?
jdbc就是典型的反射
这就是反射。如hibernate,struts等框架使⽤反射实现的。
3、反射的实现⽅式:
第⼀步:获取Class对象,有4中⽅法:
Class.forName('com.mysql.jdbc.Driver.class');//
加载
MySQL
的驱动类
1
剩余77页未读,继续阅读
一键难忘
- 粉丝: 8w+
- 资源: 150
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C语言快速排序算法的实现与应用
- KityFormula 编辑器压缩包功能解析
- 离线搭建Kubernetes 1.17.0集群教程与资源包分享
- Java毕业设计教学平台完整教程与源码
- 综合数据集汇总:浏览记录与市场研究分析
- STM32智能家居控制系统:创新设计与无线通讯
- 深入浅出C++20标准:四大新特性解析
- Real-ESRGAN: 开源项目提升图像超分辨率技术
- 植物大战僵尸杂交版v2.0.88:新元素新挑战
- 掌握数据分析核心模型,预测未来不是梦
- Android平台蓝牙HC-06/08模块数据交互技巧
- Python源码分享:计算100至200之间的所有素数
- 免费视频修复利器:Digital Video Repair
- Chrome浏览器新版本Adblock Plus插件发布
- GifSplitter:Linux下GIF转BMP的核心工具
- Vue.js开发教程:全面学习资源指南
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功