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

下载本文档

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

文档简介

Java面试题集及详细答案(实战完整版)一、Java基础语法面试题1、JDK、JRE、JVM的区别是什么?参考答案:三者是层层包含的关系,范围从大到小依次为JDK>JRE>JVM。1、JVM(Java虚拟机):是Java程序运行的核心载体,负责加载字节码文件、解释/编译代码、内存管理、垃圾回收,是Java跨平台的根本。只负责运行,不包含编译工具。2、JRE(Java运行环境):包含JVM+Java核心类库(系统自带的基础工具类,如String、集合类等)。仅用于运行已编译好的Java程序,无法开发Java项目。3、JDK(Java开发工具包):包含JRE+开发编译工具(javac编译器、java运行命令、jar打包工具、调试工具等)。是开发、编译、运行Java程序的完整环境,日常开发必须安装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,仅多线程场景使用StringBuffer。4、final、finally、finalize的区别?参考答案:1、final:是修饰符,用于修饰变量、方法、类:-修饰变量:变量变为常量,只能赋值一次,不可修改;-修饰方法:方法不可被重写;-修饰类:类不可被继承。2、finally:是异常处理关键字,搭配try-catch使用。代码块无论是否发生异常、是否执行return,最终都会执行(唯一不执行场景:手动调用System.exit(0)退出程序)。主要用于释放资源,如关闭流、数据库连接。3、finalize:是Object类的废弃方法,JDK9之后已废弃。原本作用是垃圾回收器回收对象前触发,用于对象收尾资源释放,但执行时机不确定、不可靠,开发中绝对不使用。5、基本数据类型有哪些?取值范围是多少?参考答案:Java共8种基本数据类型,分为四类:1、整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)-byte:-128~127-short:-32768~32767-int:-2^31~2^31-1(默认整型)-long:-2^63~2^63-1(定义需加L后缀)2、浮点型:float(4字节)、double(8字节)-float:定义需加F后缀,精度较低;-double:默认浮点类型,精度更高。3、字符型:char(2字节),存储单个字符,可存汉字、字母、符号。4、布尔型:boolean(1字节),只有true、false两个值,不参与类型转换。二、Java面向对象面试题1、面向对象的三大特性及核心理解?参考答案:三大特性:封装、继承、多态,是Java面向对象编程的核心思想。1、封装:将类的属性私有化,通过public的get/set方法对外提供访问入口。核心目的是隐藏内部细节、保护数据安全、降低耦合,统一数据访问规则。2、继承:子类继承父类的属性和方法,实现代码复用。子类可在父类基础上扩展新功能,遵循单继承、多实现原则(一个类只能继承一个父类,可实现多个接口)。3、多态:同一行为,不同对象表现出不同结果。实现前提:继承、方法重写、父类引用指向子类对象。核心作用是提高代码扩展性、降低代码冗余,适配不同子类业务场景。2、重载和重写的区别?参考答案:1、方法重载(Overload):-发生在同一个类中;-方法名必须相同,参数列表(个数、类型、顺序)必须不同;-返回值、访问修饰符不影响重载;-属于编译期多态,程序编译时即可确定调用方法。2、方法重写(Override):-发生在父子类之间;-方法名、参数列表、返回值必须和父类一致;-访问权限不能比父类更严格(父类protected,子类不能是private);-不能重写final、static、私有方法;-属于运行期多态,程序运行时才确定调用子类方法。3、接口和抽象类的区别?参考答案:1、定义与继承规则:-抽象类:用abstract修饰,单继承,一个类只能继承一个抽象类;-接口:用interface修饰,多实现,一个类可实现多个接口。2、成员特性:-抽象类:可包含普通成员变量、常量、普通方法、抽象方法、构造方法;-接口:JDK8之前只有常量和抽象方法;JDK8新增默认方法、静态方法;JDK9新增私有方法,无成员变量、无构造方法。3、设计思想:-抽象类:是模板设计,描述一类事物的共性特征,包含属性和行为;-接口:是行为规范,只定义行为标准,不关注事物属性。开发场景:仅需定义行为规范用接口,需要统一属性+行为模板用抽象类。三、Java集合面试题(高频)1、ArrayList和LinkedList的区别?参考答案:1、底层结构:-ArrayList:底层是动态数组,连续内存空间;-LinkedList:底层是双向链表,非连续内存。2、性能差异:-查询/遍历:ArrayList效率极高,支持下标随机访问;LinkedList需要从头遍历,查询效率低;-增删操作:ArrayList增删会触发数组扩容、元素移位,效率低;LinkedList仅修改节点指针,无需移动元素,首尾增删效率高。3、线程安全:两者均线程不安全,多线程并发修改会出现数据异常。开发规范:绝大多数业务查询遍历场景用ArrayList,极少用LinkedList。2、HashMap的底层原理?JDK1.7和JDK1.8的区别?参考答案:HashMap是基于哈希表实现的键值对集合,无序、键唯一、线程不安全,是开发最常用的集合。底层核心原理:通过hash算法计算key的哈希值,确定数组下标,存储键值对;出现哈希冲突时,采用链表/红黑树解决。JDK1.7与JDK1.8核心区别:1、数据结构:1.7是「数组+单向链表」;1.8优化为「数组+单向链表+红黑树」;2、哈希冲突优化:1.7链表过长查询效率极低;1.8当链表长度≥8且数组容量≥64时,链表转为红黑树,大幅提升查询效率;链表长度≤6时退化为链表;3、插入方式:1.7链表采用头插法,多线程下易出现环形链表死循环;1.8改为尾插法,规避死循环问题;4、扩容机制:1.8优化了扩容重哈希逻辑,减少元素移位次数,性能更高。3、HashMap和ConcurrentHashMap的区别?参考答案:1、线程安全:HashMap线程不安全,多线程并发增删改会数据丢失、报错;ConcurrentHashMap是线程安全的并发集合。2、锁机制:-JDK1.7ConcurrentHashMap:采用分段锁,将数组分为多个分段,仅锁定当前操作分段,并发效率高;-JDK1.8ConcurrentHashMap:废弃分段锁,采用CAS+synchronized锁,只锁定当前哈希桶的头节点,锁粒度更细、并发性能更强。3、适用场景:单线程业务用HashMap;多线程并发读写场景必须用ConcurrentHashMap,不推荐Hashtable(全局锁,效率极低)。四、多线程面试题(核心高频)1、线程和进程的区别?参考答案:1、进程:是操作系统资源分配的最小单位,独立占用内存、CPU资源,进程之间相互独立,切换开销大。一个程序至少包含一个进程。2、线程:是CPU调度的最小单位,依附于进程存在,共享进程的内存资源(堆、方法区),线程之间独立栈内存,切换开销极小。一个进程可包含多个线程。核心总结:进程是资源分配单位,线程是执行调度单位;进程开销大、隔离性强,线程开销小、资源共享。2、synchronized和Lock的区别?参考答案:1、底层层面:synchronized是JVM原生锁,底层由虚拟机指令实现;Lock是Java代码层面锁(接口),基于AQS队列实现。2、锁特性:-synchronized:隐式锁,自动加锁、自动释放锁;不可中断、只能非公平锁、不支持超时;-Lock(常用ReentrantLock):显式锁,手动lock()加锁、unlock()释放锁;可中断、支持公平/非公平锁、支持超时锁、可绑定多个条件锁。3、性能:JDK1.6之后JVM对synchronized做了大量优化(偏向锁、轻量级锁、重量级锁),两者性能基本持平。开发场景:简单同步场景用synchronized,需要锁超时、可中断、公平锁等高级特性用ReentrantLock。3、volatile关键字的作用?能否保证线程安全?参考答案:volatile是轻量级同步关键字,核心两大作用:1、保证可见性:一个线程修改volatile变量,会立即刷新到主内存,其他线程能实时感知变量更新,避免变量缓存导致的可见性问题;2、禁止指令重排:防止编译器、CPU对代码进行无序重排,解决并发场景下的指令错乱问题(典型场景:单例模式双重检查锁)。重点:volatile不能保证原子性,无法保证线程安全。比如i++操作(读取、修改、写入三步),volatile只能保证可见性,无法防止多线程同时修改,依然会出现数据错乱。需要原子操作需用Atomic原子类或锁机制。五、JVM面试题(中级必问)1、JVM内存区域划分?各区域作用?参考答案:JVM运行时数据区分为5个区域,其中线程私有3个、线程共享2个:线程私有(随线程创建销毁):1、程序计数器:记录当前线程执行的字节码行号,无内存溢出,是唯一一个JVM规范无OOM的区域;2、虚拟机栈:存储方法栈帧(局部变量、操作数栈、方法返回值),方法调用即入栈,执行结束即出栈,栈深过大会栈溢出(StackOverflowError);3、本地方法栈:作用和虚拟机栈一致,专门为Native本地方法服务。线程共享(全局常驻):1、堆内存:JVM最大内存区域,所有对象、数组均在堆中分配,是垃圾回收的核心区域,会发生堆OOM;2、方法区(元空间):存储类信息、常量、静态变量、即时编译代码,JDK1.8后废弃永久代,改为元空间,使用本地内存,减少OOM。2、垃圾回收(GC)的核心原理?哪些对象会被回收?参考答案:GC是JVM自动回收堆中无用对象内存的机制,无需手动释放,避免内存泄漏。判定垃圾对象方式:采用「可达性分析算法」,以GCRoots为起点遍历内存,无法遍历到的对象即为垃圾对象,会被回收。可作为GCRoots的对象:虚拟机栈中引用的对象、静态变量引用对象、常量引用对象、本地方法栈引用对象。不会回收的对象:被GCRoots直接或间接引用的存活对象。3、MinorGC、MajorGC、FullGC的区别?参考答案:1、MinorGC:新生代垃圾回收,频率高、速度快。新生代内存不足时触发,清理Eden区和Survivor区无效对象,停顿时间短,对业务影响小。2、MajorGC:老年代垃圾回收,频率低、速度慢。老年代内存不足时触发,仅清理老年代对象,耗时较长。3、FullGC:全堆垃圾回收,清理新生代+老年代+元空间,效率极低、系统停顿时间最长。尽量避免触发,常见触发场景:手动调用System.gc()、老年代空间不足、MinorGC后晋升对象过大、元空间溢出等。六、Spring核心面试题1、Spring的核心思想是什么?IOC和AOP的理解?参考答案:Spring两大核心:IOC(控制反转)、AOP(面向切面编程)。1、IOC控制反转:传统开发中,对象由开发者手动new创建、管理依赖;IOC将对象的创建、依赖注入、生命周期管理全权交给Spring容器,控制权从开发者反转给容器。核心目的是解耦,降低代码依赖度。DI依赖注入是IOC的实现方式,通过构造器、set方法、注解将依赖对象注入当前Bean。2、AOP面向切面编程:基于动态代理机制,在不修改原有业务代码的前提下,对方法进行增强。核心作用是统一处理通用逻辑,如日志记录、事务控制、权限校验、接口限流等,实现业务逻辑与通用逻辑解耦。2、SpringBean的生命周期?参考答案:完整生命周期分为7步,面试回答核心流程即可:1、实例化:Spring容器根据配置,通过反射创建Bean实例(仅创建对象,未赋值);2、属性填充:完成依赖注入,给Bean的属性赋值;3、初始化前置处理:执行BeanPostProcessor前置增强方法;4、初始化:执行InitializingBean初始化方法、自定义init方法;5、初始化后置处理:执行BeanPostProcessor后置增强方法;6、就绪使用:Bean完成初始化,存入单例池,供业务调用;7、销毁:容器关闭时,执行DisposableBean销毁方法、自定义destroy方法。3、Spring事务传播机制有哪些?常用场景?参考答案:Spring共7种事务传播机制,开发常用5种:1、REQUIRED(默认):当前有事务则加入,无则新建事务。最常用,适配绝大多数增删改业务;2、SUPPORTS:当前有事务则加入,无则以非事务运行。适配查询业务;3、MANDATORY:必须在事务中运行,无事务直接报错;4、REQUIRES_NEW:新建独立事务,暂停当前已有事务。适用于独立日志记录、异步记录场景,主事务回滚不影响该事务;5、NESTED:嵌套事务,依赖父事务,父事务回滚则子事务必回滚,子事务回滚不影响父事务。七、数据库与JDBC面试题1、MySQL索引的优缺点?参考答案:优点:1、大幅降低查询数据的IO次数,极大提升查询效率;2、通过索引有序性,可快速完成排序、分组、去重操作;3、唯一索引可保证字段数据唯一性。缺点:1、占用额外磁盘空间,索引越多,空间占用越大;2、降低增删改效率,数据变更时,需要同步更新索引结构,产生额外开销;3、索引失效会导致查询效率更低。开发原则:高频查询字段建索引,低频查询、高频修改字段不建索引。2、什么是SQL注入?

温馨提示

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

评论

0/150

提交评论