版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java高频面试题及详细答案(职场实战版)一、基础语法与核心概念1.说说==和equals的区别?这是Java最基础也最常考的点,核心区别是比较的内容不一样:==是运算符,可以用在基本类型和引用类型上。基本类型比较的是数值本身,比如int、long;引用类型比较的是对象的内存地址,也就是判断两个变量是不是指向同一个对象。equals是Object类的方法,默认情况下和==效果一样,也是比较内存地址。但像String、Integer这些常用类,都重写了equals方法,重写后不再比较地址,而是比较对象的内容、属性值。日常开发中,对比字符串、对象内容是否一致,一律用equals;判断基本类型数值相等用==。另外要注意空指针问题,一般把常量放前面,比如"test".equals(str),避免变量为空报错。2.String、StringBuilder、StringBuffer的区别?三者核心差异在可变性、线程安全、性能三个维度,适配不同业务场景:String是不可变字符串,一旦创建就不能修改。每次对String做拼接、截取操作,都会生成一个新的字符串对象,频繁操作会产生大量无用对象,占用内存、降低性能。适合少量字符串定义、固定文本场景。StringBuilder是可变字符串,底层是字符数组,可以直接修改内容,不会频繁创建新对象。它线程不安全,多线程并发操作时可能出现数据覆盖问题,但性能最高。日常开发单线程字符串拼接优先用它。StringBuffer同样是可变字符串,方法都加了synchronized锁,线程安全,但加锁会带来性能损耗,速度比StringBuilder慢。只用于多线程环境下的字符串拼接。3.基本数据类型和包装类的区别?Java基本类型有8种:byte、short、int、long、float、double、char、boolean,其余都是引用类型,二者区别很明确:1.存储方式:基本类型直接存储数值,存在栈内存中;包装类是对象,存储的是对象地址,对象本体存在堆内存中。2.默认值不同:基本类型有固定默认值,比如int默认0、boolean默认false;包装类默认值是null,可以区分「未赋值」和「赋值为0/false」的场景。3.功能不同:基本类型只能做数值运算;包装类提供了大量工具方法,比如类型转换、数值判断、最大值最小值获取等。4.泛型支持:泛型不支持基本类型,比如List<Integer>可行,List<int>会报错,所以集合存储数值必须用包装类。补充:日常会自动触发装箱、拆箱,基本类型转包装类是装箱,包装类转基本类型是拆箱,无需手动操作,但要注意包装类空指针问题。二、面向对象核心1.面向对象的四大特性,分别怎么理解?四大特性:封装、继承、多态、抽象,是Java面向对象编程的核心思想,贴合实际开发:封装:核心是隐藏内部细节、暴露对外接口。把类的属性私有化,用private修饰,通过get/set、公开方法操作属性。好处是保护数据安全,避免外部随意篡改,同时统一操作入口,方便后期维护修改。继承:子类继承父类的属性和方法,实现代码复用,减少重复代码。Java是单继承,一个子类只能有一个直接父类,但可以实现多个接口。继承的核心是「is-a」关系,比如学生是人,就可以继承人类。多态:同一个行为,不同子类有不同的实现。核心体现是「父类引用指向子类对象」,分为编译多态(方法重载)和运行多态(方法重写)。好处是提高代码扩展性,新增子类无需修改原有代码。抽象:抽取事物的核心共性,忽略次要细节,用抽象类或接口实现。抽象类不能实例化,用于定义通用模板;接口是行为规范,定义方法标准,让子类、实现类去落地具体逻辑。2.重载和重写的区别?两者都是方法同名,但是规则、场景、作用完全不同,也是面试高频对比题:重载(Overload):发生在同一个类中,多个方法名相同,但参数列表不同(参数个数、类型、顺序不同),和返回值、访问修饰符无关。属于编译期多态,代码编译时就确定调用哪个方法。比如ArrayList的add方法,多个参数形式就是重载。重写(Override):发生在父子类之间,子类重写父类的非私有、非final、非静态方法。要求方法名、参数列表、返回值完全一致,访问权限不能比父类更严格,抛出的异常范围不能更大。属于运行期多态,程序运行时才确定执行子类方法。3.接口和抽象类的区别?很多人容易混淆,核心区别在于定位、结构、使用规则:1.定义关键字:抽象类用abstractclass,接口用interface。2.继承规则:类只能单继承抽象类,但可以多实现接口;接口可以多继承接口。3.成员特性:抽象类可以有构造方法、普通成员变量、静态变量、普通方法、抽象方法;接口(JDK8之前)只能有常量和抽象方法,JDK8及以后支持默认方法、静态方法,JDK9支持私有方法,没有构造方法。4.设计定位:抽象类是「模板」,描述一类事物的共性属性和行为;接口是「规范」,描述一种额外的行为能力,比如序列化、比较能力。实际开发中:优先用接口,解耦性更强;需要统一子类模板、复用成员属性时,用抽象类。三、集合框架1.ArrayList和LinkedList的区别?二者都是List接口的实现类,有序可重复,核心差异在底层结构和读写性能:ArrayList底层是动态数组,每次扩容会重新开辟内存、复制元素。它的查询、遍历速度极快,可以通过下标直接定位元素;但增删效率低,因为中间增删元素需要移动后续所有元素。线程不安全。LinkedList底层是双向链表,每个节点存储数据和前后节点引用。它增删效率高,只需修改节点引用,无需移动元素;但查询速度慢,只能从头节点或尾节点逐个遍历查找。线程不安全。实战选型:日常查询、遍历居多,优先用ArrayList;频繁插入、删除元素的场景,用LinkedList。2.HashMap的底层原理?JDK1.7和1.8的区别?HashMap是开发最常用的键值对集合,核心是数组+链表+红黑树的结构,用于快速存取数据,允许null键null值,线程不安全。底层核心流程:存储数据时,先通过key的hash值计算数组下标,如果下标位置无元素,直接存入;如果有元素,产生哈希冲突,挂链表;当链表长度超过8、数组容量大于64时,链表转为红黑树,提升查询效率;当红黑树节点小于6时,退化为链表。JDK1.7与1.8核心区别:1.结构不同:1.7是「数组+单向链表」;1.8新增红黑树结构,解决链表过长查询慢的问题。2.插入方式不同:1.7是头插法,多线程环境下容易出现环形链表、数据丢失;1.8改为尾插法,规避了环形链表问题。3.扩容优化:1.8扩容时无需重新计算所有hash值,通过高位判断即可定位新下标,效率更高。4.哈希算法优化:1.8简化了hash扰动算法,兼顾效率和哈希分散性。3.HashMap和HashTable、ConcurrentHashMap的区别?三者都是键值对集合,核心差异在线程安全、性能、适用场景:HashMap:线程不安全,效率最高,允许null键null值,适合单线程环境日常使用。HashTable:线程安全,所有方法都加了重量级synchronized锁,锁住整个哈希表,并发性能极差,不允许null键null值,目前基本被淘汰,几乎不用。ConcurrentHashMap:多线程并发首选,线程安全,性能远高于HashTable。JDK1.7采用分段锁机制,锁住局部分段数组;JDK1.8放弃分段锁,采用CAS+synchronized锁,只锁住当前链表/树的头节点,锁粒度更细,并发效率更高,不允许null键值。四、异常、IO与JVM基础1.受检异常和非受检异常的区别?Java中所有异常的父类是Throwable,分为Error和Exception,Exception又分为受检异常和非受检异常:受检异常(编译期异常):继承自Exception,除运行时异常外的所有异常。编译阶段就会被检测,必须手动捕获try-catch或者向上throws抛出,否则代码编译报错。比如IO异常、文件不存在异常、SQL异常。非受检异常(运行时异常):继承自RuntimeException,编译不报错,运行程序时才会抛出。无需手动捕获或抛出,大多是代码逻辑问题导致。比如空指针、数组越界、类型转换异常。Error是系统级严重错误,比如内存溢出、栈溢出,程序无法处理,直接崩溃,无需捕获。2.讲讲IO和NIO的区别?传统IO是BIO(阻塞IO),NIO是Java新的非阻塞IO,核心差异在阻塞模式、数据读写方式:BIO是同步阻塞,一个线程只能处理一个连接,客户端未传输数据时,线程一直阻塞等待,资源利用率极低,适合少量连接、简单场景。BIO是面向流的读写,数据单向传输。NIO是同步非阻塞,核心组件是缓冲区、通道、选择器。支持一个线程管理多个连接,没有数据时线程不会阻塞,可以处理其他任务,大幅提升并发能力。NIO是面向缓冲区读写,数据可以双向操作,效率更高,适合高并发、大量连接的网络场景。3.JVM内存区域分为哪几块?各自作用?JVM运行时数据区主要分为5个区域,其中线程私有3个、线程共享2个:1.程序计数器(线程私有):记录当前线程执行的字节码行号,线程切换后恢复执行位置,是唯一没有内存溢出的区域。2.虚拟机栈(线程私有):存储方法栈帧、局部变量、方法返回地址等,方法调用时入栈,执行结束出栈,栈深过大会出现栈溢出。3.本地方法栈(线程私有):作用和虚拟机栈类似,专门为JDK的native本地方法服务。4.堆内存(线程共享):JVM最大的内存区域,所有对象、数组都在这里分配内存,也是垃圾回收的主要区域,分为新生代、老年代。5.方法区(线程共享):存储类的元数据、常量、静态变量、即时编译代码等,JDK1.8后用元空间替代永久代,使用本地内存,不受JVM堆内存限制。五、多线程与并发1.线程和进程的区别?进程:操作系统资源分配的最小单位,独立占用内存、CPU资源,进程之间相互独立,切换开销大。比如打开的浏览器、IDE都是独立进程。线程:进程内的执行单元,是CPU调度的最小单位,共享进程的所有资源,线程之间切换开销极小。一个进程至少包含一个主线程,多线程就是在一个进程内同时执行多个任务。核心总结:进程独立隔离、开销大;线程共享资源、轻量高效,Java程序天生是多线程程序。2.synchronized和Lock的区别?二者都是用来解决线程并发安全问题、保证原子性的锁,区别非常常用:1.实现方式:synchronized是Java内置关键字,底层由JVM实现;Lock是代码层面的接口,需要手动实例化锁对象。2.锁的释放:synchronized自动加锁、自动释放锁,无需手动控制;Lock需要手动lock()加锁、unlock()释放锁,必须在finally中释放,避免死锁。3.锁特性:synchronized是悲观锁、可重入锁,默认非公平锁,不能中断等待线程;Lock支持可重入、可中断、可公平/非公平锁,还能尝试获取锁(tryLock),灵活性更高。4.性能:JDK1.6之后synchronized做了大量优化(偏向锁、轻量级锁、重量级锁),性能和Lock基本持平;高并发场景下Lock灵活性更优。3.什么是线程死锁?如何避免?死锁定义:两个或多个线程互相持有对方需要的锁,同时又互相等待对方释放锁,所有线程都阻塞停滞,程序无法继续执行。死锁产生的四个必要条件(缺一不可):1.互斥条件:锁同一时间只能被一个线程持有;2.请求与保持条件:线程持有一把锁,同时请求另一把被占用的锁;3.不可剥夺条件:锁只能被持有者主动释放,不能被其他线程强行抢占;4.循环等待条件:多个线程形成循环锁等待链路。避免方式:只要破坏任意一个条件即可,最常用的是统一锁的获取顺序、设置锁超时时间、使用tryLock尝试获取锁、减少嵌套锁。六、Spring核心1.Spring的核心思想是什么?Spring两大核心:IOC(控制反转)和AOP(面向切面编程),也是Spring框架的根基。IOC控制反转:把对象的创建、管理、依赖注入的权限,从代码业务逻辑中交给Spring容器。传统代码是自己new对象,控制权在程序;IOC模式下,容器自动创建、装配对象,实现解耦,降低代码依赖度,方便维护和测试。依赖注入DI是IOC的具体实现方式。AOP面向切面编程:在不修改原有业务代码的前提下,对方法进行增强,实现日志记录、事务控制、权限校验、性能监控等通用功能。核心是把公共通用逻辑抽离出来,切面统一处理,避免代码冗余,符合开闭原则。2.SpringBean的生命周期?SpringBean从创建到销毁,完整流程简洁清晰,面试常问核心流程:1.实例化:Spring容器根据配置,通过反射创建Bean的实例对象;2.属性填充(依赖注入):自动装配Bean的属性、依赖对象,完成DI注入;3.初始化前置处理:执行BeanPostProcessor的前置处理方法,对Bean做预处理;4.初始化:执行InitializingBean的afterPropertiesSet方法,以及自定义的init初始化方法;5.初始化后置处理:执行BeanPostProcessor的后置处理方法,完成Bean最终增强;6.就绪可用:Bean初始化完成,存入单例池,供业务调用;7.销毁:容器关闭时,执行DisposableBean的destroy方法和自定义destroy销毁方法。3.@Autowired和@Resource的区别?两者都是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生物基可降解包装膜生产线建设项目可行性研究报告
- 隧道衬砌厚度检测工程试验报告
- 输变电线路架设工程专项方案
- 氢储运复合气瓶生产线建设项目可行性研究报告
- 商业综合体汛期内涝处置方案
- 新能源汽车齿轮精密设备生产线设备操作规程
- 新能源汽车齿轮精密设备生产线建设方案
- 热水采暖管穿路套管施工方案
- 智能乡镇共配中心建设总体方案
- 水泵机组监测技术方案
- 2026年上海市检察院公益诉讼检察业务竞赛真题及答案
- 2026年食品标签标识规范业务考试试卷试题及答案
- GJB 151C-2024 军用设备和分系统 电磁发射和敏感度要求与测量
- 2026年药店岗前培训试题(附答案)
- ISO9001-2026质量管理体系标准培训
- CMA与CNAS检测报告深度解读:一单一库新政下的效力边界与实务指南
- 2026年人教版新教材数学五年级上册全套单元、期中、期末测试题及答案(共10套题)
- 全国OPC发展观察报告2026
- 2026版公路水运工程试验检测专业技术人员职业资格考试《桥隧工程一本通》
- IPC-JEDEC J-STD-020F-2024 中文版(非气密固态表面贴装器件的潮湿 - 再流焊敏感度分级)
- 2025浙江鹿城农商银行春季招聘笔试历年典型考题及考点剖析附带答案详解
评论
0/150
提交评论