[完结10章]2024 Java 高分面试宝典 一站式搞定技术面&项目面

147 阅读8分钟

学习地址1:pan.baidu.com/s/18_A5f9EQ… 提取码:1rc8 学习地址2:share.weiyun.com/UrG3Zj3K 密码:5n3mik

java高分面试真题汇总: 1、BIO、NIO、AIO 有什么区别? (1)同步阻塞BIO 一个连接一个线程。 JDK1.4之前,建立网络连接的时候采用BIO模式,先在启动服务端socket,然后启动客户端socket,对服务端通信,客户端发送请求后,先判断服务端是否有线程响应,如果没有则会一直等待或者遭到拒绝请求,如果有的话会等待请求结束后才继续执行。

(2)同步非阻塞NIO NIO主要是想解决BIO的大并发问题,BIO是每一个请求分配一个线程,当请求过多时,每个线程占用一定的内存空间,服务器瘫痪了。

JDK1.4开始支持NIO,适用于连接数目多且连接比较短的架构,比如聊天服务器,并发局限于应用中。

2、什么是 java 序列化?什么情况下需要序列化? 序列化就是一种用来处理对象流的机制。将对象的内容流化,将流化后的对象传输于网络之间。 序列化是通过实现serializable接口,该接口没有需要实现的方法,implement Serializable只是为了标注该对象是可被序列化的,使用一个输出流(FileOutputStream)来构造一个ObjectOutputStream对象,接着使用ObjectOutputStream对象的writeObejct(Object object)方法就可以将参数的obj对象到磁盘,需要恢复的时候使用输入流。 序列化是将对象转换为容易传输的格式的过程。 例如,可以序列化一个对象,然后通过HTTP通过Internet在客户端和服务器之间传输该对象。在另一端,反序列化将从流中心构造成对象。 一般程序在运行时,产生对象,这些对象随着程序的停止而消失,但我们想将某些对象保存下来,这时,我们就可以通过序列化将对象保存在磁盘,需要使用的时候通过反序列化获取到。 对象序列化的最主要目的就是传递和保存对象,保存对象的完整性和可传递性。

3、java反射机制。 可以在运行时判断一个对象所属的类,构造一个类的对象,判断类具有的成员变量和方法,调用1个对象的方法。4个关键的类:Class,Constructor,Field,Method。
getConstructor获得构造函数/getDeclardConstructor; getField/getFields/getDeclardFields获得类所生命的所有字段;getMethod/getMethods/getDeclardMethod获得类声明的所有方法,正常方法是一个类创建对象,而反射是1个对象找到1个类。

4、Java的垃圾回收机制: Java的垃圾回收(Garbage Collection,简称GC)机制是Java虚拟机(JVM)的一部分,它自动处理应用程序不再使用的对象的内存。该机制帮助开发者避免了手动内存管理的复杂性,如内存泄漏和内存溢出等问题。 工作原理: 对象的创建和分配:当我们在Java代码中创建对象时,JVM会在堆内存中为其分配空间。这个空间分配是动态的,发生在运行时。 标记活动对象:垃圾回收器会周期性地检查堆内存中的对象。它首先会标记那些正在被应用程序使用的对象。这通常是通过跟踪对象引用来实现的。 回收非活动对象:一旦标记了活动对象,垃圾回收器会寻找那些没有被标记的对象。这些对象被认为是垃圾,因为它们不再被应用程序使用。垃圾回收器会释放这些对象占用的内存。 内存整理:在回收了非活动对象后,垃圾回收器可能会执行内存整理,将活跃对象集中在一起,这样可以更高效地使用堆内存。

5、你能否描述一下接口与抽象类之间的异同点? 当然,接口与抽象类是Java语言中的重要概念,它们都是面向对象编程的基石。以下是它们之间的异同点: 相同点: 都不能直接实例化:无论是接口还是抽象类,都不能直接创建它们的实例。它们主要用来定义一组抽象的方法或属性。 都是抽象的概念:接口和抽象类都代表了一种抽象的概念,它们主要是用来被其他类实现或继承的。 都可以包含抽象方法:接口和抽象类都可以声明抽象方法,子类需要实现这些抽象方法。 不同点: 声明方式:接口使用interface关键字声明,而抽象类使用abstract关键字声明。 实现方式:一个类可以实现多个接口,但只能继承一个抽象类。这是因为Java支持多重继承(仅限于接口),但不支持多重继承类。 方法默认实现:接口中的所有方法默认都是抽象的(Java 8以后可以有默认方法),而抽象类中可以有非抽象的方法,这些方法可以有默认的实现。 字段声明:接口中声明的字段默认都是public、static和final的,而抽象类中声明的字段则没有这个限制。 设计目的:接口主要用于定义一组行为的规范,它关注的是“能做什么”,而抽象类主要用于提供一种通用的、部分实现的模板,它关注的是“如何做”。

6、Java 中有哪些不同类型的线程优先级?JVM 分配的线程默认优先级是多少? 线程优先级是这样的概念:每个线程都有一个优先级,用外行人的语言来说,可以说每个对象都有优先级,用 1 到 10 之间的数字表示。Java 中有不同类型的线程属性: 最低优先级 最大优先级 正常优先级 默认情况下,该线程被分配有NORM_PRIORITY。

7、垃圾收集的缺点是什么? 除了许多优点之外,垃圾收集器还具有以下某些缺点: 垃圾收集的主要缺点是它会导致应用程序执行暂停,因为它会清除内存,从而降低应用程序的性能。 垃圾收集过程是不确定的,因此很难预测垃圾收集何时发生,从而导致应用程序出现不可预测的行为。例如,如果我们编写任何程序,那么程序员很难确定问题是由垃圾收集引起的还是由程序中的任何其他因素引起的。 如果程序创建并丢弃大量短暂生存的对象,垃圾收集也会增加内存使用量。

8、如何识别 Java 中的主要垃圾收集和次要垃圾收集? 主垃圾收集在幸存者空间上工作,次要垃圾收集在伊甸园空间上工作,以执行标记和清除例程。我们可以根据输出来识别它们,其中次要收集打印“GC”,而主收集打印“Full GC”,这是在使用“-XX:PrintGCDetails”或“verbose:gc”启用垃圾收集日志记录的情况下。

9、什么是内存泄漏,它如何影响垃圾收集? 在 Java 中,内存泄漏可能由多种因素引起,例如未正确关闭资源、持有对象引用的时间超过必要时间或不必要地创建过多对象。在某些情况下,垃圾收集器不会收集对象,因为存在对这些对象的引用。在这些情况下,应用程序创建了大量对象但并未使用它们,并且每个对象都有一些有效引用,Java 中的垃圾收集器无法销毁这些对象。这些对程序没有任何价值的无用对象称为内存泄漏。内存泄漏会阻止垃圾收集器回收未使用的内存,从而对垃圾收集产生负面影响。此行为会导致性能下降或有时导致系统故障。在程序中,通过正确管理资源和对象引用来避免内存泄漏非常重要。

10、多线程的价值? (1) 发挥多核 CPU 的优势 多线程,可以真正发挥出多核 CPU 的优势来,达到充分利用 CPU 的目的,采用多线程的方式去同时完成几件事情而不互相干扰。

(2) 防止阻塞 从程序运行效率的角度来看,单核 CPU 不但不会发挥出多线程的优势,反而会因为在单核CPU 上运行多线程导致线程上下文的切换,而降低程序整体的效率。但是单核 CPU 我们还是要应用多线程,就是为了防止阻塞。试想,如果单核 CPU 使用单线程,那么只要这个线程阻塞了,比方说远程读取某个数据吧,对端迟迟未返回又没有设置超时时间,那么你的整个程序在数据返回回来之前就停止运行了。多线程可以防止这个问题,多条线程同时运行, 哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。

(3) 便于建模 这是另外一个没有这么明显的优点了。假设有一个大的任务 A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。但是如果把这个大的任务 A 分解成几个小任务,任务 B、任务 C、任务 D,分别建立程序模型,并通过多线程分别运行这几个任务,那就简单很多了。