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

下载本文档

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

文档简介

Java高频面试题及详细答案(真实面试版)一、Java基础面试题1.JDK、JRE、JVM的区别是什么?详细答案:三者是层层包含的关系,范围从大到小依次是JDK>JRE>JVM。1、JVM(Java虚拟机):是Java语言跨平台的核心,只负责运行Java编译后的class字节码文件。本身不包含开发工具,也没有运行类库,是最核心的运行容器,不同操作系统有对应的JVM版本。2、JRE(Java运行环境):包含JVM+Java核心运行类库。普通用户只需要安装JRE就可以运行Java程序,不需要编译代码,主要用于程序部署运行。3、JDK(Java开发工具包):包含JRE+开发编译工具(javac编译、java运行、jar打包等工具)。开发人员必须安装JDK,用于编写、编译、调试Java程序。总结:JVM负责运行,JRE保障运行,JDK支撑开发。2.==和equals()的区别?详细答案:1、==是运算符,可以用于基本数据类型和引用数据类型-基本数据类型:比较的是变量的实际数值是否相等;-引用数据类型:比较的是对象的内存地址是否相同,也就是判断是否为同一个对象。2、equals()是Object类的方法,仅适用于引用数据类型-Object类原生的equals方法,底层本质就是==,依旧比较内存地址;-String、Integer等包装类重写了equals方法,重写后不再比较地址,而是比较对象的内容值是否相等。面试高频结论:比较字符串内容是否一致必须用equals,比较基本类型数值用==,判断是否是同一个对象用==。3.String、StringBuilder、StringBuffer的区别?详细答案:1、String:字符串常量,底层是final修饰的字符数组,不可变。每次对String进行拼接、修改,都会生成新的字符串对象,频繁操作会产生大量垃圾对象,效率极低。适合少量字符串定义、静态文本场景。2、StringBuilder:字符串变量,底层数组可变,线程不安全,效率最高。多线程并发操作字符串时会出现数据错乱,适合单线程下频繁字符串拼接、修改场景。3、StringBuffer:字符串变量,底层数组可变,线程安全,所有方法都加了synchronized锁,效率低于StringBuilder。适合多线程下频繁操作字符串场景。工作选型原则:单线程用StringBuilder,多线程用StringBuffer,固定不变的文本用String。4.final、finally、finalize的区别?详细答案:1、final:是修饰符,用于修饰变量、方法、类-修饰变量:变量变为常量,只能赋值一次,不可修改;-修饰方法:方法不能被重写;-修饰类:类不能被继承。2、finally:是异常处理的关键字,搭配try-catch使用。无论代码正常执行还是出现异常,finally中的代码最终一定会执行(唯一例外:执行到System.exit(0)退出JVM时不执行)。主要用于释放资源,比如关闭流、关闭数据库连接。3、finalize():是Object类的废弃方法,JDK9之后已废弃。原本作用是GC回收对象前,由JVM自动调用该方法,让对象完成资源收尾工作,但执行时机不确定、无法保证调用,实际开发中完全不用。5.Java基本数据类型有哪些?区别是什么?详细答案:Java一共8种基本数据类型,分为四类,不涉及对象创建,直接存储数值,占用内存小、效率高。1、整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)2、浮点型:float(4字节)、double(8字节)3、字符型:char(2字节)4、布尔型:boolean(1字节)核心注意点:-整数默认类型是int,定义long类型必须加L后缀;-小数默认类型是double,定义float类型必须加F后缀;-基本类型存栈内存,包装类对象存堆内存。二、面向对象OOP面试题1.面向对象的四大特性?分别怎么理解?详细答案:Java是纯面向对象语言,核心四大特性:封装、继承、多态、抽象。1、封装:将类的属性私有化,通过public的get/set方法对外提供访问入口。隐藏内部数据细节,保护数据安全性,统一访问方式,降低代码耦合度。2、继承:子类继承父类的属性和方法,实现代码复用。子类可以在父类基础上扩展新功能,Java是单继承,一个子类只能有一个直接父类,避免多继承的逻辑混乱。3、多态:同一个行为,不同子类有不同的实现方式。核心体现:父类引用指向子类对象,方法重写。编译看父类,运行看子类,提升代码扩展性和灵活性。4、抽象:抽取事物的共性特征和行为,忽略细节。通过抽象类或接口实现,定义规范、约束子类行为,强制子类实现核心方法,统一代码标准。2.接口和抽象类的区别?详细答案:1、定义与修饰:抽象类用abstract修饰;接口用interface修饰。2、继承实现:类只能单继承抽象类;类可以多实现接口,突破单继承限制。3、成员变量:抽象类可以有普通变量、常量;接口默认只能是常量(publicstaticfinal)。4、构造方法:抽象类有构造方法,用于子类初始化父类成员;接口没有构造方法,不能实例化。5、方法特性:JDK8前接口只有抽象方法,JDK8新增默认方法、静态方法,JDK9新增私有方法;抽象类可以有抽象方法和普通实体方法。工作选型:仅做功能规范、多实现场景用接口;需要复用代码、包含成员变量和普通方法用抽象类。3.重写和重载的区别?详细答案:1、重载(Overload):发生在同一个类中-方法名必须相同,参数列表(个数、类型、顺序)必须不同;-返回值、访问修饰符不做限制;-属于编译期多态,编译时就能确定调用哪个方法。2、重写(Override):发生在父子类之间-方法名、参数列表、返回值必须和父类完全一致;-访问权限不能比父类更严格(父类protected,子类不能是private);-不能重写父类final、private、static方法;-属于运行期多态,运行时才确定执行子类方法。三、Java集合面试题1.ArrayList和LinkedList的区别?详细答案:1、底层结构:ArrayList底层是动态数组;LinkedList底层是双向链表。2、查询效率:ArrayList支持随机访问,通过下标直接定位元素,查询快;LinkedList只能从头节点/尾节点遍历查找,查询效率极低。3、增删效率:ArrayList增删元素需要移动数组元素、扩容,增删慢;LinkedList只需修改节点指针,无需移动元素,增删快(首尾操作最优)。4、内存占用:ArrayList数组会预留冗余容量,存在内存浪费;LinkedList每个节点都存储数据和前后指针,单个元素占用内存更大。选型:查询多、遍历多用ArrayList;频繁增删元素用LinkedList。2.HashMap的底层原理?JDK1.8优化点?详细答案:HashMap是基于哈希表实现的键值对集合,无序、键唯一、可存null键和null值,线程不安全。底层核心结构(JDK1.8):数组+链表+红黑树1、存储流程:通过key的hash值计算数组下标,直接定位存储位置;2、哈希冲突:不同key算出相同下标时,在该下标位置生成链表挂载元素;3、树化规则:当链表长度≥8且数组容量≥64时,链表转为红黑树,提升查询效率;4、降级规则:红黑树节点数量≤6时,重新退化为链表,减少树结构维护开销。JDK1.8核心优化:1、新增红黑树结构,解决链表过长查询效率低的问题;2、优化hash算法,减少哈希冲突概率;3、扩容优化,无需重新计算所有元素hash,提升扩容效率;4、插入方式由头插法改为尾插法,彻底解决JDK1.7多线程扩容导致的环形链表死循环问题。3.HashMap和HashTable的区别?详细答案:1、线程安全:HashMap线程不安全;HashTable线程安全,所有方法加了synchronized锁。2、null值支持:HashMap允许1个null键、多个null值;HashTable不允许null键和null值,直接报错空指针。3、效率:HashMap无锁,并发效率高;HashTable全局锁,并发效率极低。4、底层结构:JDK1.8的HashMap有树化机制;HashTable始终是数组+链表,无树化。工作替代方案:多线程场景不用HashTable,优先使用ConcurrentHashMap。四、多线程面试题1.线程和进程的区别?详细答案:1、进程:操作系统资源分配的最小单位,独立占用内存、CPU资源,进程之间相互独立,互不干扰,切换开销大。一个程序至少有一个进程。2、线程:进程内的执行单元,是CPU调度的最小单位,共享进程的内存和资源,线程之间切换开销极小。一个进程可以包含多个线程。核心总结:进程是资源分配单位,线程是执行调度单位;进程独立,线程共享资源。2.实现多线程的几种方式?详细答案:1、继承Thread类:自定义类继承Thread,重写run()方法,调用start()启动线程。缺点:单继承限制,无法再继承其他类。2、实现Runnable接口:重写run()方法,传入Thread对象启动线程。优点:避免单继承限制,适合资源共享场景,常用。3、实现Callable接口:重写call()方法,有返回值、可抛异常,搭配FutureTask使用。适合需要获取线程执行结果的场景。4、线程池创建:通过Executors或ThreadPoolExecutor创建线程池,统一管理线程,减少线程创建销毁开销,项目开发主流方式。3.synchronized和Lock锁的区别?详细答案:1、锁类型:synchronized是内置锁,JVM底层实现;Lock是显式锁,Java代码层面实现的接口(ReentrantLock为实现类)。2、加锁解锁:synchronized自动加锁、自动释放锁;Lock需要手动lock()加锁、unlock()解锁,必须在finally中解锁,避免死锁。3、锁特性:synchronized不可中断、无法公平锁、不能绑定多个条件;Lock支持可中断锁、公平锁、可绑定多个Condition条件,精准唤醒线程。4、效率:低并发下两者效率相近;高并发场景下Lock性能优于synchronized。选型:简单同步场景用synchronized,复杂并发、需要精准控制锁的场景用ReentrantLock。五、JVM与内存面试题1.JVM内存区域划分?详细答案:JVM运行时数据区分为5大区域,其中线程私有3个,线程共享2个。线程私有(随线程创建销毁):1、程序计数器:记录当前线程执行的字节码行号,是唯一一个没有OOM的内存区域;2、虚拟机栈:存储局部变量、方法参数、方法栈帧,方法执行完毕自动释放;3、本地方法栈:为Native本地方法提供内存空间。线程共享(随JVM启动销毁):1、堆内存:所有对象、数组的存储区域,GC垃圾回收的主要区域,最容易发生OOM;2、方法区:存储类信息、常量、静态变量、编译后的代码,JDK1.8后改为元空间。2.GC垃圾回收机制?哪些对象会被回收?详细答案:GC是JVM自动回收堆内存中无效对象的机制,无需手动释放内存,避免内存泄漏。需要被回收的对象:没有任何有效引用指向的堆内存对象。判断对象存活方式:根可达性分析,从GC根对象(栈变量、静态变量、常量等)出发,无法遍历到的对象判定为垃圾对象。GC分类:1、MinorGC:针对新生代垃圾回收,频率高、速度快;2、MajorGC/FullGC:针对老年代、整堆回收,频率低、速度慢,尽量避免频繁触发。六、Spring核心面试题1.Spring的核心两大特性?IOC和AOP原理?详细答案:Spring核心:IOC控制反转、AOP面向切面编程。IOC控制反转:传统代码是开发者手动new对象,控制权在程序;IOC将对象的创建、管理、依赖注入权限交给Spring容器,控制权反转。通过Bean工厂统一管理所有组件,实现组件解耦,不用手动维护对象依赖关系。AOP面向切面编程:基于动态代理实现,在不修改原有业务代码的前提下,对方法进行增强。核心作用是统一处理公共逻辑,比如日志记录、事务控制、权限校验、性能监控,实现业务代码和公共代码解耦。2.SpringBean的生命周期?详细答案:1、实例化:Spring容器根据Bean定义,通过反射创建Bean对象;2、属性填充:自动完成依赖注入,给Bean的属性赋值;3、初始化:执行前置处理方法、自定义初始化方法、InitializingBean接口方法;4、就绪使用:Bean初始化完成,交给容器管理,可被业务调用;5、销毁:容器关闭时,执行Bean的销毁方法,释放资源。3.SpringMVC的执行流程?详细答案:1、客户端发送请求,前端控制器DispatcherServlet接收所有请求;2、DispatcherServlet调用处理器映射器,根据URL匹配对应的Controller方法;3、处理器适配器执行匹配到的Controller业务方法;4、Controller处理业务,返回ModelAndView视图数据;5、视图解析器解析视图路径,渲染页面;6、DispatcherServlet响应结果给客户端。七、数据库&Redis基础面试题1.MySQL索引的作用?优缺

温馨提示

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

评论

0/150

提交评论