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

下载本文档

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

文档简介

Java高频面试题分类及详细答案(实战版)一、Java基础语法面试题1.JDK、JRE、JVM的区别与联系答案:三者是层层包含的关系,范围从大到小依次是JDK>JRE>JVM。JVM是Java虚拟机,是Java程序运行的核心载体,负责加载字节码文件、解释执行代码、管理内存,是实现Java跨平台的核心,只负责运行程序,不包含开发工具。JRE是Java运行环境,包含JVM和Java核心运行类库(比如lang、io、util包),只要电脑安装了JRE,就可以运行编译好的Java程序,适合程序使用者安装。JDK是Java开发工具包,包含JRE、Java编译工具(javac)、打包工具(jar)、调试工具等所有开发所需工具,是开发Java程序必须安装的环境。总结:开发程序需要JDK,运行程序只需要JRE,JVM是程序运行的底层核心。2.==和equals()的区别答案:==是比较运算符,既可以比较基本数据类型,也可以比较引用数据类型。基本类型比较的是数值本身,引用类型比较的是对象的内存地址。equals()是Object类的方法,默认情况下和==效果一致,比较对象内存地址。但像String、Integer这些常用类,都重写了equals方法,重写后不再比较地址,而是比较对象的内容值。实战场景:比较字符串内容是否相等必须用equals,判断两个对象是否是同一个对象用==。3.final、finally、finalize的区别答案:final是修饰符,用于修饰变量、方法、类。修饰变量表示常量,只能赋值一次;修饰方法表示方法不能被重写;修饰类表示类不能被继承。finally是异常处理的关键字,搭配try-catch使用,它里面的代码无论程序正常执行还是抛出异常,都会执行,唯一不执行的场景是调用了System.exit(0)退出虚拟机,常用于释放资源(关闭流、数据库连接)。finalize()是Object类的废弃方法,JDK9之后已废弃,原本作用是垃圾回收器回收对象前触发,用于对象最后的资源清理,现在不推荐使用。4.基本数据类型和包装类的区别答案:Java基本数据类型共8种(byte、short、int、long、float、double、char、boolean),占用内存固定,存储在栈内存,默认有初始值,不属于对象,不支持泛型。包装类是基本类型的对象封装,位于java.lang包下,存储在堆内存,默认值为null,是对象类型,支持泛型、集合存储,提供了大量数据转换、判断的工具方法。另外存在自动装箱和自动拆箱:基本类型转包装类是装箱,包装类转基本类型是拆箱,由编译器自动完成。需要注意包装类缓存问题,Integer缓存-128~127之间的数值,这个区间内的对象复用,超出区间会新建对象。二、Java集合面试题1.ArrayList和LinkedList的区别答案:底层结构:ArrayList底层是动态数组,LinkedList底层是双向链表。查询效率:ArrayList支持随机访问,通过下标直接定位元素,查询速度极快;LinkedList只能从头节点或尾节点遍历查询,效率低。增删效率:ArrayList增删元素时需要移动数组元素,数组扩容还会复制数组,中间位置增删效率低;LinkedList只需要修改节点指针,无需移动元素,中间增删效率更高。内存占用:ArrayList会预留冗余容量,存在内存浪费;LinkedList每个节点都要存储前后节点指针,单个元素占用内存更大。使用场景:大量查询、少量增删用ArrayList;大量增删、少量查询用LinkedList。2.HashMap的底层原理(JDK1.8)答案:JDK1.8的HashMap底层是数组+链表+红黑树的结构,采用哈希表存储键值对。1.存储流程:通过key的hash值计算数组下标,定位存储位置;如果位置为空,直接存入元素;如果位置有元素,发生哈希冲突。2.冲突解决:冲突后在该位置形成链表,链表长度小于8时,采用链表挂载元素;当链表长度达到8,且数组容量大于64时,链表转换为红黑树,提升查询效率;如果数组容量小于64,只会触发数组扩容,不会树化。3.扩容机制:默认初始容量16,负载因子0.75,当元素个数超过容量*负载因子时触发扩容,每次扩容为原容量的2倍,扩容后重新计算哈希位置,迁移元素。4.特点:线程不安全,允许key和value为null(key只能一个null),无序存储。3.HashMap和HashTable的区别答案:1.线程安全:HashTable线程安全,所有方法加了synchronized锁;HashMap线程不安全。2.null值支持:HashTable不允许key和value为null;HashMap允许一个key为null,多个value为null。3.效率:HashTable加锁导致并发效率极低;HashMap无锁,单线程效率高。4.初始容量:HashTable默认初始容量11,扩容为2倍+1;HashMap默认16,扩容2倍。5.迭代方式:HashTable使用Enumeration迭代;HashMap使用Iterator迭代。补充:并发场景优先使用ConcurrentHashMap,不推荐HashTable。4.ConcurrentHashMap线程安全原理(JDK1.8)答案:JDK1.8放弃了分段锁机制,采用CAS+synchronized+数组+链表+红黑树实现线程安全。1.无冲突时:通过CAS自旋的方式插入元素,不加锁,效率高。2.发生哈希冲突时:只对当前数组下标位置的头节点加synchronized锁,不是锁整个集合,锁粒度极小,并发性能大幅提升。3.树结构冲突:如果该位置是红黑树节点,通过树节点的锁机制保证并发安全。同时它不允许key和value为null,避免空指针歧义,是高并发场景下的首选键值对集合。三、JVM与垃圾回收面试题1.JVM内存区域划分答案:JVM运行时数据区分为5大区域,其中线程私有3个,线程共享2个。线程私有(随线程创建销毁):1.程序计数器:记录当前线程执行的字节码行号,是唯一一个没有内存溢出的区域。2.虚拟机栈:存储方法栈帧、局部变量、操作数栈,方法调用和执行都在这里完成,栈深度过大会出现栈溢出。3.本地方法栈:作用和虚拟机栈类似,专门为Native本地方法服务。线程共享(随JVM启动销毁):1.堆内存:所有对象和数组的存储区域,是垃圾回收的主要区域,分为新生代、老年代。2.方法区:存储类信息、常量、静态变量、即时编译代码,JDK1.8后元空间取代永久代,元空间使用本地内存,不受JVM堆内存限制。2.垃圾回收的判定方法答案:JVM不会回收存活对象,只会回收没有任何引用的废弃对象,主要有两种判定方式:1.引用计数法:给对象添加引用计数器,有引用就+1,引用失效就-1,计数器为0则判定为垃圾。缺点是无法解决循环引用问题,主流JVM不再使用。2.可达性分析法(主流):以GCRoots为起始节点,向下遍历引用链,能够遍历到的对象是存活对象,没有遍历到的对象判定为垃圾。GCRoots包含:虚拟机栈中引用的对象、静态变量引用的对象、常量引用对象、本地方法栈引用对象。3.新生代和老年代垃圾回收算法答案:1.新生代:使用复制算法。新生代对象存活率低,大部分对象创建后很快失效。将内存分为Eden区和两个Survivor区,每次使用Eden和一个Survivor,回收时将存活对象复制到另一个Survivor区,清空原有区域,效率高、无内存碎片。2.老年代:使用标记清除、标记整理算法。老年代对象存活率高,复制算法成本太高。标记清除先标记存活对象、清除垃圾对象,速度快但会产生内存碎片;标记整理在标记清除基础上,将存活对象向一端移动,整理内存空间,无碎片但速度稍慢。4.MinorGC、MajorGC、FullGC区别答案:MinorGC:针对新生代的垃圾回收,发生频率高、速度快,触发后暂停时间短。MajorGC:针对老年代的垃圾回收,发生频率低、速度慢,耗时远高于MinorGC。FullGC:对整个堆内存(新生代+老年代+元空间)的全量回收,会暂停所有用户线程,系统卡顿严重,生产环境要尽量避免。触发场景:老年代空间不足、显式调用System.gc()、MinorGC后晋升到老年代的对象过大等。四、多线程与并发面试题1.线程和进程的区别答案:进程是操作系统资源分配的最小单位,线程是CPU调度的最小单位。1.资源占用:进程独立占用内存、CPU资源,进程之间完全隔离;线程共享所在进程的资源,独立栈内存,资源开销小。2.独立性:一个进程崩溃不会影响其他进程;一个线程异常崩溃,会导致整个进程崩溃。3.开销:进程创建、销毁、切换开销极大;线程开销极小,切换速度快。4.并发:进程是系统层面并发,线程是程序内部并发。2.线程的生命周期状态答案:Java线程共6种状态:新建、就绪、运行、阻塞、等待、超时等待、终止。1.NEW新建:创建线程对象,未调用start()方法。2.RUNNABLE就绪+运行:调用start()后进入就绪状态,获取CPU时间片后进入运行状态。3.BLOCKED阻塞:线程等待获取synchronized锁,锁被占用时进入阻塞状态。6.TERMINATED终止:线程代码执行完毕或异常退出,线程结束。3.synchronized和Lock的区别答案:1.底层实现:synchronized是JVM底层原生锁,隐式锁;Lock是Java代码层面的锁,是接口,常用实现类ReentrantLock。2.锁的释放:synchronized执行完代码块或异常时,自动释放锁;Lock需要手动加锁、手动解锁,必须在finally中解锁,否则会死锁。3.锁特性:synchronized不可中断、不支持公平锁、不能尝试获取锁;Lock支持可中断锁、公平锁、非公平锁,支持尝试获取锁、超时获取锁。4.条件等待:synchronized只有一个等待队列;Lock可以创建多个Condition条件队列,精准唤醒指定线程。使用场景:简单并发场景用synchronized,代码简洁不易出错;高并发、需要灵活锁机制的场景用ReentrantLock。4.volatile关键字的作用答案:volatile是轻量级同步关键字,主要有两个作用:1.保证可见性:一个线程修改了volatile修饰的变量,会立即刷新到主内存,其他线程能立刻感知到最新值,解决多线程变量缓存不一致问题。2.禁止指令重排:编译器和CPU不会对volatile变量的读写指令进行重排序,避免并发场景下的逻辑错乱。重点:volatile不保证原子性,类似i++这种复合操作,volatile无法保证线程安全,需要配合锁使用。五、Spring核心面试题1.SpringIOC原理答案:IOC即控制反转,核心是将对象的创建、管理、依赖注入权限交给Spring容器,不再由开发者手动new对象,反转了对象的控制权。执行流程:1.项目启动时,Spring加载配置类或配置文件,扫描所有带注解的Bean(@Component、@Service等)。2.根据扫描到的类信息,通过反射创建Bean实例。3.解析Bean之间的依赖关系,自动完成依赖注入。4.将初始化完成的Bean存入Spring单例池,全局复用。核心优势:解耦,降低代码耦合度,方便统一管理对象,便于后续AOP、事务等功能实现。2.SpringAOP原理及应用场景答案:AOP即面向切面编程,核心是在不修改原有业务代码的前提下,对方法进行增强,基于动态代理实现。核心原理:Spring会根据目标类是否有接口选择代理方式,有接口用JDK动态代理,无接口用CGLIB字节码增强代理,在方法执行前后、异常时切入增强逻辑。核心术语:切面、切点、通知(前置、后置、环绕、异常、最终通知)、连接点。常见应用场景:统一日志记录、统一权限校验、事务控制、接口耗时统计、异常统一处理、缓存控制。3.SpringBean的生命周期答案:完整生命周期分为7步:1.实例化:Spring通过反射创建Bean对象实例。2.属性填充:自动完成依赖注入,给Bean的属性赋值。3.前置处理:执行Bean后置处理器的前置方法,对Bean做预处理。4.初始化:执行InitializingBean的初始化方法、自定义init方法。5.后置处理:执行Bean后置处理器的后置方法,完成Bean最终增强。6.就绪使用:Bean完成初始化,存入单例池,供业务调用。7.销毁:容器关闭时,执行DisposableBean销毁方法、自定义destroy方法。4.Spring事务传播机制答案:事务传播机制是指多个带有事务的方法嵌套调用时,事务如何传递、生效,核心常用7种:1.REQUIRED(默认):如果当前有事务,加入当前事务;没有则新建事务。最常用,适合绝大多数业务。2.REQUIRES_NEW:无论当前是否有事务,都会新建一个独立事务,挂起原有事务,执行完再恢复。3.SUPPORTS:有事务就加入,无事务就非事务运行。4.NOT_SUPPORTED:始终以非事务方式运行,存在事务则挂起。5.MANDATORY:必须在事务内运行,无事务则直接报错。6.NEVER:必须非事务运行,存在事务则报错。7.NESTED:嵌套事务,有事务则在当前事务的保存点执行,可单独回滚;无事务则新建事务。六、MySQL数据库面试题1.InnoDB和MyISAM区别答案:1.事务支持:InnoDB支持事务、事务四大特性;MyISAM不支持事务。2.锁机制:InnoDB支持行级锁、表级锁,默认行锁,并发性能高;MyISAM只支持表级锁,并发读写冲突严重。3.外键:InnoDB支持外键约束;MyISAM不支持。4.崩溃恢复:InnoDB有日志机制,宕机后可恢复数据;MyISAM宕机易损坏数据,无法恢复。5.缓存:InnoDB支持数据和索引缓存;MyISAM只缓存索引。总结:现在业务库默认使用InnoDB,MyISAM仅适用于静态数据、纯查询场景。2.索引失效的常见场景答案:1.索引列使用模糊查询,以%开头(like'%xxx')。2.索引列参与运算、函数操作(如substr、sum、加减乘除)。3.索引列数据类型隐式转换,比如字符串字段传数字。4.使用or连接条件,且左右字段只有一个有索引。5.违背最左匹配原则,联合索引未使用最左侧字段。6.使用isnull、isnotnull导致索引失效。7.MySQL优化器判断全表扫描比索引查询更快,自动放弃索引。3.事务四大隔离级别及问题答案:事务隔离级别从低到高,解决的脏读、不可重复读、幻读问题逐步增多:1.读未提交:最低级别,能读取其他事务未提交数据,存在脏读、不可重复读、幻读。2.读已提交(Oracle默认):只能读取已提交数据,解决脏读,存在不可重复读、幻读。3.可重复读(MySQL默认):同一事务多次查询结果一致,解决脏读、不可重复读,存在幻读。4.串行化:最高级别,事务串行执行,解决所有并发问题

温馨提示

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

评论

0/150

提交评论