版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java经典面试题及详细答案(实战完整版)一、Java基础核心面试题1.JDK、JRE、JVM的区别与联系?答案:三者是层层包含的关系,范围从大到小:JDK>JRE>JVM。1、JVM(Java虚拟机):是Java程序运行的核心容器,只负责解析、执行字节码文件(.class),不包含编译工具,是实现Java跨平台的核心。不同系统有对应的专属JVM,保证同一套Java代码可在Windows、Linux、Mac等系统运行。2、JRE(Java运行环境):包含JVM+Java核心类库(IO、集合、基础数据类型等)。仅安装JRE可以运行编译好的Java程序,但无法开发、编译代码,普通程序运行用户只需安装JRE。3、JDK(Java开发工具包):包含JRE+开发编译工具(javac编译、java运行、jar打包等工具)。是开发人员必备环境,既能编译、调试代码,也能运行Java程序。2.==和equals()的区别?答案:1、==是运算符:基本数据类型:比较的是变量的实际数值是否相等;引用数据类型:比较的是对象的内存地址,也就是判断两个变量是否指向同一个对象。2、equals()是Object类的方法:默认实现(Object类):底层就是==,比较对象内存地址;重写后(String、Integer、自定义对象):重写后不再比较地址,而是比较对象的内容、属性值是否相等。实战总结:日常开发中,字符串、包装类对比值用equals,基本类型对比用==。3.String、StringBuilder、StringBuffer的区别?答案:1、String:字符串常量,底层是final修饰的字符数组,不可变。每次字符串拼接、修改都会生成新的字符串对象,效率极低,适合少量、固定的字符串定义。2、StringBuilder:字符串变量,底层可变字符数组,线程不安全,效率高。单线程环境下字符串拼接、修改首选。3、StringBuffer:字符串变量,底层可变字符数组,线程安全(所有方法加了synchronized锁),效率低。多线程并发操作字符串场景使用。核心场景:单线程用StringBuilder,多线程用StringBuffer,固定字符串用String。4.final、finally、finalize的区别?答案:1、final:修饰符,用于限制资源不可修改修饰变量:变量变为常量,只能赋值一次,不可修改;修饰方法:方法不可重写;修饰类:类不可被继承。2、finally:异常处理关键字,搭配try-catch使用。无论代码是否抛出异常,finally中的代码都会执行(除JVM退出极端情况),主要用于释放资源(关闭流、数据库连接)。3、finalize:Object类的废弃方法,JVM垃圾回收前会调用该方法,用于对象收尾资源释放。该方法执行时机不确定、无法保证,开发中禁止使用,已被淘汰。5.基本数据类型和包装类的区别?答案:1、基本类型:8种(byte、short、int、long、float、double、char、boolean),存储在栈内存,无对象、无方法、默认有初始值,效率高,不支持泛型。2、包装类:是基本类型的对象封装(Integer、Long、Boolean等),存储在堆内存,属于对象类型,提供大量工具方法(类型转换、数值判断),支持泛型,默认值为null。补充:自动装箱(基本类型转包装类)、自动拆箱(包装类转基本类型)是JDK5新特性,底层调用valueOf、intValue等方法。实战坑:Integer缓存机制,-128~127之间的Integer对象会被缓存,该区间内==比对为true,超出区间会新建对象,==比对为false,所以包装类对比必须用equals。二、Java集合面试题(高频)1.ArrayList和LinkedList的区别?答案:1、底层结构:ArrayList:底层是动态数组;LinkedList:底层是双向链表。2、性能差异:ArrayList:随机查询、遍历效率极高(数组下标寻址),增删元素需要移动数组元素,效率低;LinkedList:随机查询效率低(需要从头遍历链表),首尾增删元素效率极高,无需移动数据。3、线程安全:两者均线程不安全,多线程并发修改会出现并发异常。4、内存:ArrayList内存连续,会有冗余容量;LinkedList每个节点包含数据和指针,内存占用更高。实战场景:查询多、遍历多用ArrayList;频繁增删首尾数据用LinkedList。2.HashMap的底层原理?JDK1.7和JDK1.8区别?答案:HashMap是基于哈希表实现的键值对集合,无序、不重复、线程不安全,底层通过「数组+链表+红黑树」存储数据。核心存储流程:1、根据key的hash值计算数组下标,确定存储位置;2、数组下标无元素,直接存入;3、下标有元素,发生哈希冲突,挂载链表;4、链表长度超过8、数组容量大于64,链表转为红黑树;5、红黑树节点少于6,重新退化为链表。JDK1.7与1.8核心区别:1、底层结构:1.7是数组+单向链表;1.8新增红黑树,数组+链表+红黑树;2、哈希冲突解决:1.7链表头插法;1.8改为尾插法,解决并发循环链表死循环问题;3、扩容优化:1.8优化hash算法,减少哈希冲突,扩容效率更高;4、树化阈值:链表长度>8树化,<6退化。3.HashMap和ConcurrentHashMap的区别?答案:1、线程安全:HashMap线程不安全,并发修改会丢数据、报异常;ConcurrentHashMap是线程安全的并发集合。2、加锁方式:JDK1.7ConcurrentHashMap:分段锁(Segment分段数组),只锁当前分段,并发度高;JDK1.8ConcurrentHashMap:取消分段锁,采用CAS+synchronized锁单个数组节点,锁粒度更细,并发效率更高。3、null值支持:HashMap允许key、value为null;ConcurrentHashMap不允许key和value为null,防止空指针歧义。实战场景:单线程存键值对用HashMap,多线程并发读写用ConcurrentHashMap。4.HashSet底层原理?答案:HashSet底层直接依赖HashMap实现,HashSet的add、remove、contains方法都是调用HashMap的对应方法。HashSet存储的元素,作为HashMap的key,value统一是一个固定的空Object常量。因为HashMap的key不重复,所以HashSet天然实现元素去重。去重规则:先判断hashCode是否相同,再判断equals是否相同,两者都相同判定为重复元素,拒绝存储。三、多线程与并发面试题1.线程和进程的区别?答案:1、进程:操作系统资源分配的最小单位,独立占用内存、CPU资源,进程之间相互隔离、互不干扰,开销大。一个程序至少有一个进程。2、线程:CPU调度执行的最小单位,依附于进程存在,一个进程包含多个线程,线程共享进程的内存资源(堆、方法区),仅私有栈独立,开销小、切换快。核心总结:进程是资源分配单位,线程是执行调度单位;进程隔离,线程共享。2.synchronized和Lock的区别?答案:1、底层层面:synchronized是JVM原生关键字,底层由虚拟机实现;Lock是Java代码层面的接口(ReentrantLock实现类),纯代码实现锁机制。2、锁特性:synchronized:隐式锁,自动加锁、自动释放锁,不可中断、不支持超时、默认非公平锁;Lock:显式锁,手动lock()加锁、unlock()释放锁,可中断、可设置超时、支持公平锁/非公平锁、可绑定多个条件锁。3、异常处理:synchronized异常后自动释放锁;Lock必须在finally中手动释放锁,否则会死锁。实战场景:简单同步场景用synchronized(简洁、性能已优化);需要超时锁、可中断锁、公平锁场景用ReentrantLock。3.volatile关键字的作用?能否保证线程安全?答案:volatile核心作用两点:1、保证可见性:一个线程修改volatile变量,会立即刷新到主内存,其他线程能立刻感知到最新值,解决变量缓存不可见问题;2、禁止指令重排:防止编译器、CPU优化代码重排序,保证代码执行顺序和书写顺序一致,常用于单例模式防重排。不能保证原子性:volatile不保证复合操作(i++、赋值运算)的原子性,无法替代锁,所以不能保证线程安全。仅适合状态标记、只读变量场景。4.线程池的核心参数及工作原理?答案:核心参数(ThreadPoolExecutor):1、核心线程数corePoolSize:线程池常驻线程数,即使空闲也不会销毁;2、最大线程数maximumPoolSize:线程池允许创建的最大线程总数;3、空闲超时时间keepAliveTime:非核心线程空闲超时后自动销毁;4、任务队列workQueue:存储等待执行的任务;5、拒绝策略:任务满负荷后拒绝新任务的策略。线程池执行流程:1、新任务到来,核心线程数未满,创建核心线程执行任务;2、核心线程已满,任务存入队列排队;3、队列已满,总线程数未达最大值,创建非核心线程执行任务;4、总线程数达到最大值,触发拒绝策略。开发规范:禁止使用Executors创建线程池,必须手动自定义ThreadPoolExecutor,避免OOM风险。四、JVM核心面试题1.JVM内存区域划分?答案:JVM运行时数据区分为5大区域,线程私有3个、线程共享2个:线程私有(随线程创建销毁):1、程序计数器:记录当前线程执行的字节码行号,唯一无OOM的区域;2、虚拟机栈:存储局部变量、方法栈帧,方法调用与执行依赖该区域,栈溢出报错StackOverflowError;3、本地方法栈:执行native本地方法(C/C++实现的方法)。线程共享(随JVM启动销毁):1、堆内存:所有对象、数组的存储区域,垃圾回收的核心区域,会发生OOM;2、方法区(元空间):存储类信息、常量、静态变量、编译后的代码,JDK1.8后由永久代改为元空间,使用本地内存。2.垃圾回收机制(GC)原理?哪些对象会被回收?答案:GC是JVM自动回收堆内存中无效对象的机制,无需手动释放内存,避免内存泄漏。判定垃圾对象的方式:1、引用计数法:对象引用次数为0则判定为垃圾,无法解决循环引用问题;2、可达性分析法(主流):以GCRoots为起点,无法遍历到的对象,判定为垃圾对象。可作为GCRoots的对象:虚拟机栈局部变量对象、静态变量对象、常量对象、本地方法栈对象。不会被回收的对象:被GCRoots引用、正在使用的活跃对象。3.年轻代、老年代、永久代的区别?GC分类?答案:堆内存分为年轻代和老年代,方法区对应永久代/元空间:1、年轻代:存放新建对象,对象存活率低、回收频繁,分为Eden区、From、To存活区,使用复制算法GC;2、老年代:存放长期存活对象、大对象,对象存活率高、回收频率低,使用标记整理、标记清除算法;3、永久代/元空间:存放类结构信息,基本不参与GC。GC分类:1、MinorGC:年轻代垃圾回收,频率高、速度快;2、MajorGC:老年代垃圾回收,速度慢、耗时久;3、FullGC:全堆+方法区整体回收,卡顿最严重,开发中尽量避免。五、Spring核心面试题1.SpringIOC原理?答案:IOC即控制反转,核心是将对象的创建、管理、依赖注入权限,从业务代码交给Spring容器,实现代码解耦。传统开发:程序员主动new对象、维护依赖关系(主动控制);IOC模式:Spring容器自动扫描bean、创建对象、注入依赖,业务代码直接使用(被动接收,控制反转)。IOC核心流程:1、容器启动,扫描注解/配置文件,加载Bean定义信息;2、根据Bean定义,通过反射创建对象;3、完成依赖注入、初始化方法执行;4、将完整Bean放入IOC容器,供业务调用。2.SpringAOP原理及应用场景?答案:AOP即面向切面编程,核心是在不修改原有业务代码的前提下,对方法进行增强,实现通用功能统一管理。底层原理:动态代理目标类有接口:使用JDK动态代理;目标类无接口:使用CGLIB字节码代理。核心应用场景:日志记录、事务控制、权限校验、接口限流、性能监控、异常统一处理。核心概念:切点(要拦截的方法)、通知(增强逻辑:前置、后置、异常、环绕)、切面(切点+通知)。3.SpringBean的生命周期?答案:1、实例化:Spring通过反射创建Bean实例;2、属性填充:自动注入依赖属性(@Autowired);3、前置处理:执行Bean后置处理器的前置方法;4、初始化:执行InitializingBean初始化方法、自定义init-method;5、后置处理:执行Bean后置处理器的后置方法;6、销毁:容器关闭时,执行DisposableBean销毁方法、自定义destroy-method。六、数据库与MyBatis面试题1.MySQL索引原理?B+树优势?答案:MySQL索引底层默认使用B+树结构,是为磁盘IO查询优化设计的多路平衡查找树。B+树核心优势:1、所有数据都在叶子节点,非叶子节点只存索引键,内存占用小,磁盘IO次数少;2、所有叶子节点通过链表串联,范围查询、排序查询效率极高;3、树层级低,查询速度稳定,千万级数据树高基本维持在3-4层。索引分类:主键索引(聚簇索引)、唯一索引、普通索引、联合索引。2.联合索引最左匹配原则?答案:联合索引遵循最左前缀匹配,创建索引(a,b,c),查询条件必须命中最左侧字段,索引才会生效。生效场景:wherea=?、wherea=?andb=?、wherea=?andb=?andc=?失效场景:whereb=?、wherec=?、whereb=?andc=?补充:索引字段发生函数运算、模糊查询%前置、类型转换、or拼接,会导致索引失效。3.MyBatis#{}和${}的区别?答案:1、#{}:预编译占位符,底层生成PreparedStatement,防止SQL注入,会自动给字符串加引号,安全性高,日常参数查询首选。2、${}:字符串直接拼接,底层直接拼接SQL语句,无法防止SQL注入,不会自动加引号,安全性低。适用场景:${}仅用于动态表名、动态排序字段等无法使用预编译的场景,其余全部用#{}。七、实战高频面试题1.什么是内存泄漏?常见场景及解决方式?答案:内存泄漏:无用对象持续被引用,JVM无法回收,长期堆积导致内存占用过高、最终OOM。常见场景:1、静态集合(static
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年医疗器械法律法规培训考试试题及答案
- 2025年医师定期考核考试题及参考答案
- 2025年义务教育道德与法治课程标准2025年版考试题库及答案
- 2025年营运证考试试题模拟考试题及答案
- 2025年浙江省教育系统校级后备干部选拔考试题及答案
- 2025年院感试题及答案填空题
- 2025年政府采购考试题及答案
- 2025年主题教育应知应会知识学习测试(含答案)
- 2025思修成人高考试题及答案
- 2025食安快线测试题及详细答案
- 教师积极心理暗示 持续滋养职业状态课件
- 塔吊安拆工程监理实施细则
- 2026年银行客户经理等级考试必考题库及答案
- T∕CSICE 061-2026 混合动力总成耐久性试验方法
- 初中物理八年级下册《摩擦力》教学设计
- 2026道德与法治八年级上册教学课件:6.2《学会依法办事》
- 数学五上综合实践《小小设计师》大单元教学设计(北师大2027新教材)
- 2027届高三化学一轮复习备考策略讲座
- 2026年湖南中考语文试卷及答案解析
- 南方医科大学南方医院冠心病不稳定型心绞痛住院费用合计5585763元
- GB/T 4208-2017外壳防护等级(IP代码)
评论
0/150
提交评论