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

下载本文档

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

文档简介

Java常见面试题及详细答案(实战版)一、Java基础核心面试题1.JDK、JRE、JVM的区别与联系?答案:三者是层层包含的关系,范围从大到小依次是JDK>JRE>JVM。JVM是Java虚拟机,是Java程序运行的核心载体,负责加载字节码、解释/编译代码、内存管理、垃圾回收,是实现Java跨平台的核心,只负责运行程序。JRE是Java运行环境,包含JVM+Java核心运行类库(比如常用的String、ArrayList等基础类)。如果只是运行已经编译好的Java程序,只需要安装JRE即可。JDK是Java开发工具包,包含JRE+开发编译工具(javac编译器、java运行命令、jar打包工具等)。开发Java项目必须安装JDK,用来编写、编译、调试代码。简单总结:JVM负责跑程序,JRE给程序提供运行环境,JDK给开发者提供开发工具。2.==和equals()的区别?答案:==是运算符,equals()是Object类的方法,二者对比逻辑完全不同。对于基本数据类型:==比较的是变量的实际数值,基本类型没有equals方法。对于引用数据类型:==比较的是对象的内存地址,也就是判断两个变量是不是指向同一个对象;而equals()默认也是比较内存地址,但很多类会重写该方法。像String、Integer、List等常用类,都重写了equals()方法,重写后不再比较地址,而是比较对象的内容值是否相等。举个例子:newString("abc")=="abc"结果是false(地址不同),但两个对象调用equals()结果是true(内容相同)。3.String、StringBuilder、StringBuffer的区别?答案:核心区别在于可变性和线程安全,日常开发使用优先级:StringBuilder>StringBuffer>频繁拼接不直接用String。String是不可变字符串,底层是被final修饰的字符数组(JDK9+是字节数组)。每次对String进行拼接、修改操作,都会生成新的字符串对象,原对象不会改变,频繁操作会产生大量无用对象,占用内存、降低效率。StringBuilder是可变字符串,底层数组可扩容,修改操作不会新建对象,效率极高。非线程安全,多线程并发操作时会出现数据异常,适合单线程场景。StringBuffer同样是可变字符串,底层逻辑和StringBuilder基本一致,所有公开方法都加了synchronized锁,线程安全。但加锁会带来性能损耗,效率比StringBuilder低,适合多线程场景。4.final、finally、finalize的区别?答案:三个单词只是拼写相似,功能完全无关,是Java三个不同的语法机制。final是修饰符,可以修饰类、方法、变量。final修饰的类不能被继承;修饰的方法不能被重写;修饰的变量是常量,只能赋值一次,不可修改。finally是异常处理关键字,搭配try-catch使用。finally代码块的特点是几乎都会执行,无论代码正常运行还是抛出异常,常用于释放资源(关闭流、关闭数据库连接),唯一不执行的场景是调用了System.exit()终止JVM。finalize()是Object类的废弃方法(JDK9开始废弃),是垃圾回收前触发的方法,原本用于对象回收前的资源收尾。但该方法执行时机不确定、容易导致内存泄漏,现在开发中完全不使用。5.接口和抽象类的区别?答案:抽象类是对事物的本质抽象,接口是对行为的功能抽象,具体区别如下:1.继承方式:抽象类是单继承,一个类只能继承一个抽象类;接口是多实现,一个类可以实现多个接口。2.成员修饰符:抽象类可以有普通成员变量、常量、构造方法、普通方法、抽象方法;接口(JDK8前)只能有全局常量和抽象方法,JDK8新增默认方法、静态方法,JDK9新增私有方法,没有构造方法。3.权限修饰:抽象类方法可以用public、protected、default修饰;接口的抽象方法默认是public权限,不能自定义其他权限。4.设计思想:抽象类用于定义子类的通用模板,抽取公共属性和行为;接口用于定义扩展功能,实现功能解耦。日常开发中,优先使用接口,避免单继承的局限性。二、Java集合面试题1.ArrayList和LinkedList的区别?答案:二者都是List接口的实现类,线程不安全,核心差异是底层数据结构不同,导致适用场景完全不同。ArrayList底层是动态数组,内存地址连续。优点是支持随机访问,通过下标查询、修改元素效率极高;缺点是增删元素时需要移动数组元素,数据量大时效率低,且会存在一定的扩容开销。LinkedList底层是双向链表,内存地址不连续,每个节点存储数据和前后节点引用。优点是增删元素只需要修改节点引用,无需移动数据,增删效率高;缺点是不支持随机访问,查询元素需要从头遍历,查询效率极低。实际开发:查询多、增删少用ArrayList,频繁增删、极少查询用LinkedList,90%场景下都是用ArrayList。2.HashMap的底层原理?JDK1.7和JDK1.8的区别?答案:HashMap是基于哈希表实现的键值对集合,线程不安全,允许null键和null值,核心原理是数组+链表+红黑树(JDK1.8)。存储流程:通过key的hashCode()计算哈希值,经过扰动算法优化后,确定数组下标;如果下标位置无元素,直接存入;如果有元素,发生哈希冲突,挂在链表上;当链表长度大于8且数组容量大于64时,链表转为红黑树,提升查询效率。JDK1.7和JDK1.8核心区别:1.数据结构:1.7只有数组+链表;1.8新增红黑树,解决长链表查询慢的问题。2.哈希扰动:1.7扰动算法复杂;1.8简化扰动算法,减少哈希冲突。3.插入方式:1.7链表头插法,多线程扩容容易出现环形链表,导致死循环;1.8改为尾插法,规避了环形链表问题。4.扩容优化:1.8扩容时会重新判断元素下标,无需全部重算哈希,效率更高。3.HashMap和HashTable、ConcurrentHashMap的区别?答案:1.HashMap:线程不安全,允许null键和null值,效率高,适合单线程场景,是日常开发最常用的键值对集合。2.HashTable:线程安全,所有方法加了synchronized全局锁,效率极低,不允许null键和null值。目前基本被淘汰,生产环境几乎不用。3.ConcurrentHashMap:线程安全,是HashTable的优化方案。JDK1.7采用分段锁,将数组分为多个分段,只锁当前操作分段;JDK1.8放弃分段锁,采用CAS+synchronized锁节点,锁粒度更细、并发效率更高,支持高并发场景,是多线程下的首选。4.HashSet的底层原理?答案:HashSet底层完全基于HashMap实现,本质就是一个简化版的HashMap。HashSet存储的元素,作为HashMap的key存入,而HashMap的value统一是一个固定的Object常量。正因如此,HashSet具备去重特性,因为HashMap的key不允许重复。所以HashSet的去重逻辑依赖两个方法:先判断hashCode()哈希值是否相同,哈希值不同直接判定不重复;哈希值相同,再调用equals()比较内容,内容不同才允许存入,内容相同则判定重复、拒绝存入。三、多线程面试题1.线程和进程的区别?答案:进程是操作系统资源分配的最小单位,线程是CPU调度执行的最小单位。一个进程可以包含多个线程,同一个进程内的所有线程共享进程的内存资源(堆内存、方法区),线程之间独立执行、互不干扰,拥有自己独立的栈内存。进程开销大、独立性强,一个进程崩溃不会影响其他进程;线程开销小、耦合度高,一个线程出现异常崩溃,大概率会导致整个进程退出。简单说:进程是独立运行的程序,线程是程序内部的执行分支。2.实现多线程的几种方式?答案:日常开发常用四种方式,推荐使用线程池方式,不推荐前两种继承、无返回值方式。1.继承Thread类:重写run()方法,调用start()启动线程。缺点是单继承限制,无法再继承其他类,灵活性差。2.实现Runnable接口:重写run()方法,传入Thread对象启动。无返回值、不能抛出异常,适合简单无结果的任务。3.实现Callable接口:重写call()方法,有返回值、可以抛出异常,搭配FutureTask使用,可以获取线程执行结果。4.线程池创建:通过Executors工具类或ThreadPoolExecutor自定义线程池,统一管理线程,避免频繁创建销毁线程的开销,适合大量并发任务,是生产环境首选。3.synchronized和Lock的区别?答案:二者都是用来解决多线程并发安全问题的锁机制,synchronized是原生语法锁,Lock是代码层面的工具锁。1.锁的实现:synchronized是JVM底层实现,自动加锁、自动释放锁;Lock是Java代码实现,需要手动lock()加锁、unlock()释放锁。2.锁的特性:synchronized是悲观锁、可重入锁、不可中断,锁超时无法主动释放;Lock(ReentrantLock)支持可重入、可中断、可超时、公平锁/非公平锁切换,功能更灵活。3.锁粒度:synchronized可以修饰方法、代码块;Lock只作用于代码块。4.性能:低并发场景下二者性能差距不大;高并发、锁竞争激烈场景下,Lock性能更优。日常开发:简单并发场景用synchronized,复杂、高并发、需要灵活锁策略的场景用ReentrantLock。4.线程池的核心参数?答案:自定义线程池核心是ThreadPoolExecutor,一共有7个核心参数,也是面试高频考点:1.corePoolSize:核心线程数,线程池常驻的线程数量,即使空闲也不会被回收。2.maximumPoolSize:最大线程数,线程池能创建的最大线程总量。3.keepAliveTime:空闲线程存活时间,非核心线程空闲超过该时间会被回收。4.unit:存活时间的时间单位。5.workQueue:任务阻塞队列,存储等待执行的任务,常用ArrayBlockingQueue、LinkedBlockingQueue。6.threadFactory:线程工厂,用于创建线程,可自定义线程名称、优先级。7.handler:拒绝策略,当线程数和队列都满了,无法处理新任务时的兜底策略。核心执行流程:任务来了先找核心线程→核心线程满了进队列→队列满了创建非核心线程→达到最大线程数触发拒绝策略。四、JVM核心面试题1.JVM内存区域划分?答案:JVM运行时数据区分为5个区域,其中线程私有3个,线程共享2个。线程私有(随线程创建销毁):1.程序计数器:记录当前线程执行的字节码行号,是唯一一个没有内存溢出的区域。2.虚拟机栈:存储局部变量、方法参数、方法栈帧,方法调用和执行都在该区域,栈深度过大会抛出栈溢出异常。3.本地方法栈:专门为Native本地方法服务,功能和虚拟机栈类似。线程共享(全局唯一,JVM启动创建,关闭销毁):1.堆内存:所有对象、数组的存储区域,是垃圾回收的核心区域,分为新生代、老年代。2.方法区(元空间):存储类信息、常量、静态变量、运行时常量池,JDK1.8后彻底移除永久代,改用元空间,直接使用本地内存。2.垃圾回收(GC)的原理?哪些对象会被回收?答案:GC就是JVM自动识别内存中无用对象,释放占用的堆内存,避免内存泄漏和内存溢出,无需开发者手动释放内存。判定对象可回收的核心算法是可达性分析:以GCRoots作为起始节点遍历内存,能遍历到的对象是存活对象,没有被遍历到、无任何引用的对象,判定为垃圾对象,会被GC回收。常见GCRoots对象:虚拟机栈中引用的对象、静态变量引用的对象、常量引用的对象、本地方法栈引用的对象。注意:重写finalize()方法的对象,回收前会执行一次该方法,可短暂复活对象,但不推荐使用。3.新生代和老年代的GC特点?答案:堆内存分为新生代(占比1/3)和老年代(占比2/3),回收策略不同。新生代:对象生命周期短、创建销毁频繁。分为Eden区、两个Survivor区。采用复制算法,垃圾回收频率高、速度快,发生的GC叫MinorGC,多数对象诞生后一次GC就会被回收,存活多次GC的对象会晋升到老年代。老年代:存储存活时间长、内存占用大的对象。对象存活率高、回收频率低,采用标记清除、标记整理算法。发生的GC叫MajorGC,速度慢、耗时久,频繁MajorGC是系统性能卡顿的重要原因。五、Spring核心面试题1.SpringIOC的原理?答案:IOC全称控制反转,是Spring的核心思想,本质是把对象的创建、管理、依赖注入权限,从代码业务逻辑交给Spring容器。传统开发是开发者主动new对象、管理依赖,控制权在程序;IOC是容器自动创建对象、维护对象依赖关系,控制权反转给容器。核心流程:Spring启动时扫描项目注解/配置文件→解析Bean定义→通过反射创建Bean对象→存入IOC容器单例池→自动完成依赖注入,程序使用时直接从容器获取Bean。核心作用:解耦,降低代码耦合度,方便统一管理对象,为AOP、事务等功能提供基础。2.SpringAOP的原理和应用场景?答案:AOP面向切面编程,核心是在不修改原有业务代码的前提下,对方法进行增强,基于动态代理实现。核心原理:Spring默认优先JDK动态代理(接口代理),没有接口则用CGLIB字节码代理。通过切面、切点表达式,拦截目标方法,在方法执行前后、异常时执行自定义增强逻辑。常用应用场景:统一日志记录、权限校验、事务控制、接口限流、性能耗时统计、异常统一处理,完美适配通用公共逻辑,避免代码冗余。3.SpringBean的生命周期?答案:完整生命周期分为6个核心步骤,面试回答主流完整版流程即可:1.实例化:Spring通过反射创建Bean空对象。2.属性填充:自动完成依赖注入,给对象属性赋值。3.前置处理:执行BeanPostProcessor前置增强方法。4.初始化:执行InitializingBean初始化方法、自定义init方法。5.后置处

温馨提示

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

评论

0/150

提交评论