news 2026/5/8 18:26:31

面试八股真题统计与面经

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面试八股真题统计与面经

引言:记录自己5月份以来的面试真题以及感受,会持续更新

开科唯识

面试感受:

总体面试情况是预定的30分钟聊满,还给了反问环节。目前结果不知道,大概率凉。

说实话,面完出来我人是懵的。

去之前我其实心里有底,觉得自己两年半经验,项目也能讲,面个普通开发岗应该问题不大。结果坐下来之后,节奏完全不对。

他问的第一个项目问题就直接往死里挖——为什么迁MongoDB?三读一写怎么定的?批次为什么是2万不是1万?队列积压了多少?还好我早有准备,用精准的压测数据应对了。

然后开始问基础。基本数据类型我竟然漏了byte,包装类场景我也没答好,double底层精度问题我只说了一半。这些问题我平时觉得自己知道,但他一问“从底层讲”,我就卡住了。还有自定义异常,我竟然完全忘了怎么说——这东西我写过一百遍,但被盯着问的时候大脑一片空白。

最让我难受的是,他问的很多方向是我之前模拟面试从来没遇到过的。比如为什么只用时间戳不能做防重复,而是要随机字符串,我模拟的时候那个AI从来不问这种问题。还有验签,他追问了一句“是不是在拦截器做的”,我当时就意识到他是在考我架构分层,而我只能在接口层手动调,答得特别虚。

面到一半的时候我已经有点慌了,因为每一次追问都像在揭开我的盲区。但我咬着牙没崩,能答的就答,答不上的就说没涉及到。最后竟然撑满了30分钟没有提前结束。

我现在回过味来了——我不是不行,是这面试本身就不是普通难度。他问的那些东西,已经不是“知不知道”的问题了,而是要你“经历过、踩过坑、有自己设计思路”才能答好。

但说实话,这次面的值。它把我所有的盲区一次性全炸出来了:包装类、自定义异常、多线程完整实现、容器切换、double底层、防重放攻击……这些东西要是不面这次,我可能再过半年也不会主动去补。

痛是真痛,值也是真值。

接下来我知道该干什么了——对着这些错题,一个一个啃下来。下次再遇到这种难度的,我得让他知道,我已经不是今天这个我了。

八股统计(含错题修改):

1、基本数据类型有哪些?

回答漏掉了一个byte。

Byte short char int float double long boolean

2、那为什么还需要包装类型?

(没太答上)回答了泛型场景必须使用对象类型,并举例成员变量用基本类型而方法参数多用包装类。

标准:

简单来说:包装类型让基本数据类型能融入Java的面向对象体系,并提供了基本类型不具备的实用功能。

核心原因主要有四点:

容器需要对象:像 ArrayList、HashMap 这样的集合类,只能存储对象,无法存储 int、double 等基本类型。包装类型解决了这个问题。

处理“空值”:基本类型(如 int)总有默认值,无法表达“缺失”状态。而包装类型(如 Integer)可以是 null,这在数据库字段可选或查找不到结果时非常有用。

提供实用方法:包装类型内置了类型转换、进制转换、比较等常用方法,操作更方便。例如:

Integer.parseInt("123"):字符串转整数。

Integer.toHexString(255):转为十六进制字符串“ff”。

支持泛型:泛型中的类型参数必须是类,不能是基本类型。比如定义 List<Integer> 是合法的,但 List<int> 会编译报错。

3、包装类和基本数据类型使用场景大概是哪些?

(没太答上),就回答了泛型和接口参数是包装类,常量、静态变量是基本类型

标准:

包装类场景:1、集合类。集合只能存放对象。

2、泛型参数泛型的类型参数不支持基本类型。

3、表示“空值”,当需要明确区分变量有值和没值时,只能用包装类。

4、需要调用对象方法,例如Integer.parseInt()、String.valueOf()。

基本类型场景:1、局部变量和方法内的简单计算,无对象头开销。

2、大型循环和数值数组,基本类型存储在栈上或专门的连续内存中,能极大提升性能。

3、类的成员变量,有默认值需求,用基本类型更方便。

4、高频方法调用,涉及大量数值计算,用基本类型避免频繁装箱拆箱。

4、double处理金额的隐患问题,从底层角度回答

(没太答对)它会有精度丢失,也就是double在处理数据如果超出显示范围,会将转换的二进制数从中截断,导致精度丢失。

标准:

第一,精度问题。

double 采用二进制浮点数存储,像 0.1 这样的小数在二进制中无限循环,而 double的位数有上限,只能截断存近似值。计算时的误差会累积,导致 0.1 + 0.2 不等于 0.3,在金额计算中无法接受。

第二,舍入问题。

double无法精确控制舍入行为,例如1.015 这样的数字实际存的近似值,四舍五入直接变1.02。

第三,有业务风险。

金额误差看似微小,但在高频交易、账务核算中会累积成实际损失,且跨系统对账时会因为精度不一致导致失败。

正确的做法是:

日常开发:使用 BigDecimal,且必须用String参数的构造器

高性能或数据库存储:以分为单位用 long 存储,避免小数运算

数据库字段:使用 DECIMAL 类型,不要用 float 或 double

5、Java中String为什么不可变

(回答漏了一个)。类通过final修饰禁止继承,避免子类新增方法破坏不可变性。

底层的char数组用final修饰,避免它的引用被更改。

补充:string类本身不提供任何修改字符串方法,所有方法例如substring,replace都会创建并返回新字符串。

6、多线程实现方式。

(回答漏不少并被打断)继承thread类重写run方法、实现runnable接口实现run方法。后面卡壳被打断。

标准:

继承 Thread 类并重写 run 方法;实现 Runnable 接口并重写 run 方法;实现 Callable 接口并重写 call 方法,配合 FutureTask 获取返回值;使用线程池ExecutorService

7、讲一下对死锁的理解。

系统阐述了死锁四大条件:互斥、不剥夺、请求保持和循环等待,并强调避免死锁需从后两个条件入手。

标准:

死锁四个必要条件:

互斥条件:资源一次只能被一个线程占用;

请求和保持:线程持有资源的同时还在等待其他资源;

不可剥夺:资源不能被强行抢占;

循环等待:多个线程形成等待环路。

要预防死锁,可以破坏其中一个条件,比如破坏请求和保持就是一次申请所有资源、破坏不剥夺就是一段时间无法获取锁就释放手里其他锁、破坏循环等待就是规定所有线程按相同顺序申请资源。但是互斥条件不可破坏。

8、多线程中start和run方法的区别

run方法存放线程具体逻辑,start方法触发线程就绪状态,也就是通知该线程就绪进入Runable状态、准备进入线程的调度。

标准:start() 用于启动一个新线程,调用后线程进入就绪态,JVM会选择时机调用该线程的 run() 方法;而 run() 只是一个普通方法,在当前调用线程中同步执行,不会创建新线程。如果直接调 run(),就失去了异步执行的意义。另外,start() 只能调用一次,重复调用会抛异常。

9、ArrayList和LinkedList的底层在增加数据有什么不同?

ArrayList底层是动态数组,插入操作如果没有超过数组扩容阈值就直接插,否则需要扩容,尾部增删高效但中间插入移动后续所有数据,效率低,LinkedList底层是链表,头尾操作快但中间增删需遍历,增删慢。

10、jdk8的新特性你了解哪些?

第一个是接口中default方法的引入,之前接口如果加新方法,那么如果版本更新,老系统所有实现该接口的地方都要实现,而引入default提供一种默认实现,让其他地方可以按需实现接口。

第二个是新增的static方法特性,之前写例如排序的工具方法,需要额外创建工具类,java8就可以直接在接口写通用工具方法,并通过接口名.方法名直接调用。

第三个是JDK7和JDK8的HashMap优化:JDK7底层是数组加链表,哈希冲突采用头插法,扩容顺序会反转,并发扩容死循环Jdk8底层是数组链表红黑树,链表长度>=8和数组长度<=64会触发扩容,链表转红黑树,链表查找效率从n变成logn,链表长度<=6红黑树转回链表。哈希冲突使用尾插法,避免死循环。

标准:

1、Lambda 表达式:简化匿名内部类,支持函数式编程,语法变成:(参数) -> { 方法体 }。

2、Stream API:对集合进行链式的流式操作,支持并行处理。写法类似于

list.stream().filter().map().collect(Collectors.toList());

3、函数式接口:只有一个抽象方法的接口,配合Lambda使用,如 Predicate、Consumer

4、方法引用:Lambda 的简化写法,双冒号:: 让代码更简洁

5、Optional用于优雅处理 null,避免空指针

6、新的日期时间 APIjava.time:线程安全

11、自定义异常类是怎么做的?

(没答上来)想了半天忘记了。

标准:

自定义异常类需要继承 Exception(受检异常)或 RuntimeException(非受检异常),然后提供多个构造方法,通常包括无参构造、带 message 参数的构造、带 message 和 cause 参数的构造。如果需要传递更多信息,可以添加自定义字段如错误码。命名上以 Exception 结尾,语义清晰

12、SpringBoot默认集成的Web容器?

Tomcat

13、怎么修改集成的容器?

把 Spring Boot 默认的 Tomcat 换成其他容器例如jetty,只需要在 pom.xml 中排除tomcat依赖,然后引入 spring-boot-starter-jetty即可。Spring Boot 的自动配置会根据 classpath 中存在的容器类型自动切换

(没答上来)这个我确实还没了解到

14、Redis数据库一致性的保障措施?

详细解释了三种方案:先更新数据库再删除缓存会存在短暂脏数据问题,也就是事务提交前读取的数据会被写入缓存,只能等它自己超时删除

延迟双删,就是更新数据库前先删除一次,删除完后通过异步二次清理解决,确保事务提交之后清理脏数据

第三种利用binlog日志监听实现事务提交后精准删除。(canal中间件漏了)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 18:23:29

C++虚函数机制与性能优化深度解析

1. C虚函数机制深度解析虚函数是C实现运行时多态的核心机制&#xff0c;它允许子类重写父类的方法&#xff0c;并在运行时根据对象实际类型调用正确的函数实现。这种动态绑定特性是面向对象编程中"一个接口&#xff0c;多种实现"思想的关键支撑。1.1 虚函数表(vtbl)的…

作者头像 李华
网站建设 2026/5/8 18:22:41

Godot Pixel Renderer:3D模型实时渲染像素动画的完整指南

1. 项目概述&#xff1a;当3D建模遇上像素艺术如果你和我一样&#xff0c;是个对复古像素艺术情有独钟的游戏开发者&#xff0c;同时又不想被逐帧手绘动画的繁重工作量劝退&#xff0c;那么今天要聊的这个工具&#xff0c;可能会成为你工作流里的“神器”。我最近在捣鼓一个带有…

作者头像 李华
网站建设 2026/5/8 18:22:40

构建计算机光标技术支持网站:从原理到工程实践

1. 项目概述&#xff1a;一个为“计算机光标技术支持”而生的网站最近在GitHub上看到一个挺有意思的项目&#xff0c;叫seanpm2001/Computer-cursor-tech-support_Website。光看这个标题&#xff0c;可能很多人会有点懵&#xff1a;计算机光标技术支持&#xff1f;这听起来像是…

作者头像 李华
网站建设 2026/5/8 18:18:25

通用世界模型的三原则架构设计与实践

1. 项目概述"通用世界模型中的一致性三原则与架构设计"这个标题涉及人工智能领域的前沿研究方向。作为一名长期从事AI系统架构设计的从业者&#xff0c;我想分享在实际项目中构建通用世界模型时积累的经验。世界模型是指能够理解和预测环境变化的计算框架&#xff0c…

作者头像 李华
网站建设 2026/5/8 18:09:04

AI编程时代编辑器配置工程化:模块化、场景化与团队协同实践

1. 项目概述&#xff1a;AI时代下的编辑器配置管理新范式最近在折腾各种AI辅助编程工具&#xff0c;从GitHub Copilot到Cursor&#xff0c;再到一些本地部署的代码生成模型&#xff0c;发现一个挺烦人的问题&#xff1a;每个工具、每个项目&#xff0c;甚至每个团队成员&#x…

作者头像 李华
网站建设 2026/5/8 18:08:43

开源Wishbone UART IP核wbuart32:轻量级FPGA串口通信解决方案

1. 项目概述&#xff1a;一个轻量级、可综合的串口IP核如果你在FPGA开发中&#xff0c;曾经为找一个简单、可靠、不占资源的串口&#xff08;UART&#xff09;IP核而头疼&#xff0c;那么wbuart32这个项目很可能就是你要找的答案。它不是一个复杂的软件库&#xff0c;而是一个用…

作者头像 李华