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

下载本文档

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

文档简介

IBMJava高频面试题及详细答案(实战版)本套面试题整理自IBM历年Java后端、开发工程师真实面试场景,侧重工程实战、底层原理、问题排查与业务落地,剔除理论套话,答案贴合企业实际开发场景,适配初级、中级Java开发面试。一、Java基础核心(IBM必问)1、==和equals的区别是什么?实际开发中怎么用?答案:基础区别:==是运算符,equals是Object类方法。1、基本数据类型:==比较数值是否相等,基本类型没有equals方法;2、引用数据类型:==比较两个对象的内存地址(是否是同一个对象),equals默认也是比较地址,但很多类会重写该方法;3、String、Integer、List等常用类都重写了equals,重写后比较的是内容值,而非内存地址。实战场景:业务中判断字符串、对象内容一致必须用equals;判断是否是同一个对象实例用==,同时使用equals时一定要做非空判断,规避空指针异常。2、String、StringBuilder、StringBuffer的区别?线上选型原则答案:1、String:不可变字符串,底层是final字符数组,每次拼接都会生成新对象,频繁拼接会产生大量无用对象,占用内存;2、StringBuffer:可变字符串,线程安全,所有方法加了synchronized锁,并发场景性能偏低;3、StringBuilder:可变字符串,线程不安全,无锁,单线程场景性能最优。线上选型:普通字符串赋值、少量拼接用String;单线程循环拼接、业务参数组装优先用StringBuilder;多线程并发拼接字符串场景,才使用StringBuffer,日常开发95%场景用StringBuilder。3、final、finally、finalize的区别答案:1、final:修饰符,用于定义常量、禁止重写、禁止继承。final变量赋值后不可修改,final方法不能重写,final类不能被继承;2、finally:异常处理关键字,搭配try-catch使用,几乎一定会执行,用于资源关闭、连接释放等收尾操作;仅在调用System.exit()、JVM崩溃、线程终止时不会执行;3、finalize:Object类的废弃方法,JDK9之后废弃。原本用于GC回收对象前执行收尾逻辑,执行时机不确定、无法保证调用,生产中绝对不使用。4、抽象类和接口的核心区别?业务设计怎么选?答案:1、继承规则:类只能单继承抽象类,可以多实现接口;2、成员特性:抽象类可以有构造方法、成员变量、普通方法、静态方法;接口JDK8之前只有抽象方法,JDK8支持默认方法、静态方法,JDK9支持私有方法,无成员变量,只有常量;3、设计思想:抽象类是模板复用,提取子类公共代码、通用逻辑;接口是行为规范,定义统一能力标准。选型原则:需要复用代码、统一父类通用逻辑用抽象类;需要定义多实现的能力标准、解耦业务逻辑用接口。二、Java集合框架(高频深挖)1、ArrayList和LinkedList的区别?随机访问和循环遍历怎么选型?答案:1、底层结构:ArrayList基于动态数组,LinkedList基于双向链表;2、访问效率:ArrayList支持随机访问,根据下标查询速度极快;LinkedList只能顺序遍历,查询效率低;3、增删效率:ArrayList尾部增删快,中间增删需要移动数组元素,效率低;LinkedList任意位置增删只需修改指针,无需移动数据;4、内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点保存前后指针,单个元素内存占用更高。实战选型:业务以查询、遍历为主,优先用ArrayList;频繁在集合中间增删元素的场景,使用LinkedList。生产中90%场景都是ArrayList。2、HashMap底层原理?JDK1.8做了哪些优化?答案:HashMap底层是数组+链表+红黑树,基于哈希表实现,用于存储键值对数据,允许null键和null值,线程不安全。JDK1.8核心优化:1、数据结构优化:新增红黑树,链表长度超过8且数组容量大于64时,链表转为红黑树,降低查询时间复杂度;2、扩容优化:优化扩容重哈希逻辑,无需重新计算哈希值,通过高位运算直接定位新下标,提升扩容效率;3、插入方式优化:由头插法改为尾插法,彻底解决JDK1.7多线程扩容导致的链表死循环问题;4、初始容量优化:默认负载因子0.75,保证空间利用率和查询效率平衡。3、HashMap为什么线程不安全?并发场景用什么替代?答案:线程不安全原因:多线程同时put、扩容、删除操作时,会出现数据覆盖、链表死循环、数据丢失等问题,没有任何锁机制保证原子性。并发替代方案:1、ConcurrentHashMap:生产首选,分段锁思想(JDK1.8改为CAS+Synchronized),并发性能高,支持高并发读写;2、Hashtable:全局锁,并发效率极低,基本废弃,不推荐使用。4、List、Set、Map的继承关系?核心特性差异答案:1、List、Set继承自Collection接口,Map不继承Collection,是独立的键值对接口;2、List:有序可重复,可通过下标访问,代表实现ArrayList、LinkedList;3、Set:无序不可重复,依靠equals和hashCode去重,代表实现HashSet、TreeSet;4、Map:键唯一、值可重复,无序(TreeMap有序),代表实现HashMap、ConcurrentHashMap。三、多线程与并发(IBM重点考察)1、sleep()和wait()的核心区别答案:1、所属类不同:sleep()是Thread类静态方法,wait()是Object类成员方法;2、锁机制不同:sleep()不释放锁,线程休眠期间持续持有对象锁;wait()主动释放锁,等待其他线程唤醒;3、唤醒方式不同:sleep()时间到自动唤醒;wait()需要被notify()/notifyAll()唤醒,或设置超时自动唤醒;4、使用场景:sleep用于线程延时执行,wait用于多线程间通信、资源等待。2、synchronized和ReentrantLock的区别?线上如何选型答案:1、语法层面:synchronized是JVM原生关键字,隐式加锁解锁;ReentrantLock是代码层面锁,需要手动lock()、unlock();2、锁特性:synchronized不可中断、非公平锁、无法超时;ReentrantLock支持可中断、公平锁、超时锁、条件变量精准唤醒;3、重入性:两者都是可重入锁,避免自身死锁;4、性能:JDK1.6之后synchronized做了偏向锁、轻量级锁、重量级锁优化,性能和ReentrantLock基本持平。选型原则:简单同步场景、代码块同步优先用synchronized;需要公平锁、超时锁、可中断锁、精准唤醒的复杂并发场景,用ReentrantLock。3、什么是CAS?ABA问题怎么解决?答案:CAS即比较并交换,是无锁并发的核心机制,包含三个参数:内存值、预期值、新值。逻辑为:如果内存值等于预期值,就更新为新值,否则不更新,全程自旋重试。CAS优点是无锁、并发性能高,缺点是自旋消耗CPU、存在ABA问题。ABA问题:线程1读取值为A,线程2将A改为B又改回A,线程1校验时认为数值未变,直接更新,导致数据异常。解决方案:使用AtomicStampedReference,添加版本号标记,每次修改同步更新版本号,不仅对比数值,还对比版本号,彻底规避ABA问题。4、线程池核心参数?为什么不推荐使用Executors创建线程池?答案:线程池七大核心参数:核心线程数、最大线程数、空闲超时时间、时间单位、阻塞队列、线程工厂、拒绝策略。禁止使用Executors的原因:1、newFixedThreadPool、newSingleThreadExecutor:阻塞队列无界,高并发任务堆积会导致OOM内存溢出;2、newCachedThreadPool:最大线程数无限制,高并发会创建大量线程,耗尽CPU资源。实战规范:生产中通过ThreadPoolExecutor手动创建线程池,根据业务压测结果配置核心参数,自定义拒绝策略,规避线上风险。四、JVM与性能调优(面试加分项)1、JVM内存区域划分?各区域作用及GC情况答案:JVM运行时数据区分为线程私有区和线程共享区:1、线程私有(随线程创建销毁):程序计数器(唯一无GC区域,记录当前执行行号)、虚拟机栈(存储局部变量、方法栈帧,栈溢出报错StackOverflowError)、本地方法栈(执行native方法);2、线程共享(全局共享):堆(存放所有对象实例、数组,GC主要回收区域)、方法区(JDK1.8改为元空间,存储类信息、常量、静态变量、编译后的代码)。2、MinorGC、MajorGC、FullGC的区别?线上如何避免频繁GC答案:1、MinorGC:新生代垃圾回收,频率高、速度快,触发机制是新生代内存不足;2、MajorGC:老年代垃圾回收,频率低、速度慢,通常伴随MinorGC;3、FullGC:全堆回收(新生代+老年代+元空间),耗时最长,会造成业务卡顿,线上尽量避免。避坑方案:合理设置堆内存大小、避免创建大量短期大对象、优化代码减少内存泄漏、禁止手动调用System.gc()、根据业务配置GC参数,优先使用G1、ZGC垃圾收集器。3、常见OOM原因及线上排查思路答案:常见OOM场景:1、堆内存溢出:创建过多大对象、集合无限累加、内存泄漏;2、元空间溢出:动态生成大量类、频繁热部署;3、栈内存溢出:方法递归死循环、方法嵌套过深;4、直接内存溢出:NIO使用不当,未释放直接内存。排查思路:导出堆快照文件,通过MAT分析大对象、泄漏对象,定位代码问题;查看GC日志,分析GC频率、耗时,结合业务接口日志定位异常场景。五、Java新特性与实战开发1、Optional类的作用?如何避免空指针异常答案:Optional是JDK8引入的空值容器类,专门用于规避NullPointerException,替代传统的if非空判断,让代码更简洁优雅。核心用法:1、Optional.ofNullable():包装可为空的对象;2、isPresent()/ifPresent():判断对象是否非空,非空则执行逻辑;3、orElse()/orElseGet():为空时返回默认值;4、map()/flatMap():链式处理对象属性,逐层规避空指针。实战中禁止直接使用get()方法,必须搭配默认值或判断逻辑使用。2、Lambda表达式和Stream流的优缺点?生产使用规范答案:优点:代码简洁、精简集合遍历、过滤、排序逻辑,支持链式编程,可读性高;缺点:调试难度高于普通循环、过度复杂的流式代码可读性变差、并行流使用不当会有线程安全问题。生产规范:简单集合操作优先用Stream,复杂多分支逻辑用普通循环;业务代码禁止滥用并行流,避免并发数据异常。六、框架与工程实战(IBM业务向)1、SpringBean的生命周期答案:1、实例化:Spring根据配置通过反射创建Bean实例;2、属性填充:自动装配依赖属性,完成DI注入;3、初始化:执行Aware接口方法、前置处理器、自定义初始化方法;4、销毁:容器关闭时,执行自定义销毁方法;单例Bean随容器创建销毁,多例Bean由使用者管理生命周期,Spring不负责销毁。2、Spring事务传播机制及常用场景答案:核心常用传播机制:1、REQUIRED(默认):当前有事务就加入,没有就新建事务,日常业务90%场景使用;2、SUPPORTS:支持事务,有则加入,无则非事务执行;3、REQUIRES_NEW:新建独立事务,暂停当前事务,用于日志记录、消息推送等独立业务;4、NESTED:嵌套事务,依赖父事务,父事务回滚则子事务必回滚,子事务回滚不影响父事务。实战避坑:Spring事务基于AOP动态代理,同类内方法调用、私有方法、静态方法都会导致事务失效。3、MySQL索引失效场景(业务高频)答案:1、索引列使用like%xxx、%xxx%模糊查询;2、索引列参与运算、函数调用、类型转换;3、使用!=、<>、notin、isnotnull负向查询;4、复合索引不遵循最左匹配原则;5、MySQL优化器判断全表扫描比索引更快,主动放弃索引。七、IBM特色场景面试题(MQ/高可用)1、IBMMQ消息重复消费、消息丢失怎么解决?答案:消息丢失解决方案:1、生产者开启消息确认机制,确保消息成功投递到MQ队列;2、开启队列持久化、消息持久化,防止服务重启消息丢失;3、消费者处理完成后再手动ACK确认,未确认消息MQ自动重发。

温馨提示

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

评论

0/150

提交评论