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

下载本文档

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

文档简介

Java常见笔试面试题目及详细答案(完整版)一、Java基础核心(高频必考)1.JDK、JRE、JVM的区别与联系?详细答案:三者是层层包含的关系,范围从大到小:JDK>JRE>JVMJVM(Java虚拟机):是Java程序运行的核心容器,只负责解析、执行class字节码文件,不包含编译工具,是实现Java跨平台的核心。不同操作系统有对应的JVM版本。JRE(Java运行环境):包含JVM+Java核心类库(常用工具类、集合、IO等基础包)。只用于运行已经编译好的Java程序,没有代码编译功能,普通用户运行Java程序只需安装JRE。JDK(Java开发工具包):包含JRE+开发编译工具(javac编译、java运行、jar打包等工具)。是开发人员必备环境,既可以编写编译代码,也可以运行程序。总结:开发用JDK,运行用JRE,跨平台靠JVM。2.==和equals()的区别?详细答案:1、==是运算符基本数据类型:比较的是变量的数值大小;引用数据类型:比较的是对象的内存地址,判断是否是同一个对象。2、equals()是Object类的方法默认情况下(Object原生方法):和==效果一致,比较对象内存地址;重写后(String、Integer等包装类):比较对象的内容值,不再比较地址。高频场景:字符串比较必须用equals(),不能用==,因为字符串会存在常量池,地址大概率不同。3.String、StringBuilder、StringBuffer的区别?详细答案:1、String:不可变字符序列,底层是final修饰的char数组(JDK9后为byte数组)。每次拼接、修改字符串都会生成新对象,效率极低,适合少量、固定字符串使用。2、StringBuffer:可变字符序列,线程安全(所有方法加了synchronized锁),多线程环境下字符串操作优先使用,效率稍低。3、StringBuilder:可变字符序列,线程不安全,无锁机制,单线程环境下字符串拼接、修改效率最高,是日常开发最常用的类。使用场景总结:常量字符串用String;单线程频繁拼接用StringBuilder;多线程频繁拼接用StringBuffer。4.基本数据类型有哪些?取值范围是多少?详细答案:Java共8种基本数据类型,分为4类:1、整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)2、浮点型:float(4字节)、double(8字节)3、字符型:char(2字节)4、布尔型:boolean(1字节,无明确取值范围,只有true/false)核心取值:byte:-128~127;int:-2^31~2^31-1;char:0~65535注意:long类型数值必须加L后缀,float类型必须加F后缀。5.final、finally、finalize的区别?详细答案:1、final:是修饰符,用于限制变量、方法、类final变量:常量,赋值后不可修改;final方法:不可重写;final类:不可被继承。2、finally:是异常处理关键字,搭配try-catch使用。无论代码是否抛出异常,finally中的代码一定会执行(唯一例外:执行前调用System.exit(0)退出JVM),常用于释放资源(关闭流、数据库连接)。3、finalize:是Object类的废弃方法,JDK9之后彻底废弃。原本用于GC回收对象前,由虚拟机调用该方法完成资源收尾,因为执行时机不确定、无法保证调用,开发中完全不使用。6.接口和抽象类的区别?详细答案:1、定义与修饰:抽象类用abstract修饰;接口用interface修饰。2、继承实现:类只能单继承抽象类;类可以多实现接口,接口可以多继承接口。3、成员特性:抽象类:可以有普通变量、常量、普通方法、抽象方法、构造方法;接口(JDK8前):只能有全局常量、抽象方法;JDK8后接口:支持默认方法、静态方法;JDK9后支持私有方法。4、设计思想:抽象类是模板复用(抽取子类通用属性和行为);接口是行为规范(定义统一功能标准,不关心实现)。开发原则:优先使用接口,尽量少用抽象类。二、Java集合框架(笔试重点)1.ArrayList和LinkedList的区别?详细答案:1、底层结构:ArrayList底层是动态数组;LinkedList底层是双向链表。2、查询效率:ArrayList支持随机访问,通过下标直接定位元素,查询速度极快;LinkedList只能从头节点遍历查询,效率低。3、增删效率:ArrayList增删元素需要移动数组元素、扩容,尾部增删效率尚可,中间增删效率低;LinkedList只需修改节点指针,无需移动元素,中间、头部增删效率更高。4、内存占用:ArrayList会预留扩容空间,存在内存冗余;LinkedList每个节点保存数据和前后指针,单个元素占用内存更大。使用场景:大量查询、少量增删用ArrayList;大量增删、少量查询用LinkedList。2.HashMap的底层原理?JDK1.7和JDK1.8区别?详细答案:核心原理:HashMap基于数组+链表+红黑树实现,通过hash算法计算元素存储下标,解决哈希冲突,实现高效存取。JDK1.7底层:数组+单向链表,采用头插法插入元素,无红黑树结构。哈希冲突过多时,链表过长,查询效率急剧下降。并发场景下会出现循环链表,导致死循环。JDK1.8优化(核心考点):1、数据结构升级为:数组+单向链表+红黑树;2、链表长度超过8且数组容量大于64时,链表转为红黑树,提升查询效率;3、改为尾插法,避免并发循环链表问题;4、优化hash算法,减少哈希冲突概率。关键参数:默认容量16,负载因子0.75,扩容阈值=容量*0.75。3.HashMap和HashTable、ConcurrentHashMap的区别?详细答案:1、HashMap:线程不安全,效率高,允许key、value为null,无锁机制,单线程使用。2、HashTable:线程安全,效率极低。所有方法加全局synchronized锁,锁住整个数组,并发性能差,基本已被淘汰。不允许key、value为null。3、ConcurrentHashMap:JDK1.8主流并发容器,线程安全、效率高。采用CAS+synchronized分段锁,只锁住当前链表/树节点,不影响其他位置数据的读写,并发性能远超HashTable。允许部分null值,是多线程存取键值对的首选。4.List、Set、Map的区别?详细答案:1、List(有序可重复):存储单列数据,元素存入顺序和取出顺序一致,允许元素重复。常用实现类:ArrayList、LinkedList、Vector。2、Set(无序不可重复):存储单列数据,无序、元素唯一,不允许重复。常用实现类:HashSet、TreeSet、LinkedHashSet。3、Map(键值对存储):存储双列数据,key唯一不可重复,value可重复,无序。常用实现类:HashMap、TreeMap、ConcurrentHashMap。三、多线程与并发(面试高频)1.线程和进程的区别?详细答案:1、进程:操作系统资源分配的最小单位,独立占有内存、CPU资源,进程之间相互独立,切换开销大。一个进程包含多个线程。2、线程:CPU调度的最小单位,共享所在进程的所有资源,线程之间切换开销极小,是程序执行的最小单元。核心特点:进程独立,线程共享;进程开销大,线程轻量高效。2.实现多线程的几种方式?详细答案:1、继承Thread类:重写run()方法,调用start()启动线程。缺点:单继承限制,无法再继承其他类。2、实现Runnable接口:重写run()方法,传入Thread对象启动。无继承限制,灵活复用,推荐使用。3、实现Callable接口:重写call()方法,支持返回值、抛出异常,搭配FutureTask使用,适合有返回结果的线程任务。4、线程池创建:通过Executors或ThreadPoolExecutor创建,统一管理线程,避免频繁创建销毁线程的开销,企业开发主流方式。3.synchronized和Lock的区别?详细答案:1、锁类型:synchronized是内置锁,JVM层面实现;Lock是显式锁,代码层面实现(接口,常用ReentrantLock实现类)。2、加锁解锁:synchronized自动加锁、自动释放锁,无需手动控制;Lock需要手动lock()加锁、unlock()解锁,必须在finally中解锁,避免死锁。3、锁特性:synchronized只能是非公平锁,不可中断;Lock支持公平锁/非公平锁、可中断锁、超时锁,功能更丰富。4、条件等待:synchronized只有一个等待队列;Lock可以创建多个Condition等待队列,精准唤醒指定线程。使用场景:简单同步用synchronized,复杂并发控制、需要灵活锁机制用Lock。4.线程池的核心参数?详细答案:ThreadPoolExecutor七大核心参数:1、corePoolSize:核心线程数,线程池常驻线程,空闲也不会被回收;2、maximumPoolSize:最大线程数,线程池允许创建的最大线程数量;3、keepAliveTime:非核心线程空闲超时时间,超时未接收任务则被回收;4、unit:超时时间单位;5、workQueue:任务阻塞队列,存储等待执行的任务;6、threadFactory:线程工厂,用于创建线程;7、handler:拒绝策略,任务满负荷时的处理策略。核心执行流程:任务来了先找核心线程→核心线程满了进队列→队列满了创建非核心线程→线程数达到最大值触发拒绝策略。四、JVM虚拟机(进阶面试)1.JVM内存区域划分?详细答案:JVM运行时数据区分为5个区域,其中线程私有3个,线程共享2个:线程私有(随线程创建销毁):1、程序计数器:记录当前线程执行的字节码行号,唯一无内存溢出的区域;2、虚拟机栈:存储局部变量、方法栈帧,方法执行结束自动释放;3、本地方法栈:执行native本地方法(非Java实现的方法)。线程共享(随JVM启动销毁):1、堆内存:所有对象、数组的存储区域,GC主要回收区域;2、方法区:存储类信息、常量、静态变量、即时编译代码(JDK8后改为元空间,使用本地内存)。2.GC垃圾回收机制?哪些对象会被回收?详细答案:GC是JVM自动清理堆内存中无效对象、释放内存的机制,无需手动干预。可回收对象:没有任何有效引用指向的对象(引用链不可达)。判断垃圾对象的两种方式:1、引用计数法:对象被引用+1,失效-1,计数为0则回收,无法解决循环引用问题;2、可达性分析法(JVM主流):以GCRoots为起点遍历,无法遍历到的对象即为垃圾对象。GCRoots包含:虚拟机栈引用的对象、静态变量引用对象、常量引用对象、本地方法栈引用对象。3.年轻代、老年代的GC特点?详细答案:堆内存分为年轻代(Eden、Survivor)和老年代:1、年轻代GC(MinorGC):频繁执行,速度快。大部分对象朝生夕灭,对象存活一定次数GC后升入老年代。采用复制算法,无内存碎片。2、老年代GC(MajorGC/FullGC):执行频率极低,速度极慢,会暂停所有用户线程。清理老年代无效对象,采用标记整理、标记清除算法,尽量避免频繁FullGC。五、Spring核心框架(面试核心)1.Spring的核心思想?IOC和AOP详细答案:Spring两大核心:IOC控制反转、AOP面向切面编程IOC控制反转:将对象的创建、管理、依赖注入权限,从代码中交给Spring容器统一管理。传统开发是程序员主动new对象,IOC是容器主动注入对象,实现代码解耦。核心实现:Bean工厂、依赖注入(DI)。AOP面向切面编程:在不修改原有业务代码的前提下,对方法进行增强,实现日志记录、事务控制、权限校验、性能监控等通用功能。核心原理:动态代理。优势:统一处理通用逻辑,减少代码冗余,业务代码和通用功能解耦。2.SpringBean的生命周期?详细答案:完整生命周期(面试标准流程):1、实例化:Spring通过反射创建Bean对象;2、属性填充:自动注入依赖属性(DI依赖注入);3、初始化前置处理:执行BeanPostProcessor前置方法;4、初始化:执行InitializingBean的afterPropertiesSet()、自定义init方法;5、初始化后置处理:执行BeanPostProcessor后置方法;6、销毁:容器关闭时,执行DisposableBean的destroy()、自定义destroy方法;7、容器关闭:Bean彻底销毁。3.Spring事务传播机制有哪些?详细答案:共7种传播机制,重点掌握5种常用:1、REQUIRED(默认):有事务则加入当前事务,无事务则新建事务,最常用;2、SUPPORTS:有事务就加入,无事务则非事务运行;3、MANDATORY:必须在事务内运行,无事务直接报错;4、REQUIRES_NEW:新建独立事务,暂停原有事务,互不影响;5、NESTED:嵌套事务,依赖父事务,父事务回转子事务必须回滚,子事务回滚不影响父事务;6、NOT_SUPPORTED:始终非事务运行;7、NEVER:强制非事务,检测到事务直接报错。六、数据库与MyBatis高频题1.MySQL事务四大特性(ACID)?详细答案:1、原子性(Atomicity):事务是最小执行单元,要么全部执行成功,要么全部回滚,不可拆分;2、一致性(Consistency):事务执行前后,数据库数据完整性、约束规则保持一致;3、隔离性(Isolation):多个事务并发执行时,相互隔离、互不干扰;4、持久性(Durability):事务提交成功后,数据永久落地,数据库宕机也不会丢失。2.MySQL事务隔离级别?脏读、不可重复读、幻读?详细答案:三大读问题:1、脏读:一个事务读取到另一个事务未提交的脏数据;2、不可重复读:同一事务内,两次读取同一数据,结果不一致(其他事务修改提交);3、幻读:同一事务内,两次查询数据条数不一致(其他事务新增/删除数据)。四级隔离级别(从低到高):1、读未提交:解决无,存在三大问题;2、读已提交(Oracle默认):解决脏读,存在不可重复读、幻读;3、可重复读(MySQL默认):解决脏读、不可重复读,存在幻读;4、串行化:全部解决,事务串行执行,性能最低。3.MyBatis#{}和${}的区别?详细答案:1、#{}:预编译占位符会生成PreparedStatement,对参数进行预编译、参数转义,彻底防止SQL注入。可以接收普通参数、实体类属性、Map参数,日常查询、更新、新增优先使用。2、${}:字符串直接拼接直接将参数拼接进SQL语句,无预编译、无转义,存在严重SQL注入风险。只能用于动态表名、排序字段等无法预编译的场景。核心原则:能用#{}绝不使用${}。七、常见笔试编程题(简答+代码)1.手写单例模式(双重检查锁)详细答案:线程安全、高效、常用的单例实现方式,解决饿汉式浪费内存、懒汉式线程不安全问题。java

publicclassSingleton{

//volatile禁止指令重排,避免空指针

privatestaticvolatileSingletoninstance;

//私有构造方法,禁止外部实例化

privateSingleton(){}

//双重检查锁获取单例对象

温馨提示

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

最新文档

评论

0/150

提交评论