Java面试题全集(完整版·真实职场版)_第1页
Java面试题全集(完整版·真实职场版)_第2页
Java面试题全集(完整版·真实职场版)_第3页
Java面试题全集(完整版·真实职场版)_第4页
Java面试题全集(完整版·真实职场版)_第5页
已阅读5页,还剩8页未读, 继续免费阅读

下载本文档

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

文档简介

Java面试题全集(完整版·真实职场版)本文整理互联网大厂、中小企业高频Java面试题,覆盖Java基础、面向对象、集合、异常、IO、多线程、JVM、Spring全家桶、数据库、Redis、MQ、微服务、算法等核心模块,所有题目及答案贴合真实面试场景,无书面化空话,适用于初级、中级Java开发求职面试复习。一、Java基础核心面试题1.JDK、JRE、JVM的区别与联系标准答案:JVM是Java虚拟机,是Java程序运行的核心载体,负责加载class文件、解释/编译代码、内存管理、垃圾回收,是Java跨平台的根本,只负责运行程序,不包含编译工具。JRE是Java运行环境,包含JVM+Java核心类库(rt.jar等),只用于运行Java程序,普通用户运行Java软件只需安装JRE。JDK是Java开发工具包,包含JRE+开发编译工具(javac、java、jar、jmap等),是开发人员编写、编译、调试Java程序的必备环境。层级关系:JDK⊃JRE⊃JVM2.Java基本数据类型有哪些?区别是什么?Java共8种基本数据类型,分为四类,区别在于占用字节、取值范围、默认值不同:整数型:byte(1字节)、short(2字节)、int(4字节)、long(8字节,赋值需加L/l)浮点型:float(4字节,赋值需加F/f)、double(8字节,默认浮点类型)字符型:char(2字节,存储单个字符,支持中文)布尔型:boolean(1字节,只有true/false,无默认数值)基本类型直接存储数值,存放在栈内存,赋值是值传递;区别于包装类(引用类型),包装类存对象地址,在堆内存创建对象。3.==和equals()的区别基础规则:==是比较运算符,可用于基本类型和引用类型:基本类型比较数值是否相等;引用类型比较对象内存地址是否相同。equals()是Object类的方法,默认实现和==一致(比较地址),但String、Integer等类重写了该方法,用于比较对象内容是否相等。面试高频总结:比较字符串、包装类内容是否一致,必须用equals;比较基本类型数值用==。4.String、StringBuilder、StringBuffer的区别String:不可变字符序列,底层final数组,每次拼接都会生成新对象,频繁字符串拼接效率极低,适合少量固定字符串。StringBuffer:可变字符序列,线程安全(所有方法加synchronized锁),效率低,适合多线程环境字符串拼接。StringBuilder:可变字符序列,线程不安全,无锁,效率最高,单线程开发首选(日常开发99%场景使用)。核心结论:少量拼接用String,单线程大量拼接用StringBuilder,多线程大量拼接用StringBuffer。5.final、finally、finalize的区别final:修饰符。修饰变量:常量,不可二次赋值;修饰方法:不可重写;修饰类:不可继承。finally:异常处理关键字,搭配try-catch使用,无论代码是否异常,最终都会执行(除JVM退出等极端情况),常用于关闭流、释放资源。finalize:Object类的废弃方法,垃圾回收器回收对象前调用,无法保证执行时机,开发中禁止使用。6.接口和抽象类的区别对比维度抽象类接口继承方式单继承(extends)多实现(implements)成员变量可定义普通变量、常量默认是publicstaticfinal常量构造方法有构造方法,用于子类初始化无构造方法方法修饰普通方法、抽象方法均可JDK8前只有抽象方法,JDK8支持默认/静态方法,JDK9支持私有方法设计思想模板复用,定义子类通用模板行为规范,定义类的功能标准7.重载和重写的区别重载(Overload):同一个类中,方法名相同,参数列表(个数、类型、顺序)不同,与返回值、修饰符无关,属于编译期多态。重写(Override):子类对父类非final、非private、非static方法的重新实现,方法名、参数列表、返回值必须一致,访问权限不低于父类,属于运行期多态。8.Java泛型的作用、原理、泛型擦除作用:编译期类型校验,避免类型转换异常,减少强制类型转换代码,提高代码复用性。原理(泛型擦除):Java泛型是伪泛型,编译时生效,编译后的class文件会擦除泛型信息,统一替换为Object或上限类型,运行期无泛型。二、Java集合高频面试题1.ArrayList和LinkedList的区别底层结构:ArrayList基于动态数组;LinkedList基于双向链表。查询效率:ArrayList随机查询快(数组下标寻址);LinkedList随机查询慢,需遍历节点。增删效率:ArrayList末尾增删快,中间增删需移动元素;LinkedList任意位置增删只需修改节点指针,效率更高。内存占用:ArrayList有数组扩容冗余空间;LinkedList每个节点存储前后指针,内存占用更高。开发选型:查询多、增删少用ArrayList;频繁中间增删用LinkedList。2.HashMap底层原理(必背)JDK1.8及以上HashMap底层:数组+链表+红黑树,默认初始容量16,负载因子0.75。存储流程:通过key的hash值计算数组下标,定位存储位置;若位置无元素,直接存入数组;若有元素,发生hash冲突,遍历链表对比key;key相同则覆盖value,key不同则追加链表节点;链表长度≥8且数组容量≥64,链表转为红黑树;链表长度≤6,红黑树退化为链表。扩容机制:元素数量>容量*负载因子,自动扩容为原容量2倍,重新hash迁移元素。3.HashMap为什么线程不安全?ConcurrentHashMap如何保证线程安全HashMap线程不安全问题:多线程put时会出现数据覆盖、链表环形死循环、数据丢失等问题,JDK1.7扩容死循环问题严重,JDK1.8优化但仍不安全。ConcurrentHashMap线程安全方案(JDK1.8):采用CAS+synchronized实现分段锁,不再使用分段数组。锁住当前数组下标对应的节点,不同下标节点可并发操作,锁粒度极细,并发效率高。底层同样是数组+链表+红黑树,保证并发安全且性能优于Hashtable。4.HashSet底层原理HashSet底层直接封装HashMap,存储元素时,将元素作为HashMap的key,value统一为固定空对象。因此HashSet去重规则和HashMapkey去重规则一致:先对比hash值,再通过equals判断内容。5.集合遍历中为什么不能删除元素?迭代器原理普通for/增强for遍历集合时,直接调用集合remove方法,会修改集合modCount(修改次数),与迭代器expectedModCount不一致,触发并发修改异常ConcurrentModificationException。正确做法:使用迭代器Iterator的remove方法,可同步更新计数,避免异常。三、Java异常面试题1.异常分类体系Java异常分为两大类,均继承自Throwable:Error(错误):系统级严重错误,无法处理,如OOM、栈溢出、虚拟机异常,程序直接崩溃。Exception(异常):可处理的异常,分为编译时异常和运行时异常。编译时异常(受检异常):必须捕获或抛出,如IO异常、SQL异常。运行时异常(非受检异常):RuntimeException,代码逻辑问题导致,可不用捕获,如空指针、数组越界、类型转换异常。2.try-catch-finally执行顺序,return和finally优先级正常流程:try执行→无异常跳过catch→执行finally。异常流程:try报错→执行对应catch→执行finally。核心考点:try/catch中有return时,finally依然会在return执行前执行;若finally中存在return,会覆盖上层return结果,开发中禁止在finally写return。四、IO与新IO面试题BIO(同步阻塞):传统IO,一个请求一个线程,线程阻塞等待数据,并发量低,资源消耗大。NIO(同步非阻塞):JDK1.4推出,缓冲区+通道+选择器,单线程可处理多个请求,线程不阻塞,高并发首选,Netty底层基于NIO。2.字节流和字符流区别字节流:操作字节(byte),万能流,可处理所有文件(图片、视频、文档、文本),基类InputStream/OutputStream。字符流:操作字符,仅处理文本文件,自带编码转换,基类Reader/Writer,可避免中文乱码。五、多线程与并发面试题(核心重点)1.线程和进程的区别进程:操作系统资源分配的最小单位,独立占用内存资源,进程间互不干扰,切换开销大。线程:进程内的执行单元,CPU调度的最小单位,共享进程内存资源,切换开销小,也叫轻量级进程。一个进程至少包含一个主线程,多线程可提高程序并发执行效率。2.线程的五种状态新建、就绪、运行、阻塞、终止。核心流转:新建线程启动后进入就绪态→获取CPU时间片进入运行态→等待资源/休眠进入阻塞态→资源就绪回到就绪态→代码执行完毕进入终止态。3.实现多线程的四种方式继承Thread类,重写run方法(无返回值,无法复用);实现Runnable接口,重写run方法(无返回值,推荐,避免单继承限制);实现Callable接口,重写call方法(有返回值、可抛异常,配合FutureTask使用);线程池创建线程(开发唯一推荐方式,减少线程创建销毁开销)。4.synchronized和Lock锁的区别对比维度synchronizedLock(ReentrantLock)类型JVM内置关键字,隐式锁Java代码实现的显式锁锁释放代码执行完毕/异常自动释放必须手动unlock释放,否则死锁锁特性不可中断、非公平锁、不能超时可中断、可公平/非公平、可超时锁条件等待只有wait/notify随机唤醒多个Condition,精准唤醒指定线程性能JDK1.6后优化,性能大幅提升高并发场景性能更优5.volatile关键字作用三大核心作用:保证可见性、禁止指令重排、不保证原子性。可见性:多线程下,一个线程修改volatile变量,其他线程立即感知最新值;指令重排:禁止编译器和CPU对代码进行重排序优化,解决单例模式DCL重排问题;注意:volatile不能保证复合操作(i++)原子性,需配合锁使用。6.线程池核心参数、七大参数、四种拒绝策略线程池七大核心参数:核心线程数、最大线程数、空闲超时时间、时间单位、任务队列、线程工厂、拒绝策略。任务执行流程:新任务到来,核心线程数未满,创建核心线程执行任务;核心线程已满,任务进入阻塞队列;队列已满,未达到最大线程数,创建非核心线程;达到最大线程数,触发拒绝策略。四种拒绝策略:AbortPolicy:直接抛出异常(默认);CallerRunsPolicy:调用者线程自行执行任务;DiscardPolicy:直接丢弃任务,无异常;DiscardOldestPolicy:丢弃队列最旧任务,执行新任务。7.死锁产生的四个必要条件及解决方案四大必要条件:互斥条件、请求与保持、不可剥夺、循环等待。解决思路:破坏任意一个条件即可,最常用破坏循环等待,统一锁的获取顺序。六、JVM面试题(中高级必问)1.JVM内存区域划分JVM运行时数据区分为5大区域:程序计数器:线程私有,记录当前线程执行行号,唯一无OOM的区域;虚拟机栈:线程私有,存储局部变量、方法栈帧,栈溢出、局部变量OOM;本地方法栈:线程私有,执行native本地方法;堆内存:线程共享,所有对象、数组存储区域,GC主要回收区域,分新生代、老年代;方法区(元空间):线程共享,存储类信息、常量、静态变量、编译后的代码,JDK1.8由永久代改为元空间,使用本地内存。2.GC垃圾回收机制、哪些对象会被回收GC核心是回收堆中无有效引用的对象。判断垃圾对象算法:可达性分析算法(主流),以GCRoots为起点,不可到达的对象判定为垃圾。GCRoots包含:虚拟机栈引用对象、本地方法栈引用对象、方法区静态变量/常量引用对象。3.新生代、老年代GC特点,MinorGC、FullGCMinorGC:新生代垃圾回收,频率高、速度快,采用复制算法,触发时机:新生代内存不足。FullGC:整堆回收(新生代+老年代+元空间),频率低、速度慢、STW时间长,触发时机:老年代不足、显式调用System.gc、MinorGC后晋升失败。4.常见垃圾回收器及优缺点Serial:单线程回收,适合客户端程序;Parallel:多线程并行回收,注重吞吐量,JDK默认;CMS:并发低停顿,注重用户体验,内存碎片多;G1:分区回收,兼顾吞吐量和低停顿,大内存首选;ZGC:超低延迟,超大内存,JDK17主流。5.OOM常见原因及排查思路常见OOM场景:内存泄漏、集合无限扩容、死循环创建对象、静态集合持有对象、线程过多、元空间加载类过多。排查步骤:查看异常日志→导出堆快照→使用jmap/jhat/VisualVM分析→定位大对象、泄漏对象→修复代码。七、Spring核心面试题1.Spring的核心思想两大核心:IOC(控制反转)、AOP(面向切面编程)IOC:将对象的创建、管理、依赖注入交给Spring容器,解除代码耦合;AOP:在不修改原有代码的前提下,对方法进行增强,实现日志、事务、权限、监控等通用功能。2.IOC容器初始化流程加载配置文件/注解,扫描所有Bean;解析Bean定义,封装为BeanDefinition;注册Bean定义到注册表;单例Bean提前初始化,通过反射创建对象;完成依赖注入、初始化方法执行;容器刷新完成,可供业务使用。3.Bean的生命周期实例化→依赖注入→初始化(前置处理、init方法、后置处理)→就绪使用→容器关闭销毁。4.Spring事务传播机制、隔离级别七大传播机制(高频3种):REQUIRED:默认,有事务加入,无事务新建;SUPPORTS:有事务加入,无事务非事务运行;REQUIRES_NEW:新建独立事务,挂起原有事务。四大隔离级别:读未提交、读已提交(Oracle默认)、可重复读(MySQL默认)、串行化。5.SpringAOP的实现原理AOP底层基于动态代理:目标类有接口:使用JDK动态代理;目标类无接口:使用CGLIB字节码增强代理。通过切点匹配目标方法,在前后植入通知逻辑,实现无侵入增强。八、SpringBoot面试题1.SpringBoot自动配置原理核心注解@EnableAutoConfiguration,基于SPI机制:读取META-INF/spring.factories配置文件,加载场景自动配置类,根据条件注解(@Conditional)按需创建Bean,无需手动XML配置,实现开箱即用。2.SpringBoot启动流程初始化SpringApplication参数;启动内嵌Tomcat容器;加载自动配置类、扫描Bean;刷新IOC容器,完成初始化;执行启动后置钩子方法。3.SpringBoot常用注解@SpringBootApplication、@Configuration、@Bean、@Autowired、@Resource、@RequestMapping、@Transactional、@Conditional系列、@Value等。九、MySQL数据库面试题1.InnoDB和MyISAM的区别事务支持:InnoDB支持事务、ACID;MyISAM不支持。锁机制:InnoDB行锁+表锁;MyISAM只有表锁。并发能力:InnoDB并发高;MyISAM读写互斥,并发低。崩溃恢复:InnoDB支持事务日志,可恢复数据;MyISAM崩溃易损坏。外键:InnoDB支持外键;MyISAM不支持。开发选型:业务系统全部使用InnoDB。2.MySQL索引原理、B+树优势InnoDB索引底层采用B+树。B+树优势:非叶子节点只存索引键,不存数据,层级更少,查询速度快;所有数据都在叶子节点,叶子节点有序链表,适合范围查询、排序、分页;磁盘IO次数少,检索效率稳定。3.聚簇索引和非聚簇索引区别聚簇索引:主键索引,叶子节点存储整行数据,一张表只有一个。非聚簇索引:普通索引、唯一索引,叶子节点存储主键值,查询需回表查主键索引获取完整数据。4.慢SQL优化方案开启慢查询日志,定位慢SQL;使用explain分析执行计划,查看索引失效、全表扫描问题;合理建立联合索引,遵循最左匹配原则;避免索引失效:不使用select*、不函数运算、不隐式类型转换、不or拼接无索引字段;优化分页、避免深分页,使用主键分页;大表分库分表、读写分离。5.事务四大特性ACID原子性、一致性、隔离性、持久性。十、Redis高频面试题1.Redis为什么快基于内存操作,无磁盘IO开销;单线程模型,无线程竞争、无锁开销;IO多路复用,单线程处理大量客户端连接;数据结构简单,底层优化极致。2.Redis过期淘汰策略定期删除+惰性删除+内存淘汰策略。常用内存淘汰:volatile-lru(过期key最少使用淘汰)、allkeys-lru(所有key最少使用淘汰)。3.Redis缓存穿透、击穿、雪崩解决方案缓存穿透:查询不存在数据,绕过缓存查数据库。方案:布隆过滤器、空值缓存、接口校验。缓存击穿:热点key过期,大量请求打数据库。方案:互斥锁、热点key永不过期。缓存雪崩:大量key同时过期/缓存宕机,流量全部打数据库。方案:过期时间随机化、集群高可用、限流降级、多级缓存。4.Redis持久化机制RDB和AOFRDB:定时快照持久化,

温馨提示

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

最新文档

评论

0/150

提交评论