JDK核心面试题及详细答案(实战完整版)_第1页
JDK核心面试题及详细答案(实战完整版)_第2页
JDK核心面试题及详细答案(实战完整版)_第3页
JDK核心面试题及详细答案(实战完整版)_第4页
JDK核心面试题及详细答案(实战完整版)_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JDK核心面试题及详细答案(实战完整版)一、Java基础核心面试题1、JDK、JRE、JVM的区别与联系?答案:三者是层层包含的关系,范围从大到小依次是JDK>JRE>JVM。JVM是Java虚拟机,是Java程序运行的核心载体,只负责解释执行字节码文件,不包含任何开发工具,是整个Java跨平台的核心,所有Java程序最终都在JVM上运行。JRE是Java运行环境,包含JVM+Java核心类库,只用于运行已经编译好的Java程序,普通用户运行Java软件只需要安装JRE,无法进行代码开发和编译。JDK是Java开发工具包,包含JRE+编译、调试、打包等开发工具(javac、java、jar、jmap等),是开发人员必备的环境,既可以开发编译代码,也可以运行代码。总结:开发用JDK,运行用JRE,底层依托JVM。2、==和equals的区别?答案:==是运算符,既可以比较基本数据类型,也可以比较引用数据类型。基本类型比较的是数值本身,引用类型比较的是对象的内存地址。equals是Object类的方法,默认只能比较引用类型。原生的equals方法底层就是==,比较的是对象地址。但像String、Integer这类常用类,都重写了equals方法,重写后不再比较地址,而是比较对象的内容值是否相同。日常开发中,比较字符串、包装类内容是否一致,必须用equals;判断两个对象是否是同一个对象,用==。3、String、StringBuilder、StringBuffer的区别?答案:1、可变性:String是不可变字符串,底层是被final修饰的字符数组(JDK9+是字节数组),每次拼接字符串都会生成新对象;StringBuilder和StringBuffer是可变字符串,拼接、修改不会产生新对象。2、线程安全:StringBuffer所有方法都加了synchronized锁,线程安全,效率低;StringBuilder无锁,线程不安全,效率高;String不可变,天然线程安全。3、使用场景:少量字符串操作用String;单线程大量拼接、修改字符串用StringBuilder;多线程环境下字符串操作用StringBuffer。4、final、finally、finalize的区别?答案:1、final是修饰符,可以修饰类、方法、变量。final修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是常量,只能赋值一次。2、finally是异常处理关键字,搭配try-catch使用,无论程序是否抛出异常,finally中的代码最终都会执行(唯一不执行的场景:执行到System.exit(0)),常用于释放资源、关闭连接。3、finalize是Object类的废弃方法,JDK9开始被废弃。原本作用是垃圾回收器回收对象前触发该方法,用于手动清理资源,但执行时机不确定、无法保证调用,实际开发中完全不用。5、接口和抽象类的区别?答案:1、定义与修饰:抽象类用abstract修饰,接口用interface定义。抽象类可以有构造方法,接口没有构造方法。2、成员特性:抽象类可以有普通变量、常量、普通方法、抽象方法;JDK8之前接口只有常量和抽象方法,JDK8新增默认方法、静态方法,JDK9新增私有方法。3、继承规则:类只能单继承抽象类,但可以多实现接口,解决了单继承的局限性。4、设计思想:抽象类是模板复用,抽取子类通用属性和行为;接口是行为规范,定义一套统一的功能标准。二、Java集合高频面试题1、ArrayList和LinkedList的区别?答案:1、底层结构:ArrayList底层是动态数组,LinkedList底层是双向链表。2、查询效率:ArrayList支持随机访问,通过下标直接定位元素,查询速度极快;LinkedList只能从头节点或尾节点遍历查找,查询效率极低。3、增删效率:ArrayList中间、头部增删元素需要移动大量元素,效率低;LinkedList只需要修改节点指针,无需移动元素,增删效率更高(首尾操作尤为明显)。4、内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点都要存储前后指针,单个元素占用内存更大。使用场景:查询多、增删少用ArrayList;频繁首尾增删、极少查询用LinkedList。2、HashMap的底层原理?JDK7和JDK8的区别?答案:底层核心原理:HashMap基于「数组+链表+红黑树」实现,通过哈希算法计算元素下标,实现快速存取。put元素时,先根据key的hash值定位数组下标,若下标无元素直接存入;若有元素则发生哈希冲突,挂链表;链表长度超过阈值且数组容量达标,链表转为红黑树,提升查询效率。JDK7与JDK8核心区别:1、数据结构:JDK7只有「数组+单向链表」;JDK8新增红黑树,结构为「数组+单向链表+红黑树」。2、插入方式:JDK7链表采用头插法,多线程扩容容易出现环形链表,引发死循环;JDK8改为尾插法,规避了环形链表问题。3、树化阈值:链表长度大于8且数组容量大于等于64时,链表转为红黑树;链表长度小于等于6时,红黑树退化为链表。4、hash计算:JDK8优化了hash算法,减少哈希冲突概率。3、HashMap为什么线程不安全?怎么解决?答案:HashMap线程不安全核心场景:多线程put数据、扩容时会出现数据覆盖、数据丢失、JDK7环形链表死循环、CPU100%占用等问题。解决方案:1、使用Hashtable:线程安全,所有方法加锁,但锁粒度太大,效率极低,基本不用。2、使用Collections.synchronizedMap:通过同步方法加锁,整体效率依旧不高。3、使用ConcurrentHashMap:实际开发首选,JDK8采用CAS+synchronized分段锁,锁粒度细化,并发效率极高,线程安全且性能优异。4、ConcurrentHashMap底层原理?答案:JDK8ConcurrentHashMap底层是「数组+链表+红黑树」,核心采用CAS无锁乐观机制+synchronized局部锁实现并发安全。它不再采用JDK7的分段锁设计,锁粒度细化到数组单个桶位。当多个线程操作不同桶位的数据时,互不影响,支持并发读写;只有操作同一个桶位数据时,才会触发锁竞争。put流程:先通过CAS尝试无锁写入,写入失败再加synchronized锁;同时保留红黑树优化,高并发下性能远超Hashtable。默认初始容量16,负载因子0.75,和HashMap一致。三、JUC并发编程面试题1、synchronized和Lock的区别?答案:1、底层实现:synchronized是JVM原生锁,底层依赖虚拟机指令实现;Lock是Java层面的接口,基于代码实现锁机制。2、锁特性:synchronized是隐式锁,自动加锁、自动释放锁;Lock是显式锁,需要手动调用lock()加锁、unlock()释放锁。3、锁类型:synchronized是非公平锁、可重入锁,不可中断;ReentrantLock(Lock实现类)支持公平/非公平锁、可重入、可中断、可超时。4、功能拓展:Lock可以绑定多个条件变量,精准唤醒指定线程,适合复杂并发场景;synchronized只能随机唤醒或全部唤醒线程。使用场景:简单并发场景用synchronized,复杂精准控制并发用ReentrantLock。2、volatile关键字的作用?能否保证线程安全?答案:volatile核心两大作用:保证变量可见性、禁止指令重排序。1、可见性:一个线程修改volatile变量后,会立即刷新到主内存,其他线程能立刻感知到最新值,解决多线程变量缓存不一致问题。2、禁止重排序:编译器和CPU不会对volatile修饰的变量指令进行乱序优化,避免并发场景下的逻辑错乱,常用于单例模式防重排。volatile不能保证原子性,无法保证线程安全。比如i++操作是读取、修改、写入三步,volatile只能保证可见性,无法防止多线程同时修改导致的数据覆盖,复合操作依旧线程不安全。3、线程池的核心参数及工作原理?答案:线程池核心七大参数:核心线程数、最大线程数、空闲超时时间、时间单位、任务队列、线程工厂、拒绝策略。核心工作流程:1、提交任务后,线程池先判断核心线程数是否已满,未满则创建核心线程执行任务;2、核心线程已满,判断任务队列是否已满,未满则将任务存入队列排队;3、队列已满,判断最大线程数是否已满,未满则创建非核心线程执行任务;4、最大线程数已满,触发拒绝策略处理超额任务。非核心线程空闲超时后会被回收,核心线程默认常驻不回收。4、四种线程池的特点?为什么不推荐使用Executors?答案:1、newFixedThreadPool:固定线程数线程池,核心线程=最大线程,无空闲回收,队列无界,任务过多会堆积大量任务,引发OOM。2、newCachedThreadPool:可缓存线程池,无核心线程,最大线程数无限,任务多会创建大量线程,耗尽系统资源。3、newSingleThreadExecutor:单线程线程池,只有一个工作线程,无界队列,任务堆积易OOM。4、newScheduledThreadPool:定时任务线程池,支持定时、周期执行任务,最大线程数无限,存在线程泛滥风险。不推荐Executors原因:封装好的线程池要么队列无界,要么线程数无限,高并发场景下极易出现任务堆积、线程过多,导致内存溢出、系统卡死。实际开发必须通过ThreadPoolExecutor手动创建线程池,自定义参数规避风险。四、JVM虚拟机高频面试题1、JVM内存区域划分及各区域作用?答案:JVM运行时数据区分为5个区域,其中线程私有3个,线程共享2个。线程私有(随线程创建销毁):1、程序计数器:记录当前线程执行的字节码行号,线程切换后恢复执行位置,是唯一无OOM的内存区域。2、虚拟机栈:存储局部变量、方法参数、操作数栈、方法返回地址,方法调用入栈,执行结束出栈,栈深度过大会抛出栈溢出异常。3、本地方法栈:为JNI本地native方法服务,作用和虚拟机栈类似。线程共享(全局共享):1、堆内存:JVM最大内存区域,所有对象和数组都在堆中分配内存,是垃圾回收的核心区域,分为新生代、老年代。2、方法区:存储类信息、常量、静态变量、即时编译代码等,JDK8后彻底废弃永久代,改为元空间,使用本地内存,不再占用JVM堆内存。2、垃圾回收的判定方式?哪些对象会被回收?答案:JVM采用可达性分析算法判定垃圾对象,替代了传统的引用计数法。以GCRoots对象作为起始节点,遍历内存引用链,没有被GCRoots引用到的对象,即为垃圾对象,会被回收。可作为GCRoots的对象:虚拟机栈中引用的对象、本地方法栈引用的对象、方法区静态变量/常量引用的对象。同时明确:循环引用的对象,在可达性分析中会被判定为垃圾,解决了引用计数法的循环引用无法回收的弊端。3、MinorGC、MajorGC、FullGC的区别?答案:1、MinorGC:新生代垃圾回收,频繁触发,速度极快。新生代内存不足时触发,采用复制算法,停顿时间短,对系统影响小。2、MajorGC:老年代垃圾回收,触发次数少,速度慢。通常由MinorGC晋升失败、老年代空间不足触发。3、FullGC:整堆回收,回收新生代、老年代、元空间,停顿时间最长、性能损耗最大。频繁FullGC会导致系统卡顿、吞吐量下降,开发中必须尽量避免。常见触发FullGC场景:手动调用System.gc()、老年代内存溢出、元空间不足、MinorGC大量对象晋升老年代。4、OOM常见原因及解决方案?答案:常见OOM原因:1、堆内存溢出:创建大量大对象、集合无限添加元素、静态集合持有对象不释放,导致堆内存占满。2、栈溢出:方法递归深度过大、方法嵌套调用过深,超出虚拟机栈最大深度。3、元空间溢出:动态生成大量类、反射频繁创建类对象,元空间内存耗尽。4、线程过多:创建大量非核心线程、无限新建线程,耗尽系统内存。解决方案:1、优化代码:避免大对象创建、集合及时清空、杜绝死循环创建对象、合理关闭线程。2、调整JVM参数:适当扩容堆内存、元空间大小,优化垃圾回收参数。3、排查内存泄漏:通过jmap、jhat、Arthas工具分析堆快照,定位泄漏对象和代码位置。五、JDK新特性高频面试题(JDK8-JDK17)1、JDK8核心新特性有哪些?答案:1、Lambda表达式:简化匿名内部类写法,支持函数式编程,精简代码。2、Stream流:简化集合遍历、筛选、排序、聚合等操作,链式编程,代码更简洁优雅。3、Optional类:解决空指针异常问题,优雅处理空对象判断。4、新时间日期API:LocalDate、LocalTime、LocalDateTime,替代老旧的Date、Calendar,线程安全、操作便捷。5、接口增强:接口支持默认方法、静态方法,无需实现所有抽象方法。6、元空间替代永久代:移除永久代,使用本地内存元空间,减少OOM概率。2、Lambda表达式的优缺点?答案:优点:代码极简,去除冗余匿名内部类代码;配合Stream流可以快速完成集合数据处理,开发效率高。缺点:可读性较差,复杂逻辑使用Lambda会导致代码晦涩;无法直接在Lambda中修改外部局部变量,只能使用常量;异常处理、调试比普通代码更麻烦。3、JDK17常用新特性?答案:1、密封类:通过se

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论