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

下载本文档

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

文档简介

Java高频面试题合集(含详细实战答案)一、Java基础核心面试题1.JDK、JRE、JVM的区别与联系?答案:JVM是Java虚拟机,是运行Java字节码的核心载体,也是Java跨平台的根本原因,只负责解析运行.class文件,不包含编译工具。JRE是Java运行环境,包含JVM+Java核心运行类库(rt.jar等),日常运行Java程序只需要安装JRE,无法编译Java代码。JDK是Java开发工具包,包含JRE+开发编译工具(javac、java、jar等),开发、编译、调试Java程序必须安装JDK。层级关系:JDK⊃JRE⊃JVM2.==和equals()的区别?答案:==是运算符,可用于基本数据类型和引用数据类型:基本类型比较数值是否相等;引用类型比较对象内存地址是否相同,即是否是同一个对象。equals()是Object类的方法,默认实现和==一致,比较对象地址。但String、Integer等包装类重写了该方法,重写后只比较对象内容是否一致,不比较地址。实战总结:比较字符串、包装类内容一律用equals;判断对象是否为同一实例用==。3.String、StringBuilder、StringBuffer的区别?答案:1.可变性:String是不可变字符串,每次拼接、修改都会生成新字符串对象;StringBuilder、StringBuffer是可变字符串,修改操作直接在原对象执行,不会产生新对象。2.线程安全:StringBuffer所有方法加了synchronized锁,线程安全,多线程场景可用;StringBuilder无锁,线程不安全,性能更高。3.性能:单线程下StringBuilder>StringBuffer>String;频繁字符串拼接禁止直接使用String。业务场景:单线程拼接用StringBuilder;多线程拼接用StringBuffer;固定不变的字符串定义用String。4.基本数据类型和包装类的区别?自动装箱与拆箱?答案:Java有8种基本数据类型(byte、short、int、long、float、double、char、boolean),直接存储数值,占用内存小,无对象属性和方法。对应的包装类(Byte、Short、Integer等)是对象类型,继承Object,具备对象方法,可用于泛型、集合存储(集合只能存对象,不能存基本类型)。自动装箱:基本类型自动转为包装类,如Integera=10;自动拆箱:包装类自动转为基本类型,如intb=a;高频坑点:Integer缓存范围是-128~127,该范围内的数值装箱会复用缓存对象,==结果为true;超出范围会新建对象,==结果为false,比较数值必须用equals。5.final、finally、finalize的区别?答案:1.final是修饰符:修饰变量表示常量,不可二次赋值;修饰方法不可重写;修饰类不可被继承。2.finally是异常处理关键字:搭配try-catch使用,无论代码正常执行还是抛出异常,最终都会执行,常用于关闭流、释放资源。3.finalize是Object类的废弃方法:JVM垃圾回收前会调用该方法,用于对象资源收尾,执行时机不确定,生产环境不推荐使用,已被废弃。6.接口和抽象类的区别?答案:1.定义关键字:抽象类用abstractclass,接口用interface。2.继承限制:类只能单继承抽象类,但可以多实现接口。3.成员特性:抽象类可包含普通变量、常量、构造方法、普通方法、抽象方法;接口(JDK8前)只能有常量和抽象方法,JDK8支持默认方法、静态方法,JDK9支持私有方法。4.设计思想:抽象类是模板复用,抽取子类通用属性和行为;接口是行为规范,定义统一的功能标准。二、Java集合面试题1.ArrayList和LinkedList的区别?答案:1.底层结构:ArrayList基于动态数组;LinkedList基于双向链表。2.查询效率:ArrayList支持随机访问,根据下标查询速度极快;LinkedList只能从头节点遍历查询,效率低。3.增删效率:首尾增删数据时,LinkedList无需移动元素,效率更高;ArrayList增删中间元素需要批量移动数组元素,效率低。4.内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点包含前后指针,单个元素占用内存更大。实战场景:查询多、增删少用ArrayList;频繁首尾增删、极少查询用LinkedList。2.HashMap的底层原理?JDK1.7和JDK1.8的区别?答案:底层核心原理:HashMap基于「数组+链表+红黑树」实现,通过hash算法计算元素下标,解决hash冲突后存储数据,默认初始容量16,负载因子0.75,容量满75%触发扩容。JDK1.7与1.8核心区别:1.数据结构:1.7只有数组+链表;1.8新增红黑树,链表长度≥8且数组容量≥64时,链表转为红黑树,查询效率从O(n)优化为O(logn)。2.插入方式:1.7链表头插法;1.8链表尾插法,解决了多线程扩容导致的循环链表死循环问题。3.扩容优化:1.8扩容后元素无需重新计算hash,只需根据高位哈希值判断新旧下标,效率更高。3.HashMap为什么线程不安全?并发场景用什么替代?答案:HashMap线程不安全核心原因:多线程同时put、扩容、迁移数据时,会出现数据覆盖、丢失、链表循环、死循环CPU100%等问题。并发替代方案:1.Hashtable:全局锁,线程安全但并发性能极差,基本废弃;2.Collections.synchronizedMap:包装HashMap,锁粒度大,性能一般;3.ConcurrentHashMap:分段锁(1.7)/CAS+synchronized锁桶(1.8),并发性能最优,是生产唯一推荐方案。4.HashSet的底层原理?答案:HashSet底层直接复用HashMap,存储元素时,将存入的值作为HashMap的key,固定PRESENT常量作为value。因此HashSet去重原理和HashMapkey去重一致:先对比hash值,再通过equals对比内容,全部相同则判定为重复元素,不存入。HashSet无序、不可重复、允许存null值,线程不安全。三、多线程与并发面试题1.线程和进程的区别?答案:1.进程:操作系统资源分配的最小单位,独立占用内存、CPU资源,进程间完全隔离,通信成本极高。2.线程:CPU调度的最小单位,隶属于进程,一个进程包含多个线程,线程间共享进程资源(堆内存、方法区),栈内存独立,通信成本低。核心特点:进程崩溃不影响其他进程;一个线程崩溃会导致所属整个进程崩溃。2.实现多线程的几种方式?答案:1.继承Thread类:重写run()方法,无法继承其他类,局限性大,不推荐;2.实现Runnable接口:重写run()方法,无返回值、无异常抛出,可多继承,通用;3.实现Callable接口:重写call()方法,有返回值、可抛出异常,可搭配FutureTask获取线程执行结果;4.线程池创建线程:通过Executors或ThreadPoolExecutor创建,生产环境唯一推荐,避免频繁创建销毁线程损耗资源。3.synchronized和Lock的区别?答案:1.语法层面:synchronized是Java内置关键字,底层JVM实现;Lock是接口,JDK代码层面实现(如ReentrantLock)。2.锁特性:synchronized自动加锁、自动释放锁,无需手动控制;Lock需要手动lock()加锁、unlock()解锁,必须在finally中释放,避免死锁。3.灵活性:Lock可实现可中断锁、超时锁、公平锁、读写锁;synchronized仅支持非公平锁,功能单一。4.性能:JDK1.6后synchronized做了偏向锁、轻量级锁、重量级锁优化,性能大幅提升,日常场景两者性能相近;高并发细粒度锁场景优先用Lock。4.线程池的核心参数?核心线程数怎么设置?答案:ThreadPoolExecutor七大核心参数:1.corePoolSize:核心线程数,线程池常驻线程,不会被回收;2.maximumPoolSize:最大线程数,任务爆满时创建的临时线程上限;3.keepAliveTime:临时线程空闲超时时间,超时自动回收;4.unit:超时时间单位;5.workQueue:任务阻塞队列,存储等待执行的任务;6.threadFactory:线程工厂,创建线程,可自定义线程名、优先级;7.handler:拒绝策略,任务超出最大承载时的处理策略。核心线程数配置经验:CPU密集型任务:核心线程数=CPU核心数+1;IO密集型任务:核心线程数=CPU核心数*2;生产环境根据接口压测结果微调,禁止直接使用Executors默认线程池。四、JVM面试题1.JVM内存区域划分?各区域作用?答案:JVM运行时数据区分为5个部分:1.程序计数器:线程私有,记录当前线程执行的字节码行号,是唯一无OOM的内存区域。2.虚拟机栈:线程私有,存储局部变量、方法栈帧、操作数栈,方法执行完毕栈帧销毁,栈溢出会抛出StackOverflowError。3.本地方法栈:线程私有,为JNI本地方法(native方法)服务。4.堆内存:线程共享,所有对象、数组实例都在堆中分配,是垃圾回收的核心区域,容易发生OOM。5.方法区:线程共享,存储类信息、常量、静态变量、即时编译代码,JDK1.8后改为元空间,使用本地内存,不再占用堆内存。2.垃圾回收机制GC原理?哪些对象会被回收?答案:GC核心是自动识别堆中无效对象,释放空闲内存,避免内存泄漏。无效对象指没有任何有效引用指向的对象。判定垃圾对象的两种算法:1.引用计数法:对象被引用+1,引用失效-1,计数为0则回收,无法解决循环引用问题;2.可达性分析法(JVM默认):以GCRoots为起点遍历,不可到达的对象判定为垃圾对象。GCRoots包含:虚拟机栈引用的对象、静态变量引用对象、常量引用对象、本地方法栈引用对象。3.新生代、老年代垃圾回收特点?答案:堆内存分为新生代(Eden、From、To)和老年代:1.新生代:存放新建对象,对象存活率低、回收频繁,使用复制算法,MinorGC速度快;大部分对象创建后快速死亡。2.老年代:存放存活久、大对象,对象存活率高、回收频率低,使用标记清除、标记整理算法,FullGC速度慢、耗时久,生产环境需尽量避免频繁FullGC。4.常见OOM原因及解决方案?答案:常见OOM场景:1.堆内存溢出:创建大量大对象、集合无限添加元素、内存泄漏;2.栈内存溢出:递归死循环、方法嵌套过深;3.元空间溢出:动态生成大量类、频繁热部署。解决方案:1.通过jmap、jhat、Arthas分析堆快照,定位大对象、泄漏对象;2.优化代码,避免集合不清理、静态集合常驻内存;3.合理调整JVM参数,优化堆内存、元空间大小;4.分批处理大数据量任务,避免一次性加载全部数据。五、Spring核心面试题1.SpringIOC原理?答案:IOC即控制反转,核心是将对象的创建、管理、依赖注入权限交给Spring容器,摆脱代码主动new对象的硬编码方式。执行流程:1.启动项目,Spring扫描指定包下的注解类(@Component、@Service等);2.解析配置,通过反射创建Bean实例;3.完成Bean的依赖注入、初始化操作;4.将完整Bean放入IOC容器缓存,供业务代码直接使用。核心优势:解耦代码、统一管理对象、方便后续AOP、事务等功能扩展。2.SpringAOP原理及应用场景?答案:AOP即面向切面编程,基于动态代理实现,在不修改原有业务代码的前提下,对方法进行增强,实现功能复用。代理规则:目标类有接口用JDK动态代理(基于接口);无接口用CGLIB代理(基于子类继承)。常用应用场景:统一日志记录、权限校验、事务控制、接口限流、性能耗时统计、缓存处理。3.SpringBean的生命周期?答案:1.实例化:Spring通过反射创建Bean空对象;2.属性填充:完成依赖注入,给对象属性赋值;3.初始化:执行各种前置后置处理器、执行init初始化方法;4.就绪使用:Bean初始化完成,放入容器供业务调用;5.销毁:容器关闭时,执行destroy销毁方法,释放资源。4.Spring事务传播机制有哪些?常用场景?答案:Spring共7种事务传播机制,高频常用4种:1.REQUIRED(默认):有事务加入当前事务,无事务新建事务,最常用;2.SUPPORTS:有事务就参与,无事务就非事务执行;3.REQUIRES_NEW:无论是否有事务,都新建独立事务,嵌套事务互不影响;4.NESTED:有事务则嵌套在当前事务中,无事务新建事务,支持部分回滚。高频坑点:同类中方法内部调用@Transactional方法,事务会失效,原因是AOP代理失效,可通过自身代理对象调用解决。六、数据库与MyBatis面试题1.MySQL索引原理?B+树索引优势?答案:MySQLInnoDB引擎默认使用B+树作为索引结构。B+树是多路平衡查找树,所有数据都存储在叶子节点,非叶子节点只存储索引键,用于快速定位数据。B+树核心优势:1.层级少,磁盘IO次数少,查询速度快;2.所有叶子节点有序串联,范围查询、排序查询效率极高;3.非叶子节点不存数据,内存占用小,可缓存更多索引,提升查询效率。2.什么是索引失效?常见失效场景?答案:索引失效指查询语句本该走索引,却因写法问题触发全表扫描,严重影响性能。常见失效场景:1.索引列使用函数、运

温馨提示

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

评论

0/150

提交评论