当前位置: 首页 > news >正文

面试八股真题统计与面经

引言:记录自己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中间件漏了)

http://www.jsqmd.com/news/778181/

相关文章:

  • Florr.io新版下水道与蚂蚁地狱实战解析:史诗卡获取与高危区域生存手册
  • 开源AI智能体平台Clawless:从核心架构到自动化工作流实战
  • 15.【Verilog】Verilog 时钟简介
  • 98%准确率!这个双分支AI模型,精准识别木薯叶病害(附代码)
  • Lovart 上线 GPT Image 2 模型,会员首月不限量使用
  • 别再乱改Apollo了!Spring Boot配置加载顺序深度解析:从local到namespace的优先级实战
  • 靠谱服务商甄选!2026动画制作服务机构推荐排行 全案定制/极速交付/长效售后 - 极欧测评
  • SnoutGuard实战:Go语言轻量级日志分析与主动防御工具部署指南
  • 开源云成本追踪工具mango-costs:架构解析与实战部署指南
  • 2026年5月家用电梯十大品牌技术解析与选购指南 - 速递信息
  • 基于OpenClaw的WordPress自动化内容发布机器人实战指南
  • 【Java】解决跨域问题的 8 种方案
  • 2026年四川发光字招牌制作灯箱制作TOP采购榜单:综合实力与用户口碑双维度测评 - 深度智识库
  • 开源电商系统架构解析:从技术选型到核心模块实战
  • kafka 集群部署
  • 语言模型在沟通障碍场景下的性能优化实践
  • clawplay:基于Python的剧本化Web自动化与数据抓取框架实战
  • 中层管理者眼中的“A小姐”与“C先生”:绩效考核之外考验管理者的逆向领导力
  • SPG:扩散语言模型的稳定强化学习策略梯度方法
  • 祛痘泥膜哪个牌子好12天深度排浊净肌,告别脸蛋脏闷感 - 全网最美
  • 什么去黑头泥膜好用 7 天搞定顽固性黑头,亲测巨有效 - 全网最美
  • 2026年陕西及西安职高升学首选榜单及本科逆袭路径 - 深度智识库
  • AI辅助CTF解题:提示词工程与安全研究新范式
  • 免费开源矢量图形编辑器 Inkscape 1.4.4 发布:修复众多问题,提升性能还添新功能
  • 隐私计算框架Tensory:加密张量运算与机器学习安全实践
  • LLM增强扩散模型:提升文本到图像生成的语义理解
  • codebase-intel:为AI编程助手注入项目记忆与工程纪律的上下文智能层
  • 2026年上海瑜伽教培机构对比|亚太瑜伽TOP1,评分、价格、推荐率全解析 - 速递信息
  • 使用Taotoken CLI工具一键配置多开发环境下的模型调用参数
  • 2026 AI大会日程倒计时启动:3月锁定名额,6月关闭注册,8月关闭论文投稿(附各大会DDL对照表)