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

下载本文档

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

文档简介

JavaSE核心面试题及详细答案(实战版)一、Java基础语法面试题1、JDK、JRE、JVM的区别与联系?答案:三者是层层包含的关系,范围从大到小依次为:JDK>JRE>JVM。1、JVM(Java虚拟机):是Java程序运行的核心载体,只负责解析和执行class字节码文件,不包含任何开发工具,是Java跨平台的核心,不同系统对应不同版本的虚拟机。2、JRE(Java运行环境):包含JVM+Java核心类库。只用于运行已经编译好的Java程序,普通用户运行Java软件只需安装JRE,无法用于开发代码。3、JDK(Java开发工具包):包含JRE+编译、调试、打包等开发工具(javac、java、jar等)。是开发者编写、编译、运行Java程序的全套环境。总结:开发程序用JDK,运行程序用JRE,程序执行靠JVM。2、==和equals()的区别?答案:1、==是运算符,可以用于基本数据类型和引用数据类型-基本数据类型:比较的是变量的实际数值是否相等;-引用数据类型:比较的是对象的内存地址是否相同,也就是判断是否为同一个对象。2、equals()是Object类的方法,仅适用于引用数据类型-Object类原生的equals()方法,底层本质就是==,依旧比较内存地址;-String、Integer等包装类重写了equals()方法,重写后不再比较地址,而是比较对象的内容值是否相等。高频场景:比较字符串内容必须用equals(),绝对不能用==。3、String、StringBuilder、StringBuffer的区别?答案:1、String:字符串常量,底层是被final修饰的字符数组,不可变。每次对字符串进行拼接、修改,都会生成新的字符串对象,效率极低,适合少量字符串定义场景。2、StringBuilder:字符串变量,底层可变字符数组,线程不安全,执行效率高,是日常开发字符串拼接的首选。3、StringBuffer:字符串变量,底层可变字符数组,线程安全(方法加了synchronized锁),执行效率低,适合多线程环境下的字符串拼接操作。开发规范:单线程大量拼接用StringBuilder,多线程大量拼接用StringBuffer,静态不变的字符串用String。4、final、finally、finalize的区别?答案:三者无任何关联,是三个完全不同的Java关键字/方法:1、final:修饰符,用于定义不可修改的内容-修饰变量:变量变为常量,只能赋值一次,不可修改;-修饰方法:方法不可被重写;-修饰类:类不可被继承。2、finally:异常处理代码块,搭配try-catch使用。无论代码是否出现异常,finally中的代码一定会执行(唯一例外:执行System.exit(0)退出JVM),常用于释放资源(关闭流、连接等)。3、finalize():Object类的废弃方法,JVM垃圾回收前会调用该方法,用于对象资源收尾。该方法效率极低、无法保证执行时机,JDK9之后已被废弃,开发中禁止使用。二、面向对象OOP面试题1、面向对象的四大特性及各自作用?答案:Java是纯面向对象语言,核心四大特性:封装、继承、多态、抽象。1、封装:将类的属性私有化,通过public的get/set方法对外提供访问入口。核心作用是隐藏内部细节、保护数据安全、降低代码耦合度。2、继承:子类继承父类的属性和方法,实现代码复用。核心作用是减少重复代码、便于功能扩展,Java为单继承,一个子类只能有一个直接父类。3、多态:同一个行为,不同子类有不同的实现方式。核心体现:父类引用指向子类对象,方法重写。核心作用是提高代码扩展性、兼容性。4、抽象:通过abstract定义抽象类和抽象方法,只定义规范,不实现具体逻辑。核心作用是统一代码规范、强制子类实现核心方法。2、接口和抽象类的区别?答案:1、定义修饰:抽象类用abstract修饰;接口用interface修饰。2、继承实现:类只能单继承一个抽象类;类可以多实现多个接口。3、成员变量:抽象类可以有普通变量、常量;接口中默认只能是publicstaticfinal常量(JDK8之前)。4、方法特性:抽象类可以有普通方法、构造方法、抽象方法;JDK8之前接口只有抽象方法,JDK8新增默认方法、静态方法,JDK9新增私有方法。5、核心用途:抽象类用于抽取子类通用属性和通用行为;接口用于定义行为规范、解耦、实现多态。3、方法重写和重载的区别?答案:1、重载(Overload):同一个类中,方法名相同,参数列表不同(参数个数、类型、顺序不同),与返回值、修饰符无关。-核心:编译时多态;-场景:同一个方法适配不同参数场景。2、重写(Override):父子类中,子类对父类非私有、非final、非静态的方法进行重新实现。-要求:方法名、参数列表、返回值必须一致;访问权限不能比父类更严格;-核心:运行时多态;-场景:子类需要改写父类的默认逻辑。三、集合框架面试题1、ArrayList和LinkedList的区别?答案:1、底层结构:ArrayList底层是动态数组;LinkedList底层是双向链表。2、查询效率:ArrayList支持随机访问,通过下标查询速度极快;LinkedList只能从头节点/尾节点遍历查询,效率低。3、增删效率:ArrayList增删元素时需要移动数组元素,扩容还会复制数组,效率低;LinkedList只需修改节点指针,无需移动元素,增删效率高。4、内存占用:ArrayList内存连续,会预留冗余空间;LinkedList每个节点都包含数据和前后指针,内存占用更高。开发选择:查询多、增删少用ArrayList;频繁增删、极少查询用LinkedList。2、HashMap的底层原理?JDK1.7和JDK1.8的区别?答案:底层核心原理:HashMap基于数组+链表+红黑树实现,通过哈希算法计算key的哈希值,确定元素在数组中的存储位置,解决哈希冲突后存储键值对。JDK1.7与JDK1.8核心区别:1、底层结构:1.7是数组+单向链表;1.8新增红黑树,结构为数组+单向链表+红黑树。2、哈希冲突优化:1.7链表长度无限制,哈希冲突多会导致链表过长,查询效率暴跌;1.8中链表长度超过8且数组容量大于64时,链表转为红黑树,大幅提升查询效率。3、扩容机制:1.7是头插法,多线程环境下容易出现环形链表、数据丢失问题;1.8改为尾插法,规避了环形链表问题。4、初始化方式:1.7创建对象时直接初始化数组;1.8懒加载机制,首次put元素时才初始化数组,节省内存。3、HashMap和Hashtable的区别?答案:1、线程安全:HashMap线程不安全,效率高;Hashtable线程安全,所有方法加锁,效率极低。2、null值支持:HashMap允许key和value为null(key只能有一个null);Hashtable不允许key和value为null,直接报错空指针。3、底层优化:Hashtable老旧、无优化机制,性能差;HashMap经过多次版本迭代,优化完善,是日常开发首选。4、继承关系:Hashtable继承Dictionary类;HashMap继承AbstractMap类。注意:多线程环境下不推荐Hashtable,优先使用ConcurrentHashMap。四、异常体系面试题1、受检异常和非受检异常的区别?答案:Java中所有异常的父类是Throwable,分为Error(错误)和Exception(异常),Exception又分为受检异常和非受检异常。1、受检异常(编译时异常):继承自Exception,除运行时异常外的所有异常。编译阶段必须处理,否则代码报错,无法运行。处理方式:try-catch捕获或throws抛出。常见:IO异常、SQL异常、文件不存在异常。2、非受检异常(运行时异常):继承自RuntimeException。编译阶段不报错,运行程序时才会抛出。无需强制处理,可选择性捕获。常见:空指针异常、数组越界异常、类型转换异常。3、Error:系统级严重错误,如内存溢出、栈溢出,无法手动处理,只能修改代码优化资源。2、try-catch-finally中return的执行顺序?答案:1、try代码块执行完毕,准备执行return时,会先暂停return操作,优先执行finally代码块;2、finally代码执行完成后,再回头执行try中的return返回结果;3、如果finally中存在return语句,会直接终止方法,覆盖try中的return结果。开发规范:禁止在finally中使用return,会隐藏异常、篡改返回结果,导致隐性BUG。五、多线程面试题1、线程和进程的区别?答案:1、进程:操作系统资源分配的最小单位,每个进程独立占用内存、CPU等系统资源,进程之间相互独立,互不干扰。2、线程:进程内的执行单元,是CPU调度的最小单位,一个进程包含多个线程,线程共享进程的所有资源。3、核心区别:进程开销大、隔离性强;线程开销小、切换速度快、共享资源多。Java程序默认是单进程多线程程序,main方法为主线程。2、synchronized和Lock锁的区别?答案:1、锁类型:synchronized是内置锁,Java原生关键字;Lock是显式锁,是JDK提供的接口(常用ReentrantLock)。2、加锁解锁:synchronized自动加锁、自动释放锁,无需手动操作;Lock需要手动lock()加锁、unlock()解锁,必须在finally中解锁,避免死锁。3、锁特性:synchronized是阻塞式锁,无法中断等待线程,只能等待锁释放;Lock支持可中断锁、超时锁、公平锁,功能更灵活。4、性能:低并发场景下两者性能相近;高并发场景下Lock锁性能更优。3、线程的生命周期有哪些状态?答案:Java线程共有6种状态(JDK官方定义):1、NEW(新建):创建线程对象,未调用start()方法,线程未启动;2、RUNNABLE(就绪/运行):调用start()后,等待CPU资源或正在执行线程逻辑;3、BLOCKED(阻塞):等待获取synchronized锁,锁被其他线程占用时进入该状态;6、TERMINATED(终止):线程代码执行完毕或异常终止,线程生命周期结束。六、JVM与内存面试题1、JVM内存区域划分?答案:JVM运行时数据区分为5大区域,其中线程私有3个、线程共享2个:线程私有(随线程创建销毁):1、程序计数器:记录当前线程执行的字节码行号,是唯一没有内存溢出的区域;2、虚拟机栈:存储局部变量、方法栈帧,方法调用入栈,执行结束出栈;3、本地方法栈:为native本地方法提供运行空间。线程共享(随JVM启动销毁):1、堆内存:所有对象、数组的存储区域,是垃圾回收的核心区域;2、方法区:存储类信息、常量、静态变量、即时编译代码等(JDK1.8后改为元空间)。2、垃圾回收GC的核心原理,哪些对象会被回收?答案:GC是JVM自动回收堆内存中无有效引用的对象,释放闲置内存,避免内存泄漏。会被回收的对象:1、对象引用置为null;2、对象超出作用域,局部变量失效;3、集合移除对象,无其他引用;4、弱引用、软引用对象,满足回收条件时被回收。不会被回收:被强引用指向的对象、静态变量引用的对象、活跃线程引用的对象。七、常用核心知识点面试题1、泛型的作用和原理?答案:泛型是JDK5引入的参数化类型机制,核心作用:编译期类型校验,避免类型转换异常,无需强制类型转换。原理:泛型是伪泛型,底层基于类型擦除实现。编译阶段校验类型

温馨提示

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

评论

0/150

提交评论