2026年Java线程面试题,持续更新

📅 发布时间:2026/7/9 4:32:29 👁️ 浏览次数:
2026年Java线程面试题,持续更新
前言这篇文章是我近期面试遇到的一些问题技术类做的一个总结。注意1.有些问题没有标准答案需要读者朋友在网上查找。2.有些问题答案太长三言两语道不尽直接给了链接可以复制链接去搜索。3.有些技术涉及到很多问题我给了总结的链接之后又给大家列出了我面试遇到的题目Part 1 Java基础1.1. JDK的基本的类库存放位置jre/lib/rt.jar这个问题很简单但是很多人答不上来常用的 Java 核心包 (Java Core Package)java.lang Java 编程语言的基本类库Object、String、StringBuffer、StringBuilder、System、Runtime、Throwable、Exception、Error、Thread、Math等java.io 通过数据流、对象序列以及文件系统实现的系统输入、输出java.util 集合类、时间处理模式、日期时间工具等各类常用工具包其它还有java.sql 访问和处理来自于 Java 标准数据源数据的类java.test 以一种独立于自然语言的方式处理文本、日期、数字和消息的类和接口java.math简明的整数算术以及十进制算术的基本函数1.4. Unsafe类Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力同时也带来了指针的问题1.5. Session、cookie区别1、cookie数据存放在客户端session 数据放在服务器上。2、cookie不是很安全别人可以分析存放在本地的cookie并进行cookie欺骗考虑到安全应当使用session。3、session会在一定时间内保存在服务器上当访问增多会比较占用你服务器的性能考虑性能应当使用cookie。4、不同浏览器对cookie的数据大小限制不同个数限制也不相同。5、可以考虑将登陆信息等重要信息存放为session不重要的信息可以放在cookie中。1.9. HashMap和HashTable的区别1.HashMap继承了AbstractMapHashTable继承Dictionary抽象类两者均实现Map接口2.HashMap和Hashtable的底层实现都是数组链表结构实现、3.Hashtable是线程安全HashMap是非线程安全HashMap的性能会高于Hashtable我们平时使用时若无特殊需求建议使用HashMap在多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合Collections.synchronizedMap()实现原理是Collections定义了一个SynchronizedMap的内部类这个类实现了Map接口在调用方法时使用synchronized来保证线程同步4.两者计算hash的方法不同Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模HashMap计算hash对key的hashcode进行了二次hash以获得更好的散列值然后对table数组长度取摸5.HashMap可以使用null作为key不过建议还是尽量避免这样使用。HashMap以null作为key时总是存储在table数组的第一个节点上。而Hashtable则不允许null作为key6.HashMap的初始容量为16Hashtable初始容量为11两者的填充因子默认都是0.757.HashMap扩容时是当前容量翻倍即:capacity2Hashtable扩容时是容量翻倍1即:capacity21篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、场景题、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho1.9. ArrayList和LinkedList的区别1、ArrayList和LinkedList可想从名字分析它们一个是Array(动态数组)的数据结构一个是Link(链表)的数据结构此外它们两个都是对List接口的实现。前者是数组队列相当于动态数组后者为双向链表结构也可当作堆栈、队列、双端队列2、当随机访问List时get和set操作ArrayList比LinkedList的效率更高因为LinkedList是线性的数据存储方式所以需要移动指针从前往后依次查找。3、当对数据进行增加和删除的操作时(add和remove操作)LinkedList比ArrayList的效率更高因为ArrayList是数组所以在其中进行增删操作时会对操作点之后所有数据的下标索引造成影响需要进行数据的移动。4、从利用效率来看ArrayList自由性较低因为它需要手动的设置固定大小的容量但是它的使用比较方便只需要创建然后添加数据通过调用下标进行使用而LinkedList自由性较高能够动态的随数据量的变化而变化但是它不便于使用。5、ArrayList主要控件开销在于需要在lList列表预留一定空间而LinkList主要控件开销在于需要存储结点信息以及结点指针信息。Concurrenthashmap原理分析有用HashTable容器在竞争激烈的并发环境下表现出效率低下的原因是因为所有访问HashTable的线程都必须竞争同一把锁那假如容器里有多把锁每一把锁用于锁容器其中一部分数据那么当多线程访问容器里不同数据段的数据时线程间就不会存在锁竞争从而可以有效的提高并发访问效率这就是ConcurrentHashMap所使用的锁分段技术首先将数据分成一段一段的存储然后给每一段数据配一把锁当一个线程占用锁访问其中一个段数据的时候其他段的数据也能被其他线程访问。Part 3 Spring与ORM映射框架面试题集锦3.1. Spring作用域singleton单例模式当spring创建applicationContext容器的时候spring会欲初始化所有的该作用域实例加上lazy-init就可以避免预处理prototype原型模式每次通过getBean获取该bean就会新产生一个实例创建后spring将不再对其管理下面是在web项目下才用到的request搞web的大家都应该明白request的域了吧就是每次请求都新产生一个实例和prototype不同就是创建后接下来的管理spring依然在监听session每次会话同上global session全局的web域类似于servlet中的application。3.2. SpringMVC面试题面试题集锦SpringMVC的流程SpringMVC与Struts2的区别1springmvc的入口是一个servlet即前端控制器DispatchServlet而struts2入口是一个filter过虑器StrutsPrepareAndExecuteFilter。2springmvc是基于方法开发(一个url对应一个方法)请求参数传递到方法的形参可以设计为单例或多例(建议单例)struts2是基于类开发传递参数是通过类的属性只能设计为多例。3Struts采用值栈存储请求和响应的数据通过OGNL存取数据springmvc通过参数解析器是将request请求内容解析并给方法形参赋值将数据和视图封装成ModelAndView对象最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl过滤器与拦截器区别①过滤器只能在容器初始化时被调用一次在action的生命周期中而拦截器可以多次被调用②过滤器可以对几乎所有的请求起作用拦截器只能对action请求起作用。③过滤器不能访问action上下文、值栈里的对象而拦截器可以访问。④过滤器依赖于servlet容器而拦截器不依赖于servlet容器。⑤过滤器是基于函数回调而拦截器是基于java的反射机制的。⑥过滤器不能获取IOC容器中的各个bean而拦截器可以这点很重要在拦截器里注入一个service可以调用业务逻辑。4.4. Mybatis面试题面试题集锦篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、场景题、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho#{}和${}的区别是什么#{}是预编译处理${}是字符串替换。Mybatis在处理#{}时会将sql中的#{}替换为?号调用PreparedStatement的set方法来赋值Mybatis在处理时就是把{}替换成变量的值。使用#{}可以有效的防止SQL注入提高系统安全性。Xml映射文件中除了常见的select|insert|updae|delete标签之外还有哪些标签trim | where | set | foreach | if | choose | when | otherwise | bindMybatis批量插入数据可以使用foreach标签Part 4 SpringBoot相关Springboot优点内置Tomcat、jetty简化配置配置restful风格springboot核心注解SpringbootApplication包含3个配置springbootConfiguration、enableAutoConfiguration、componentScanSpring Boot 支持哪些日志框架Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架如果你使用starters启动器Spring Boot将使用Logback作为默认日志框架。无论使用哪种日志框架Spring Boot都支持配置将日志输出到控制台或者文件中Part 5 数据库相关面试题集锦什么是数据库约束,常见的约束有哪几种?数据库约束用于保证数据库表数据的完整性正确性和一致性。可以通过定义约束\索引\触发器来保证数据的完整性。总体来讲,约束可以分为:主键约束primary key外键约束foreign key唯一约束unique检查约束check空值约束not null默认值约束default乐观锁和悲观锁什么是事务事务是对数据库中一系列操作进行统一的回滚或者提交的操作主要用来保证数据的完整性和一致性。事务四大特性原子性Atomicity: 原子性是指事务包含的所有操作要么全部成功要么全部失败回滚因此事务的操作如果成功就必须要完全应用到数据库如果操作失败则不能对数据库有任何影响。一致性Consistency: 事务开始前和结束后数据库的完整性约束没有被破坏。比如A向B转账不可能A扣了钱B却没收到。隔离性Isolation: 隔离性是当多个用户并发访问数据库时比如操作同一张表时数据库为每一个用户开启的事务不能被其他事务的操作所干扰多个并发事务之间要相互隔离。同一时间只允许一个事务请求同一数据不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱在A取钱的过程结束前B不能向这张卡转账。持久性Durability: 持久性是指一个事务一旦被提交了那么对数据库中的数据的改变就是永久性的即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。事务的并发问题1、脏读事务A读取了事务B更新的数据然后B回滚操作那么A读取到的数据是脏数据2、不可重复读事务 A 多次读取同一数据事务 B 在事务A多次读取的过程中对数据作了更新并提交导致事务A多次读取同一数据时结果因此本事务先后两次读到的数据结果会不一致。3、幻读幻读解决了不重复读保证了同一个事务里查询的结果都是事务开始时的状态一致性。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作 这时事务T2又对这个表中插入了一行数据项而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据会发现还有跟没有修改一样其实这行是从事务T2中添加的就好像产生幻觉一样这就是发生了幻读。篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、场景题、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho事务的隔离级别1. 读未提交另一个事务修改了数据但尚未提交而本事务中的SELECT会读到这些未被提交的数据脏读2. 不可重复读事务 A 多次读取同一数据事务 B 在事务A多次读取的过程中对数据作了更新并提交导致事务A多次读取同一数据时结果因此本事务先后两次读到的数据结果会不一致。3. 可重复读在同一个事务里SELECT的结果是事务开始时时间点的状态因此同样的SELECT操作读到的结果会是一致的。但是会有幻读现象4. 串行化最高的隔离级别在这个隔离级别下不会产生任何异常。并发的事务就像事务是在一个个按照顺序执行一样事务的传播行为1.PROPAGATION_REQUIRED如果当前没有事务就创建一个新事务如果当前存在事务就加入该事务该设置是最常用的设置。2.PROPAGATION_SUPPORTS支持当前事务如果当前存在事务就加入该事务如果当前不存在事务就以非事务执行。3.PROPAGATION_MANDATORY支持当前事务如果当前存在事务就加入该事务如果当前不存在事务就抛出异常。4.PROPAGATION_REQUIRES_NEW创建新事务无论当前存不存在事务都创建新事务。5.PROPAGATION_NOT_SUPPORTED以非事务方式执行操作如果当前存在事务就把当前事务挂起。6.PROPAGATION_NEVER以非事务方式执行如果当前存在事务则抛出异常。7.PROPAGATION_NESTED如果当前存在事务则在嵌套事务内执行。如果当前没有事务则执行与PROPAGATION_REQUIRED类似的操作。