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

下载本文档

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

文档简介

Java高频面试题及详细答案(企业实战版)一、Java基础面试题1、JDK、JRE、JVM的区别是什么?详细答案:三者是层层包含的关系,范围从大到小依次是JDK>JRE>JVM。JVM是Java虚拟机,是Java程序运行的核心载体,只负责解析和执行字节码文件(.class),不包含任何开发工具,是整个Java跨平台的核心,不同系统有对应适配的JVM。JRE是Java运行环境,包含JVM+Java核心运行类库。如果只是运行别人写好的Java程序,只需要安装JRE即可,它不具备代码编译、调试等开发功能。JDK是Java开发工具包,包含JRE+开发工具(javac编译器、debug调试工具、jar打包工具等)。做Java开发必须安装JDK,既能运行程序,也能开发、编译、调试代码。2、==和equals()的区别?详细答案:==是运算符,equals()是Object类的方法,二者比对逻辑完全不同。基本数据类型使用==,比对的是变量的实际数值;引用数据类型使用==,比对的是对象的内存地址,也就是判断两个引用是否指向同一个对象。equals()方法默认也是比对对象内存地址,和==效果一致。但像String、Integer这类常用类,都重写了equals()方法,重写后不再比对地址,而是比对对象的内容值。日常开发中,比对字符串、对象内容是否一致,统一使用equals();比对基本类型数值、判断对象是否为同一内存地址,使用==。3、String、StringBuilder、StringBuffer的区别?详细答案:核心区别在于可变性、线程安全、性能三个维度。String是不可变字符串,底层是被final修饰的字符数组。每次对String进行拼接、修改操作,都会生成新的字符串对象,频繁操作会产生大量无用对象,占用内存,性能最差。适用于字符串内容固定、极少修改的场景。StringBuilder和StringBuffer是可变字符串,底层数组没有final修饰,修改内容不会创建新对象,性能远高于String。其中StringBuffer所有方法都加了synchronized锁,是线程安全的,但因为锁的竞争,性能偏低;StringBuilder没有加锁,线程不安全,但是性能最优。使用场景总结:少量字符串操作用String;单线程频繁拼接字符串用StringBuilder;多线程环境下频繁操作字符串用StringBuffer。4、final、finally、finalize的区别?详细答案:三个关键字功能完全无关,属于高频易混考点。final是修饰符,可以修饰类、方法、变量。修饰类时类不能被继承;修饰方法时方法不能被重写;修饰变量时变量变为常量,基本类型数值不可改,引用类型地址不可改。finally是异常处理的关键字,搭配try-catch使用。它的代码块一定会执行(除了极端退出场景,如System.exit(0)),日常主要用于释放资源,比如关闭流、关闭数据库连接。finalize()是Object类的废弃方法,JDK9之后已被标记过时。它的作用是在垃圾回收器回收对象之前,触发该方法执行收尾操作,但是执行时机不确定,无法依赖,实际开发中基本不用。5、接口和抽象类的区别?详细答案:1、定义区别:抽象类用abstract修饰,接口用interface定义。2、继承区别:类只能单继承一个抽象类,但可以多实现多个接口,解决了单继承的局限性。3、成员区别:抽象类可以有构造方法、普通成员变量、静态变量、普通方法、抽象方法;JDK8之前接口只能有常量和抽象方法,JDK8新增默认方法、静态方法,JDK9新增私有方法,没有构造方法。4、设计理念:抽象类是模板复用,用于抽取子类的公共属性和行为;接口是行为规范,定义类需要具备的功能,不关心具体实现。5、访问修饰符:抽象类成员可以用任意修饰符;接口默认方法为public,常量默认publicstaticfinal。二、Java集合面试题1、ArrayList和LinkedList的区别?详细答案:底层结构和性能场景是核心区别。ArrayList底层是动态数组,内存地址连续。优点是支持随机访问,通过下标查询速度极快;缺点是增删元素时,需要移动数组元素,数据量大时效率低,且线程不安全。LinkedList底层是双向链表,内存地址不连续,每个节点存储前驱、后继指针和数据。优点是增删元素只需要修改节点指针,无需移动数据,增删效率高;缺点是不支持随机访问,查询需要从头遍历,查询效率低,同样线程不安全。场景选择:大量查询、少量增删用ArrayList;大量增删、少量查询用LinkedList。2、HashMap的底层原理?JDK1.7和JDK1.8的区别?详细答案:HashMap是基于哈希表实现的键值对集合,核心作用是高效存取数据,线程不安全,允许key、value为null。底层核心逻辑:通过key的哈希值计算数组下标,将元素存入对应位置;出现哈希冲突时,采用链表/红黑树解决冲突。JDK1.7底层:数组+单向链表。采用头插法插入元素,哈希冲突严重时链表过长,查询效率极低,且存在循环链表死循环问题,并发场景下会报错。JDK1.8优化:1、底层结构改为数组+单向链表+红黑树,链表长度超过8且数组容量大于64时,链表转为红黑树,大幅提升查询效率;2、插入方式改为尾插法,彻底解决并发扩容的循环链表问题;3、优化哈希算法,减少哈希冲突概率;4、扩容时机、阈值计算逻辑优化,性能更稳定。3、HashMap和ConcurrentHashMap的区别?详细答案:1、线程安全:HashMap线程不安全,并发读写会出现数据覆盖、死循环等问题;ConcurrentHashMap是线程安全的,专门用于并发场景。2、锁机制:JDK1.7的ConcurrentHashMap采用分段锁,将数组分为多个分段,只锁定当前操作分段,并发度高;JDK1.8放弃分段锁,采用CAS+synchronized锁,只锁定当前哈希桶节点,锁粒度更细,性能更好。3、null值支持:HashMap允许key和value为null;ConcurrentHashMap不允许key、value为null,避免并发场景下空指针歧义问题。4、使用场景:单线程场景优先用HashMap,性能更高;多线程并发存取场景必须用ConcurrentHashMap。三、多线程面试题1、线程和进程的区别?详细答案:进程是操作系统资源分配的最小单位,线程是CPU调度执行的最小单位。一个进程可以包含多个线程,多个线程共享进程的堆内存、方法区资源;每个线程有独立的栈内存、程序计数器,互不干扰。进程之间相互独立,资源不共享,切换开销大;线程共享进程资源,切换开销极小,并发效率更高。简单来说:进程是程序的一次独立运行,线程是进程内部的细分执行单元,是真正干活的载体。2、synchronized和Lock的区别?详细答案:1、锁类型:synchronized是JVM底层实现的内置锁,属于隐式锁;Lock是Java代码层面实现的显式锁,需要手动加锁、解锁。2、灵活性:synchronized锁的获取和释放由系统自动控制,无法中断、无法超时;Lock可以设置超时时间、可中断锁、可尝试获取锁,灵活性极高。3、锁粒度:synchronized可以修饰方法、代码块,锁粒度较粗;Lock可以精准控制锁的范围,粒度更细。4、性能:JDK1.6之后synchronized做了大量优化(偏向锁、轻量级锁、重量级锁),性能大幅提升,低并发场景下和Lock差距不大;高并发竞争激烈场景下,Lock性能更优。5、功能扩展:Lock可以实现读写分离锁(ReentrantReadWriteLock),读多写少场景大幅提升并发效率,synchronized不支持。3、线程的生命周期有哪些状态?详细答案:Java线程一共6种状态,由Thread.State枚举定义:1、新建(NEW):线程对象创建完成,未调用start()方法,未启动;2、就绪(RUNNABLE):调用start()后,线程准备就绪,等待CPU调度执行;3、运行(RUNNING):CPU分配时间片,线程正在执行代码逻辑;4、阻塞(BLOCKED):线程等待获取同步锁,锁被其他线程占用时进入阻塞状态;7、终止(TERMINATED):线程代码执行完毕,或异常终止,生命周期结束。四、JVM面试题1、JVM内存区域划分?详细答案:JVM运行时数据区分为5大区域,其中线程私有3个,线程共享2个:线程私有(随线程创建销毁):1、程序计数器:记录当前线程执行的字节码行号,是唯一一个没有内存溢出的区域;2、虚拟机栈:存储局部变量、方法参数、方法栈帧,方法调用和执行都依赖该区域,栈深度过大会出现栈溢出;3、本地方法栈:专门为JNI本地方法(native方法)服务。线程共享(随JVM启动销毁):1、堆内存:所有对象、数组的存储区域,是垃圾回收的核心区域,容易发生内存溢出;2、方法区:存储类信息、常量、静态变量、即时编译代码等,JDK1.8后改为元空间,使用本地内存,不再占用堆内存。2、GC垃圾回收的原理?哪些对象会被回收?详细答案:GC是JVM自动回收堆内存中无效对象的机制,目的是释放空闲内存,避免内存泄漏、内存溢出。判定垃圾对象的核心算法:可达性分析算法。以GCRoots为起始节点遍历内存,没有被遍历到、没有任何引用指向的对象,就是垃圾对象,会被GC回收。常见GCRoots对象:虚拟机栈中引用的对象、静态变量引用的对象、常量引用对象、本地方法栈引用对象。不会被回收的对象:有有效引用指向、正在使用的对象,静态对象、活跃线程关联的对象。3、MinorGC、MajorGC、FullGC的区别?详细答案:1、MinorGC:新生代垃圾回收,频率极高、速度快。新生代内存占满后触发,清理Eden、Survivor区无效对象,不会影响老年代。2、MajorGC:老年代垃圾回收,频率低、速度慢。主要清理老年代无效对象,触发时通常伴随MinorGC。3、FullGC:全堆垃圾回收,清理新生代、老年代、元空间所有区域,开销最大、耗时最长。频繁FullGC会导致系统卡顿、响应变慢,是线上问题排查的重点。FullGC常见触发场景:老年代空间不足、手动调用System.gc()、MinorGC后晋升到老年代的对象过多、元空间内存不足。五、Spring核心面试题1、SpringIOC的原理?详细答案:IOC即控制反转,是Spring的核心思想。传统开发中,开发者主动new对象、管理对象依赖;IOC将对象的创建、初始化、依赖注入、销毁的控制权反转交给Spring容器,开发者无需手动管理对象。核心执行流程:1、容器启动时,扫描项目中所有带注解/配置的类;2、将符合条件的类注册为Bean,存入Bean工厂;3、容器自动解析Bean之间的依赖关系,通过构造器、set方法完成依赖注入;4、程序使用时,直接从容器获取Bean对象,无需手动创建。IOC最大的作用是解耦,降低代码依赖度,提升代码可维护性和扩展性。2、SpringAOP的原理和使用场景?详细答案:AOP即面向切面编程,核心是在不修改原有业务代码的前提下,对方法进行增强,实现业务逻辑与通用功能的分离。底层原理:动态代理。目标类有接口时,使用JDK动态代理;目标类无接口时,使用CGLIB字节码增强代理。核心场景:统一日志记录、事务控制、权限校验、接口限流、性能监控、异常统一处理等通用公共功能。核心术语:切面(增强类)、切入点(需要增强的方法)、通知(增强逻辑,前置、后置、异常、环绕通知)。3、SpringBean的生命周期?详细答案:SpringBean完整生命周期分为6个核心步骤:1、实例化:Spring容器通过反射创建Bean对象,此时只是空对象,无属性值;2、属性填充:容器自动完成依赖注入,给Bean的属性赋值;3、初始化前置处理:执行Bean后置处理器的前置方法,对Bean进行预处理;4、初始化:执行InitializingBean初始化方法、自定义init方法;5、初始化后置处理:执行Bean后置处理器后置方法,完成最终增强;6、销毁:容器关闭时,执行DisposableBean销毁方法、自定义destroy方法。单例Bean随容器启动创建、容器关闭销毁;多例Bean每次使用时创建,使用完毕后由JVM回收,Spring不管理其销毁。六、MySQL高频面试题1、InnoDB和MyISAM的区别?详细答案:1、事务支持:InnoDB支持事务、事务四大特性;MyISAM不支持事务。2、锁机制:InnoDB支持行级锁、表级锁,默认行锁,并发性能高;MyISAM只有表级锁,读写互斥,并发差。3、崩溃恢复:InnoDB支持事务日志,宕机后可以数据恢复;MyISAM无日志,宕机容易数据损坏。4、外键:InnoDB支持外键约束;MyISAM

温馨提示

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

评论

0/150

提交评论