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

下载本文档

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

文档简介

Java高频面试题及详细答案(实战通俗版)一、Java基础核心面试题1.说说==和equals的区别?详细答案:这是Java最基础也最常问的问题,核心区别在于比较的内容不同,分基本数据类型和引用数据类型两种场景:第一、基本数据类型(byte、short、int、long、float、double、char、boolean),只能用==,比较的是变量的实际数值是否相等。第二、引用数据类型(String、对象、数组等),==比较的是内存地址,也就是判断两个变量是不是指向同一个对象;而equals是用来比较对象的内容/值是否相同。这里要注意一个坑:equals方法原本是Object类的默认方法,默认实现和==一样,也是比较内存地址。像String、Integer这些常用类,都重写了equals方法,所以才能比较内容。如果是我们自己定义的实体类,不重写equals的话,默认还是比较地址。简单总结:==比地址(引用),重写后的equals比内容。2.String、StringBuilder、StringBuffer的区别?详细答案:三者核心差异围绕可变性、线程安全、性能三个维度,适配不同业务场景:1.String:字符串常量,不可变。一旦创建就不能修改,每次拼接、修改字符串,都会生成一个新的String对象,原对象不会改变。频繁拼接字符串时会产生大量无用垃圾对象,性能很差。2.StringBuilder:可变字符串,线程不安全,性能最高。底层是字符数组,修改时直接操作原对象,不会新建对象。多线程并发操作字符串时,会出现数据覆盖、数据错乱问题,只能用于单线程场景。3.StringBuffer:可变字符串,线程安全,性能偏低。所有修改方法都加了synchronized锁,保证多线程并发时数据安全,但锁的存在会带来性能损耗。业务使用场景:日常字符串内容固定不用修改,用String;单线程频繁拼接字符串,用StringBuilder;多线程环境操作字符串,用StringBuffer。3.final、finally、finalize的区别?详细答案:三个单词长相相似,功能完全无关,是高频易混考点:1.final:是修饰符,用来修饰变量、方法、类。修饰变量表示常量,只能赋值一次且不可修改;修饰方法表示方法不能被重写;修饰类表示类不能被继承。2.finally:是异常处理关键字,搭配try-catch使用。作用是保证代码一定会执行,无论程序正常运行还是出现异常报错,finally中的代码都会执行,常用于释放资源(关闭流、关闭数据库连接)。唯一不执行的场景:try代码块中执行了System.exit(0)退出程序。3.finalize:是Object类的废弃方法,已经基本被淘汰。原本设计是垃圾回收器回收对象前,自动调用该方法,用来做资源收尾。但执行时机不确定、无法保证执行,现在开发中完全不用,官方也不推荐使用。4.基本数据类型和包装类的区别?详细答案:Java有8种基本数据类型,对应的包装类是其对象形式,核心区别如下:1.存储方式:基本类型是基础数据,直接存储数值,存在栈内存中;包装类是对象,存储对象地址,实例存在堆内存中。2.默认值:基本类型有固定默认值,比如int默认0、boolean默认false;包装类默认值是null,可以区分「数值为0」和「未赋值」的场景。3.功能特性:基本类型只能做数值运算;包装类提供了大量工具方法,比如类型转换、数值比较、最大值最小值获取等。4.泛型支持:泛型不支持基本类型,集合存储数据时必须用包装类,比如List<Integer>,不能写List<int>。补充:日常开发中会自动发生装箱(基本类型转包装类)和拆箱(包装类转基本类型),不用手动转换,但频繁转换会有轻微性能损耗。二、Java集合面试题1.ArrayList和LinkedList的区别?详细答案:两者都是List接口的实现类,有序可重复,核心差异是底层结构和读写性能:1.底层结构:ArrayList底层是动态数组;LinkedList底层是双向链表。2.查询效率:ArrayList查询快、随机访问效率高,数组支持下标直接定位数据,时间复杂度O(1);LinkedList查询需要从头节点遍历,时间复杂度O(n)。3.增删效率:ArrayList增删慢,增删数据时需要移动数组元素,数组满了还需要扩容;LinkedList首尾增删快,只需修改节点指针,无需移动大量数据。4.内存占用:ArrayList会预留冗余容量,存在内存浪费;LinkedList每个节点都要存储数据和前后指针,单个元素内存占用更大。使用场景:大量查询、少量增删用ArrayList;大量增删、极少查询用LinkedList。日常开发90%场景都用ArrayList。2.HashMap的底层原理?JDK1.7和1.8的区别?详细答案:HashMap是基于哈希表实现的键值对集合,无序、键唯一、允许null键和null值,是开发最常用的集合。底层核心原理:通过哈希算法计算key的哈希值,确定数据在数组中的存储位置;出现哈希冲突时,采用链表/红黑树解决冲突,保证数据正常存储。JDK1.7版本:底层是「数组+单向链表」,采用头插法插入数据。缺点很明显:哈希冲突严重时链表过长,查询效率极低;多线程扩容时容易出现链表闭环,引发死循环问题。JDK1.8版本(主流版本):底层优化为「数组+单向链表+红黑树」,核心优化点:1.链表长度超过8且数组容量大于64时,链表转为红黑树,将查询时间复杂度从O(n)降到O(logn),解决长链表查询慢的问题;2.改为尾插法插入数据,避免多线程扩容出现死循环;3.优化哈希算法,减少哈希冲突概率。补充参数:默认容量16,负载因子0.75,达到容量*负载因子时自动扩容,扩容为原容量的2倍。3.HashMap和ConcurrentHashMap的区别?详细答案:1.线程安全:HashMap线程不安全,多线程并发put、扩容会出现数据覆盖、丢失、死循环等问题,只能用于单线程;ConcurrentHashMap线程安全,专门用于多线程场景。2.加锁方式:JDK1.8的ConcurrentHashMap采用分段锁+CAS机制,只锁住当前操作的数组节点,不会锁整个集合,并发性能极高;区别于HashTable锁整张表的低效锁机制。3.性能:单线程下HashMap性能更高,无锁开销;多线程下ConcurrentHashMap性能远优于HashTable,且不会出现HashMap的并发问题。4.null值支持:HashMap允许一个null键、多个null值;ConcurrentHashMap不允许null键和null值,避免并发时出现空指针歧义。三、多线程面试题1.线程和进程的区别?详细答案:1.进程:是操作系统资源分配的最小单位,每个进程独立占用内存、CPU资源,进程之间相互独立、互不干扰,切换开销大。比如打开的浏览器、IDEA、微信,每一个都是一个进程。2.线程:是进程内的执行单元,是CPU调度的最小单位,也叫轻量级进程。一个进程包含多个线程,线程共享进程的内存资源(堆、方法区),仅私有栈内存独立,线程切换开销极小。核心总结:进程独立隔离、开销大;线程共享资源、开销小,一个进程至少有一个主线程。2.说说synchronized和Lock的区别?详细答案:两者都是用来解决多线程并发安全问题的锁机制,核心区别如下:1.出身不同:synchronized是Java内置关键字,底层由JVM实现;Lock是接口(常用实现类ReentrantLock),是代码层面实现的锁。2.锁释放方式:synchronized自动加锁、自动释放锁,代码执行完毕或抛出异常,锁会自动释放,无需手动处理;Lock需要手动lock()加锁、unlock()释放锁,必须在finally中释放,否则会死锁。3.锁特性:synchronized是可重入、不可中断、非公平锁;ReentrantLock支持可重入、可中断、可公平/非公平锁,还能绑定多个条件变量,功能更灵活。4.性能:JDK1.6之后synchronized做了大量优化(偏向锁、轻量级锁、重量级锁),性能和Lock基本持平,低并发场景差距极小;高并发、需要精细控制锁的场景,优先用Lock。3.什么是线程池?为什么要用线程池?详细答案:线程池是一个管理线程的容器,提前创建好一定数量的线程,任务到来时直接复用已有线程执行,任务结束后线程不销毁,放回池中等待复用。使用线程池的核心好处:1.降低资源消耗:避免频繁创建、销毁线程带来的系统开销,重复利用线程资源;2.提高响应速度:任务到来无需等待线程创建,直接执行,响应更快;3.方便线程管理:可以控制最大并发数、设置任务队列、拒绝策略,避免无限创建线程导致系统卡顿、OOM内存溢出;4.支持定时、周期性任务执行,适配更多业务场景。开发规范:禁止手动创建线程,所有多线程任务必须通过线程池执行。四、Spring核心面试题1.Spring的核心思想是什么?IOC和AOP原理?详细答案:Spring两大核心思想:IOC控制反转和AOP面向切面编程。IOC控制反转:传统开发是程序员主动new对象、管理对象依赖;IOC是把对象的创建、管理、依赖注入全权交给Spring容器,控制权从程序员反转给容器。核心目的是解耦,降低代码耦合度,方便维护和测试。依赖注入(DI)是IOC的具体实现方式。AOP面向切面编程:基于动态代理实现,核心是在不修改原有业务代码的前提下,对方法进行增强。可以在方法执行前、后、异常时植入通用逻辑,比如日志记录、事务控制、权限校验、性能监控等。简单理解:IOC解耦对象依赖,AOP解耦通用公共逻辑。2.SpringBean的生命周期?详细答案:SpringBean从创建到销毁的完整流程,核心步骤如下:1.实例化:Spring容器根据配置,通过反射创建Bean的实例,此时只是创建对象,属性还未赋值;2.属性填充(依赖注入):Spring自动注入Bean的依赖属性,完成赋值;3.初始化前置处理:执行BeanPostProcessor前置处理方法,对Bean进行预处理;4.初始化:执行InitializingBean接口方法、自定义init-method初始化方法;5.初始化后置处理:执行BeanPostProcessor后置处理方法,完成Bean最终加工;6.就绪可用:Bean完全初始化完成,存入Spring容器,可被业务调用;7.销毁:容器关闭时,执行DisposableBean接口方法、自定义destroy-method销毁方法,释放资源。3.@Autowired和@Resource的区别?详细答案:1.来源不同:@Autowired是Spring框架注解;@Resource是Java原生规范注解,兼容性更好。2.注入规则不同:@Autowired默认按类型注入,容器中同类型Bean唯一时直接注入,多个同类型Bean会报错,可搭配@Qualifier按名称指定;@Resource默认按名称注入,找不到对应名称Bean时,再按类型注入。3.必填属性:@Autowired默认要求依赖对象必须存在,不存在则报错;可以设置required=false允许为空;@Resource无强制必填限制。日常开发:Spring项目中优先用@Autowired,配合@Qualifier适配多实例场景,更灵活。五、MySQL数据库面试题1.InnoDB和MyISAM的区别?详细答案:MySQL两大核心存储引擎,InnoDB是现在默认引擎,两者核心差异:1.事务支持:InnoDB支持事务,满足ACID事务特性;MyISAM不支持事务。2.锁机制:InnoDB支持行级锁+表级锁,默认行锁,并发性能高;MyISAM只支持表级锁,增删改都会锁整张表,并发极差。3.外键支持:InnoDB支持外键约束;MyISAM不支持外键。4.崩溃恢复:InnoDB有日志机制,数据库宕机后可以恢复数据;MyISAM无日志,宕机容易数据损坏、丢失。5.查询性能:MyISAM简单查询速度略快,但不支持事务和高并发,几乎被淘汰;InnoDB综合性能更强,适配所有业务场景。2.什么是事务?事务的ACID四大特性?详细答案:事务是数据库执行的一组SQL语句,这组语句要么全部执行成功,要么全部执行失败回滚,保证数据一致性,是数据库数据安全的核心保障。ACID四大核心特性:1.原子性(Atomicity):事务是最小执行单元,不可分割,整体成功或整体失败;2.一致性(Consistency):事务执行前后,数据库数据状态保持一致,不会出现数据错乱;3.隔离性(Isolation):多个事务并发执行时,相互隔离、互不干扰,通过隔离级别控制并发问题;4.持久性(Durability):事务提交成功后,数据永久落地,即使数据库宕机,数据也不会丢失。3.索引失效的常见场景有哪些?详细答案:日常开发中高频索引失效场景,也是SQL优化核心考点:1.where条件中索引列使用了函数、运算、类型转换,比如select*fromuserwhereage+1=20;2.模糊查询以%开头,比如like'%张三',后置%(like'张三%')不会失效;3.违背最左匹配原则,联合索引没有使用最左侧字段查询;4.索引列使用!=、<>、notin、notexists等非等值查询;5.字符串类型字段查询,值不加引号,发生隐式类型转换;6.MySQL优化器判断全表扫描比索引查询更快,会主动放弃索引。六、Redis面试题1.Redis为什么快?详细答案:Redis是高性能内存数据库,单机QPS可达十万级,核心快的原因:1.基于内存操作:所有数据读写都在内存中,无需读写磁盘,内存读写速度远高于磁盘;2.单线程模型:核心读写逻辑单线程执行,避免了多线程的线程切换、锁竞争开销,逻辑简单高效;3.数据结构高效:底层采用压缩列表、跳表、哈希表等高性能数据结构,查询和操作效率极高;4.多路IO复用:采用epoll多路复用模型,单线程可以处理大量客户端连接,无闲置资源浪费;5.简单轻量:Redis源码精简、协议简单,没有多余冗余逻辑,执行效率高。2.Redis过期键删除策略?详细答案:Redis为了平衡性能和内存,采用三种过期删除策略结合的方式:1.惰性删除:访问key时才判断是否过期,过期则直接删除。优点是节省CPU资源,无需主动遍历;缺点是过期key长期不访问,会一直占用内存,造成内存浪费。2.定期删除:每隔一段时间,随机抽取部分过期key进行删除,批量清理过期数据。平衡了惰性删除的内存浪费问题,又不会因为全量遍历占用大量CPU。3.内存淘汰策略:当内存达到最大限制、无法写入新数据时,触发内存淘汰,主动清理过期或无用数据,保证服务正常运行。七、SpringBoot面试题1.SpringBoot自动配置原理?详细答案:SpringBo

温馨提示

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

评论

0/150

提交评论