一次性注入器怎么用技术面试核心要点笔记:Java开发/运维/测试方向

新闻资讯2026-04-21 01:02:38

前言: 本文基于一份面试要点清单进行整理和扩展,涵盖了Java开发、运维、测试三个方向的核心面试题。内容力求简洁、准确,并提供参考答案和进一步学习的思路。请注意,这并非一份“万能答案”,而是帮助你梳理知识体系的笔记。真正的面试需要你理解原理,并能结合自己的项目经验进行阐述。



1. 什么是多态?==、equals的区别?

多态:同一个行为具有多个不同表现形式。比如Animal a = new Dog(),调用a.eat()实际执行的是Dog的eat方法。多态三要素:继承、重写、父类引用指向子类对象。

== 和 equals 区别

  • ==:基本类型比较值,引用类型比较内存地址。
  • equals:默认(Object类)也是比较地址,但StringInteger等重写了equals,变成比较内容。
String s1 = new String("hello");
String s2 = new String("hello");
s1 == s2      // false,不同对象
s1.equals(s2) // true,内容相同

2. 方法重写和重载的区别?

比较项 重载 重写 发生位置 同一个类 子类与父类 方法名 相同 相同 参数列表 必须不同 必须相同 返回值 无关 必须兼容(子类返回值 <= 父类) 访问权限 无关 子类不能更严格 异常 无关 子类不能抛出更宽泛的异常

3. String、StringBuffer、StringBuilder区别?

  • String:不可变,每次修改都生成新对象,适合少量字符串操作。
  • StringBuffer:可变,线程安全(方法加synchronized),适合多线程环境。
  • StringBuilder:可变,线程不安全,性能最高,适合单线程。

扩展:String拼接用+还是StringBuilder?循环内用StringBuilder,单次拼接编译器会优化成StringBuilder。

4. 两个对象hashCode相同,调用equals结果是什么?

不一定为true。hashCode相同只是说明两个对象在散列结构中可能落到同一个桶里,但equals是否相等要看具体实现。规范要求:如果equals为true,hashCode必须相同;反过来不成立。

5. ArrayList和LinkedList区别?

特性 ArrayList LinkedList 底层 动态数组 双向链表 随机访问 O(1),快 O(n),慢 插入/删除(尾部) O(1) O(1) 插入/删除(中间) O(n),涉及移动元素 O(n),但要先找到位置 内存 连续空间,可能有浪费 不连续,每个节点有额外指针开销

场景:查询多用ArrayList,频繁插入删除用LinkedList。

6. HashMap底层原理、红黑树退化、扩容原理

底层:数组 + 链表/红黑树。JDK1.8后,当链表长度 > 8且数组长度 >= 64时,链表转红黑树。

红黑树退化链表条件

  • 扩容时,红黑树节点数 <= 6,会退化为链表。
  • 删除节点时,树节点太少也会退化。

扩容原理

  • 默认初始容量16,负载因子0.75,阈值12。
  • 当size > 阈值,扩容为原来2倍,重新计算每个元素的位置(新位置 = 原位置 或 原位置+旧容量)。

扩展:ConcurrentHashMap分段锁原理(JDK1.7)和CAS+synchronized(JDK1.8)。

7. 线程方面:用过哪些线程池?Java线程创建方式?

线程池种类(Executors提供):

  • newFixedThreadPool:固定线程数,无界队列。
  • newCachedThreadPool:动态扩容,空闲60s回收,适合短任务。
  • newSingleThreadExecutor:单线程,保证顺序执行。
  • newScheduledThreadPool:支持定时/周期任务。

注意:阿里规范禁止用Executors,推荐ThreadPoolExecutor手动指定参数,防止OOM。

线程创建方式

  1. 继承Thread类
  2. 实现Runnable接口(无返回值)
  3. 实现Callable接口 + FutureTask(有返回值)
  4. 通过线程池创建

8. 项目中哪些场景可能用到线程?

  • 异步操作:发送邮件、短信、日志记录
  • 批量处理:大数据量导入导出,分页多线程处理
  • 定时任务:数据备份、报表生成
  • 秒杀场景:多线程处理并发请求

9. 拦截器和过滤器区别?

比较 过滤器(Filter) 拦截器(Interceptor) 规范 Servlet规范 Spring框架提供 触发时机 请求进入Servlet容器后 请求进入Controller前后 范围 对所有请求生效 只对Controller请求生效 依赖 依赖Servlet API 依赖Spring,可注入Bean 常用场景 编码转换、登录过滤 权限校验、日志记录

10. Spring核心思想:IOC、AOP

IOC(控制反转):把对象的创建和依赖关系的管理交给Spring容器。你不再new对象,而是从容器中“拿”。

AOP(面向切面编程):把横切逻辑(日志、事务、权限)从业务代码中抽离出来,通过动态代理在运行时织入。

11. AOP动态代理模式

  • JDK动态代理:基于接口,目标类必须实现接口。
  • CGLIB动态代理:基于继承,生成目标类的子类,无法代理final类。

Spring默认:有接口用JDK,没有接口用CGLIB。

12. Spring框架常用设计模式

  • 工厂模式:BeanFactory
  • 单例模式:Bean默认单例
  • 代理模式:AOP
  • 模板模式:JdbcTemplate
  • 观察者模式:ApplicationListener
  • 适配器模式:HandlerAdapter

13. Bean有几种注入方式?

  • 构造器注入(推荐,保证不可变,依赖必须)
  • Setter注入(可选依赖)
  • 字段注入(@Autowired,最简单但不推荐,难以测试)

14. Bean的作用范围?

  • singleton(默认):单例
  • prototype:每次获取都创建新对象
  • request:每次HTTP请求
  • session:每个HTTP会话
  • application:每个ServletContext

15. SpringMVC Controller在多线程下要考虑什么问题?

Controller默认是单例,成员变量会被所有线程共享,存在线程安全问题。解决方案:

  • 不在Controller中定义可变的成员变量
  • 使用@Scope("prototype")改为原型模式
  • 使用ThreadLocal存储线程私有数据

16. MyBatis和Hibernate区别?

比较 Hibernate MyBatis 定位 全自动ORM,完全屏蔽SQL 半自动,SQL可控 学习成本 高 低 SQL优化 困难,HQL生成SQL可能不优 容易,SQL手写 缓存 一级+二级缓存完善 一级缓存 + 可配二级 适用场景 复杂ORM、简单CRUD 灵活SQL、性能要求高、遗留数据库

17. #{} 和 ${} 的区别?

  • #{}:预编译,用?占位,防止SQL注入。
  • ${}:直接拼接SQL字符串,有注入风险,通常用于表名、列名动态传入。

1. 常用的MySQL语句

-- 查询
SELECT * FROM user WHERE age > 18 ORDER BY create_time DESC LIMIT 10;
-- 插入
INSERT INTO user (name, age) VALUES ('张三', 20);
-- 更新
UPDATE user SET age = 21 WHERE name = '张三';
-- 删除
DELETE FROM user WHERE id = 1;
-- 清空表(重置自增)
TRUNCATE TABLE user;

2. 什么是结构化数据库?

数据按行和列组织成表格,表之间有明确的关系(通过外键等),使用SQL操作。代表:MySQL、Oracle、PostgreSQL。

3. 怎么清空表?

  • DELETE FROM table;:逐行删除,可回滚,不重置自增。
  • TRUNCATE TABLE table;:DDL操作,删除后重建,速度快,不可回滚,重置自增。

4. 数据怎么去重?

  • 查询去重:SELECT DISTINCT column FROM table;
  • 按字段分组:SELECT column FROM table GROUP BY column;
  • 删除重复数据:用ROW_NUMBER()窗口函数或自连接。

5. 什么是左连接?

LEFT JOIN返回左表所有行,右表没有匹配的补NULL。

SELECT a.name, b.order_id
FROM user a
LEFT JOIN orders b ON a.id = b.user_id;

6. Union和Union All的区别?

  • UNION:合并结果集并去重,有排序开销。
  • UNION ALL:合并不去重,效率更高,无需去重时优先使用。

7. 事务四大特性和隔离级别

ACID:原子性、一致性、隔离性、持久性。

隔离级别(从低到高)

  • 读未提交:脏读、不可重复读、幻读
  • 读已提交(Oracle默认):不可重复读、幻读
  • 可重复读(MySQL默认):幻读
  • 串行化:全部解决,但性能最差

MySQL默认:REPEATABLE READ

8. MySQL索引

类型:普通索引、唯一索引、主键索引、联合索引、全文索引。

什么时候用到索引

  • WHERE条件字段
  • JOIN连接字段
  • ORDER BY字段
  • GROUP BY字段

什么时候不走索引

  • 函数操作 WHERE age+1=20
  • 隐式类型转换 WHERE phone=123456
  • LIKE以%开头
  • 联合索引未遵循最左前缀

9. SQL优化有哪些?

  • 避免SELECT *
  • 小表驱动大表(IN vs EXISTS)
  • 分页优化:先查ID再关联
  • 合理使用索引
  • 避免索引失效的写法
  • 拆分大事务
  • 用EXPLAIN分析执行计划

10. 数据库锁

按粒度:表锁、行锁、页锁
按模式:共享锁(读锁)、排他锁(写锁)
按算法(InnoDB):记录锁、间隙锁、临键锁

乐观锁:不加锁,用版本号或时间戳实现。更新时检查version:

UPDATE goods SET stock = stock - 1, version = version + 1 
WHERE id = 1 AND version = #{version};

死锁处理

  • 预防:统一加锁顺序
  • 检测:SHOW ENGINE INNODB STATUS
  • 解决:MySQL会自动回滚代价较小的事务

11. 分布式事务处理方案

  • 2PC/3PC:XA协议,强一致但性能差
  • TCC:Try-Confirm-Cancel,侵入业务
  • 最终一致性:本地消息表 + 消息队列 + 定时校对
  • Seata:阿里开源框架,AT模式自动回滚

不修改数据库怎么办?可以用本地日志表 + 消息队列 + 重试 + 幂等设计。

12. 消息最终一致性事务实现原理

  1. 业务方发送半消息(MQ不可见)
  2. 执行本地事务
  3. 根据结果提交或回滚半消息
  4. MQ定期询问未决消息,业务方反查本地状态
  5. 消费方保证幂等(去重表或唯一键)

13. 秒杀业务的线程安全处理

  • 数据库乐观锁(版本号)
  • Redis预扣库存(Lua脚本保证原子)
  • 消息队列削峰
  • 限流(令牌桶/漏桶)
  • 页面静态化 + CDN

14. Redis

常用场景:缓存、分布式锁、计数器、排行榜(ZSet)、消息队列(Stream)

数据类型:String(最常用)、Hash、List、Set、ZSet、Bitmap、HyperLogLog

集群方案:主从 + 哨兵(高可用)、Redis Cluster(分片)

15. SSO单点登录原理

  1. 用户访问系统A,未登录,重定向到认证中心
  2. 认证中心验证身份,生成全局Session + Ticket
  3. 重定向回系统A,携带Ticket
  4. 系统A向认证中心校验Ticket,成功后建立局部Session

退出处理:清除全局Session + 通知所有子系统清除局部Session


1. Linux常用命令

用途 命令示例 查看磁盘分区 df -h 查看文件 cat, less, more, head, tail 查看文件大小 ls -lh, du -sh 查看CPU/内存 top, htop, free -h 查看进程 ps aux, ps -ef 按名称查找文件 find / -name "*.log" 查找文件内容 grep -r "error" /var/log/ 统计次数 grep -c "error" app.log 查看端口 netstat -tunlp, ss -tunlp, lsof -i:8080 关闭端口占用 kill -9 PID 创建用户 useradd -m username,默认目录/home/username 限制用户登录 usermod -s /sbin/nologin username

2. 文本处理三剑客

awk:列处理

awk '{print $1, $3}' file.txt
awk -F ',' '{sum+=$2} END {print sum}' data.csv

sed:流编辑

sed 's/old/new/g' file.txt
sed -i '/pattern/d' file.txt

vim:模式切换(命令/插入/底行),/搜索,dd删行,yy复制,p粘贴

3. 查看文件内容,大文件怎么处理?

  • 小文件:cat, less, more
  • 大文件:
    • head -n 10 file:看前10行
    • tail -n 100 file:看最后100行
    • tail -f file:实时追踪
    • sed -n '1000,2000p' file:查看指定行范围

4. 如何移动50万条数据?

  • 分批迁移:每批1万条,循环处理
  • INSERT INTO ... SELECT ... LIMIT offset, batch_size
  • 或用mysqldump + mysql命令
  • 考虑停机窗口或主从切换

5. MySQL存在则更新,不存在则插入

INSERT INTO user (id, name, age) VALUES (1, '张三', 20)
ON DUPLICATE KEY UPDATE age = VALUES(age);

或者用REPLACE INTO(先删后插,注意外键)

6. 网络基础

  • 子网掩码:出现在IP配置中,区分网络位和主机位,如255.255.255.0
  • 网关:跨网段通信的出口,常见192.168.1.1
  • DNS:域名解析服务器,常见8.8.8.8(谷歌)或114.114.114.114
  • VLAN:虚拟局域网,隔离广播域,常用于部门隔离、安全分区

7. 交换机端口模式

  • Access:接入模式,只能属于一个VLAN,连接终端设备
  • Trunk:中继模式,允许多个VLAN通过,连接交换机或路由器
  • Hybrid:混合模式,Access+Trunk特性

1. 什么是软件测试?为什么重要?

软件测试是验证软件是否符合需求、发现缺陷的过程。重要因为:保证质量、降低风险、节约成本、提升用户体验。

2. 黑盒测试 vs 白盒测试

比较 黑盒 白盒 关注点 功能、输入输出 内部逻辑、代码结构 测试者 测试人员 开发或白盒测试 方法 等价类、边界值、场景法 语句覆盖、分支覆盖、路径覆盖

3. 常见测试类型

功能测试、性能测试(负载/压力/稳定性)、安全测试、兼容性测试、回归测试、冒烟测试、验收测试。

4. 如何设计测试用例(以登录为例)

维度

  • 功能:正确账号密码、错误密码、空值、账号不存在、记住密码、切换账号
  • 界面:布局、提示语、焦点顺序
  • 安全:SQL注入、XSS、暴力破解锁定、验证码
  • 性能:快速连续登录、并发登录
  • 兼容:不同浏览器、移动端

用例要素:编号、模块、前置条件、步骤、输入数据、预期结果、优先级。

5. 边界值分析举例

输入年龄范围1-120,边界值测试:0、1、2、119、120、121。边界值经常出bug。

6. 缺陷生命周期

新建 → 已确认 → 已分配 → 修复中 → 已修复 → 待验证 → 已关闭 / 重新打开 / 拒绝

7. 发现缺陷怎么记录?

  • 标题:简短清晰(如“登录页输入正确密码提示密码错误”)
  • 环境:浏览器、操作系统、版本
  • 前置条件:必填
  • 重现步骤:1. 2. 3. 清晰可复现
  • 实际结果 vs 预期结果
  • 附件:截图、日志、视频

8. 自动化测试

工具:Selenium(Web)、Appium(移动端)、JMeter(接口/性能)、Postman/Newman(接口)

优势:回归快、可重复、7x24执行、提高覆盖率
局限:不能完全替代手工、维护成本高、不适合UI频繁变化

自动化测试框架组成:测试数据管理 + 用例管理 + 断言 + 报告 + 日志 + CI集成

9. 接口测试怎么做?

  1. 获取接口文档(Swagger/YApi)
  2. 设计用例:正常/异常/边界/权限/参数组合
  3. 使用Postman/JMeter编写脚本
  4. 断言:状态码、响应结构、关键字段
  5. 数据驱动:测试数据与脚本分离
  6. 持续集成:Jenkins定时执行

10. 安全测试怎么测?

  • SQL注入:输入' or 1=1 --
  • XSS:输入<script>alert(1)</script>
  • 越权:低权限用户访问高权限接口
  • 敏感信息泄露:响应中是否返回密码、token
  • 工具:Burp Suite、OWASP ZAP、Sqlmap

11. 测试流程(一个典型项目的测试流程)

需求评审 → 制定测试计划 → 设计测试用例 → 用例评审 → 环境准备 → 执行测试(冒烟→功能→回归)→ 缺陷跟踪 → 测试报告 → 上线验证

12. 敏捷测试是什么?

在敏捷开发中,测试不再是最后阶段,而是贯穿每个迭代。测试人员参与需求讨论、快速反馈、自动化回归、持续集成。强调:小步快跑、高度协作、拥抱变化。

13. QA和测试的区别?

  • 测试:发现缺陷,验证功能。
  • QA(质量保证):关注整个流程,预防缺陷发生,制定标准、过程改进。

测试是QA的一部分,QA是更高纬度的质量体系。


1. 描述一次解决复杂技术问题的经历

示例(可套用)

在实习期间,我负责的一个报表导出功能,数据量达到50万行时经常超时或内存溢出。

排查过程

  1. 分析日志发现是内存不足,一次性查询所有数据到内存导致。
  2. 定位到代码用的是List<User> list = mapper.selectAll()

解决方案

  1. 改用MyBatis流式查询 + 游标,每1000条写一次Excel
  2. 前端分批请求,后端使用SXSSFWorkbook(只保留100行在内存)
  3. 添加导出任务队列 + 进度提示

最终结果:导出时间从2分钟降到30秒,无OOM,用户可异步下载。

2. 你在项目中承担的角色和职责

根据实际情况说。示例:

在校园二手交易平台项目中,我负责后端Java开发,具体包括:

  • 商品模块的CRUD接口设计
  • 使用Redis实现商品浏览量统计和热门商品排行榜
  • 对接微信支付沙箱环境
  • 编写单元测试和接口文档

3. 如何处理并发?每天数百万条数据

  • 数据库层面:读写分离、分库分表(Sharding-JDBC)
  • 缓存层面:Redis热点数据,降低DB压力
  • 消息队列:Kafka/RocketMQ削峰填谷
  • 应用层面:限流(Sentinel)、熔断(Hystrix)
  • 数据层面:批量写入、异步处理、ElasticSearch做聚合查询

4. 链路跟踪如何实现?

使用分布式链路追踪系统,如:

  • SkyWalking / Zipkin / Jaeger
  • 原理:请求入口生成TraceID,每个Span记录调用信息,通过Agent拦截HTTP/RPC/DB调用,上报到服务端聚合,最终在UI展示调用链。

以上是整理的大部分问题,肯定还有很多遗漏。比如:

  • JVM内存模型、垃圾回收算法
  • 设计模式(单例的线程安全问题、双重校验锁为什么用volatile)
  • Docker、K8s基础命令
  • Git冲突解决、rebase和merge区别

最后送你几个小建议

  1. 别背答案,理解原理,用自己的话讲出来。
  2. 准备两个项目,一个你最熟悉的,一个你独立解决过复杂问题的。
  3. 反问环节:可以问团队技术栈、新人培养机制、项目当前难点。
  4. 保持真诚:不会就说不会,但可以说“我虽然没用过,但我理解它的思路是……”

祝你面试顺利,拿到心仪的offer!💪


java开发方向

什么是多态? = 、equals的区别;
方法重写、重载区别
String、StringBuffer、StringBuilder区别?
两个对象 hashcode相同 ,调用equals 结果是什么
ArrayList 跟LinkList 区别 ?
HashMap 底层原理、红黑树什么时候退化为链表、扩容原理
线程方面你有了解吗? 说一下使用过的线程池?
java线程创建方式;
项目中哪些业务场景可能会用到线程
拦截器跟过滤器区别?
Spring 核心思想?解释IOC 、AOP
AOP动态代理模式?
Spring框架常用设计模式?
Bean有几种注入方式?
Bean的作用范围?
SprinMVC Controller 在多线程模式下考虑什么问题?
项目逻辑介绍、用了什么技术;
spring、springboot、mybatis框架介绍;
redis集群、分布式dubbo+zookeeper;
jdbc的连接;
mybatis和hebernate的区别 # ${}占位符;

数据库相关

列出常用的mysql语句
什么是结构化数据库?
怎么清空表?
数据怎么去重
什么是左连接?
Union和union all的区别
1.数据库约束是否了解,有哪些
2.数据库锁了解吗,怎么使用
3.分布式事务如何处理,如果不修改数据库又怎么处理
4.消息最终一致性事务实现原理
5.在线视频流如何处理
6.有几种锁,区别是什么
7.知道乐观锁吗,如何使用
8.如何处理死锁
9.怎么使用锁解决分布式事务
10.你们怎么处理分页,庞大数据处理分页有什么不同
11.我们每天访问产生数百万条数据,如何处理并发
12.说说秒杀业务线程安全处理
13.你常用哪个消息中间件,什么情况使用
14.redis用过吗,什么情况使用
15.redis数据类型有哪些,哪种最常用,为什么
16.链路跟踪如何实现
17.说说SSO原理,如何处理SSO退出
18、简历中的项目出现过什么问题,都是怎么解决的
之前的工作或实习经历中,具体负责了哪些项目?在这些项目中承担了什么角色和职责
描述一次解决复杂技术问题的经历,包括问题出现的原因、解决步骤及最终结果

运维方向

linux

说一些知道的Linux系统
列出常用的个linux指令
Linux查看磁盘分区的命令?
怎么查看一个文件的内容,都有哪些命令?
如果文件内容比较多,用什么命令,如何看前10行? 如何看最后100行?
查看文件大小用什么命令?
怎样查看磁盘空间?
怎样查看系统cpu的使用率?
如何查看系统运行了什么应用?参数解释
如何查看进程? 参数解释
这些命令用过吗?讲一下
awk
sed
vim
按文件名查找文件用什么命令?
查找文件内容用什么命令?
如何清理缓存,及查看
如何移动50w条数据
mysql里写一个存在则添加,不存在创建的sql语句
Linux常用命令有哪些,在日志中要查找某个关键字出现的次数的命令
Linux查看某个端口是否被占用,如果被占用怎么关闭
Linux上常用的文件系统类型?
Linux系统在线扩展文件系统的流程是?
Linux创建用户的命令,用户默认目录位置?如何限制用户登陆?
都用过哪些中间件?

网络

子网掩码会出现在哪里?
网关是什么?说一个常见的网关地址。
DNS是什么?说一个常见的DNS地址。
知道交换机里的port的trunk模式、access模式、混合模式吗?
听说过vlan吗?如果使用过,在什么场景用过?

数据库相关–跟开发方向类似

列出常用的mysql语句
什么是结构化数据库?
怎么清空表?
数据怎么去重
什么是左连接?
Union和union all的区别

事务四大特性、四种隔离级别?
默认隔离级别?
Mysql 索引?
解释一下原子性是什么?
1.数据库约束是否了解,有哪些
2.数据库锁了解吗,怎么使用
3.分布式事务如何处理,如果不修改数据库又怎么处理
4.消息最终一致性事务实现原理
6.有几种锁,区别是什么
7.知道乐观锁吗,如何使用
8.如何处理死锁
9.怎么使用锁解决分布式事务
10.你们怎么处理分页,庞大数据处理分页有什么不同
mysql什么时候会用到索引
sql优化有哪些?
之前的工作或实习经历中,具体负责了哪些项目?在这些项目中承担了什么角色和职责?
描述一次解决复杂技术问题的经历,包括问题出现的原因、解决步骤及最终结果

测试方向

列出常用的linux指令
列出常用的mysql语句
python基础(自动化测试可能用到python)
简述postmen工具
请解释黑盒测试和白盒测试的区别。
你能列举几种常见的软件测试类型吗?
如何设计测试用例?
有一个登录页面,如何测试?
你之前接触过的项目,是如何测试的?如学生管理系统,图书馆管理系统
1,你们原来项目的测试流程是怎么样的?
9,linux你是怎么用的?
10,数据库原来工作当中是怎么用的?
11, 接口测试怎么做的?
12,接口自动化测试怎么测?
13,自动化测试怎么测?
15,安全测试怎么测试的?

-------------以下为基础概念---------
基础概念:

什么是软件测试?为什么软件测试重要?
请解释黑盒测试和白盒测试的区别。
你能列举几种常见的软件测试类型吗?(如功能测试、性能测试、安全测试等)

测试用例设计:

给定一个简单的应用场景,如何设计测试用例?(例如,登录功能)
如何确定测试用例的优先级?
什么是边界值分析?请给出一个实际例子说明其应用。

缺陷管理:

缺陷生命周期包括哪些阶段?
当发现一个缺陷时,你应该怎样记录并报告它?
你如何跟进缺陷的修复状态,并确认它们是否被正确修复?

自动化测试:

你了解哪些自动化测试工具?(如Selenium、JUnit、Appium等)
自动化测试的优势和局限性是什么?
请简述一个自动化测试框架的基本组成部分。

问题解决与逻辑思维:

描述一次你遇到的技术难题,以及你是如何解决它的。
给你一个逻辑题或者情景题,测试你的逻辑推理能力。

团队合作与沟通:

在团队中,你通常如何与开发人员沟通协作?
描述一次你主动学习或适应新工具/技术的经历。
你如何看待在压力下工作?如何有效管理时间和任务?

个人项目或实习经验:

请分享一下你在学校项目或之前的实习中最自豪的一个测试相关的成就。
在实际的测试过程中,你遇到过哪些挑战?如何克服的?

行业知识:

你对敏捷测试有什么了解?
软件质量保证(QA)和软件测试之间有何区别?

  1. 做这个项目你觉得有没有什么难点?
  2. 这两个问题是怎么解决的?
  3. 你这个限流组件是通过调用代码还是通过什么注解之类的实现 的?(AOP)
  4. 如果你是直接调用封装好的限流组件的话,每次用都需要进行一些参数的校验,以你对Springboot的了解,有没有巧妙地方法去解决这个问题?
  5. 如果是使用AOP来进行处理,那么是使用什么类型的通知?AOP有几种通知类型(前置、后置、环绕)?
  6. 如果让你实现这个AOP代码,让他生效,具体有哪几步?大概讲一下?有没有自定义过AOP的工具/
  7. 点赞是存储到哪里?
  8. 评论的回复如何存储的?评论的回复的回复呢?如果一直使用评论回复表,那么可能存在多次查询数据库,那么如何高效地解决这个问题?
  9. 九、如果我需要进入帖子一次性要查询出所有层级地评论,那么如何去查询?
  10. kafka用过?kafka如果实现发一条消息如何让多个消费者接收到? rabbitMQ?
  11. RabbitMq延迟消息了解吗?讲一下?
  12. 定时发帖?定时发帖是如何设计地?如果是每开一个定时帖子发布都会生成一个定时任务,你觉得会有什么缺点?如果我现在有一万个帖子定时发布,那么有一万个定时任务,你觉得这样合理吗?假设定时任务的服务器性能有限,如何优化?
  13. 你这个定时任务的时间维度的单位是什么?小时?分钟?有没有什么优化的方法?跑一个定时任务每个小时查一次可以吗?如果是每分钟查一次那是怎么优化的?
  14. 刚刚你说的redis,除了你刚刚说,还有没有用过redis其他的命令和指令?
  15. 什么场景下,你会使用到redis的hash结构?这样先问你,hash和普通的存一条数据有什么区别?那你再说一下有什么场景?
  16. 你这个SpringCloud是用的阿里巴巴还是?
  17. 讲一下SpringCloud这里面有哪些组件?
  18. 十八、项目中有没有设计过分布式事务?seata了解过吗?企业项目应该会涉及过分布式事务的,你没有使用过?
  19. 如果让你实现一个简单的分布式事务,你有什么思路没有?其实分布式事务就是一个服务传递http请求到另一个服务,假如让你去实现如何实现?
  20. 、如果用Mq,很简单地说一下为什么会想到用Mq,他是怎么实现地?
  21. 你们项目中用地SpringCloud是用的阿里巴巴,为什么不用 Dubble,而是用 openfegin?
  22. 你们用OpenFegin是如何传参的?传普通的参数和传请求体有什么不一样?那你们一般是传参数还是传请求体?
  23. 那你们做的这个项目里面,有没有看过网关里面有什么功能?
  24. 接口分为前后端接口和服务之间调用的接口,那么如何保证前端不会调用到后端服务之间的接口?他就是用网关实现的,让你配置如何配置?
  25. 在你们的OpenFegin接口中,调用方调用接口后返回的是什么类型?那你调用的时候,有没有了解过,调用方如何判断调用接口是否成功或者失败?
  26. 你用的这个JWT实现的这个Token,那么JWT有什么缺点?
  27. Token下发之后如何实现让Token能够主动销毁?这个就是JWT的缺点.如何解决这个缺点?有有没有听过双Token?怎么解决这个问题的?
  28. ne04了解的多吗?
  29. 看你写了这个布隆过滤器,了解什么是布隆过滤器吗?
  30. 刚刚听你讲了这个原理,那他为什么会发生误判?
  31. redis的集群有没有自己搭过?三十、docker有搭过环境吗?怎么把jar包打包成镜像?
  32. MySql有没有什么优化的方式?索引对他的大概的原理了解吗?
  33. 索引失效的情况有没有了解过?
  34. 联合索引了解?联合索引什么时候会失效?

1. 谈谈你对 JVM 内存模型 的理解?哪些区域是线程私有的?

程序计数器、虚拟机栈、本地方法栈是线程私有;堆、方法区(元空间)是共享。栈管运行,堆管存储。

2. 垃圾回收算法有哪些?CMS 和 G1 的区别?为什么 G1 更适合大堆?

标记-清除、标记-复制、标记-整理。CMS 注重低停顿但会产生碎片,G1 可预测停顿且分 Region。

3. 类加载机制:双亲委派模型是什么?为什么要这样设计?如何打破?

避免核心类被替换。打破的例子:Tomcat 的 WebappClassLoader、JDBC 的 ThreadContextClassLoader。

4. volatile 关键字的作用?可见性禁止指令重排 如何实现?

内存屏障 + 总线嗅探。不能保证原子性(如 i++ 不安全)。

5. synchronizedReentrantLock 的区别?锁升级过程(无锁 → 偏向锁 → 轻量级锁 → 重量级锁)了解吗?

6. ThreadLocal 原理?内存泄漏问题怎么产生的?如何避免?

弱引用 Key,但 Value 是强引用,不手动 remove 会导致内存泄漏。用完后一定要 remove。

7. 什么是 伪共享(False Sharing)?如何用 @Contended 或填充解决?

8. CompletableFuture 用过吗?如何编排异步任务?


9. Spring Boot 自动配置原理@EnableAutoConfigurationspring.factories 的关系?

10. Spring 循环依赖如何解决?为什么用 三级缓存 而不是二级?

解决构造器注入的循环依赖需要 @Lazy。三级缓存解决 AOP 代理对象提前暴露的问题。

11. Spring Cloud 常用组件?服务发现(Eureka/Nacos)、网关(Gateway)、配置中心(Config/Nacos)、熔断(Sentinel/Hystrix)各有什么优缺点?

12. Nacos 和 Eureka 的区别?Nacos 为什么既支持 CP 又支持 AP?

13. 服务熔断、降级、限流的区别?Sentinel 的滑动窗口原理?

14. 分布式 ID 生成方案?雪花算法(Snowflake)的优缺点?时钟回拨怎么处理?

15. 分布式锁 的实现方式(Redis、ZooKeeper、数据库)?Redis 分布式锁的 RedLock 算法可靠吗?


16. MySQL 的 MVCC(多版本并发控制) 原理?ReadView 和 undo log 如何配合实现可重复读?

17. 间隙锁(Gap Lock) 在什么情况下会触发?如何避免死锁?

18. 一条 SQL 执行很慢,你怎么排查?Explain 的 type 字段(ALL、index、range、ref、eq_ref、const)含义?

19. B+ 树索引 为什么比 B 树更适合数据库?为什么不用红黑树或跳表?

20. 分库分表:垂直分 vs 水平分?Sharding-JDBC 的常用分片策略?跨分片查询怎么处理(如 order by limit)?

21. 消息队列如何保证消息不丢失(生产端、Broker、消费端)?如何保证消息不重复消费(幂等)?

22. Kafka 为什么快?零拷贝(sendfile)、顺序写、页缓存、批量压缩。

23. Redis 持久化:RDB 和 AOF 的区别?混合持久化?Redis 6.0 的多线程(IO 线程)如何工作?

24. 缓存穿透、击穿、雪崩 分别是什么?怎么解决?

穿透:布隆过滤器或缓存空对象。击穿:互斥锁或逻辑过期。雪崩:随机过期时间 + 高可用 + 熔断限流。

25. Redis 的 ZSet 底层结构(跳表 + 哈希表)?为什么用跳表而不用红黑树?


26. 进程和线程的区别?协程(如 Go 的 goroutine、Java 的虚拟线程)了解吗?

27. Linux 的 I/O 模型:阻塞、非阻塞、多路复用(select/poll/epoll)、异步。epoll 的水平触发和边缘触发区别?

28. TCP 三次握手、四次挥手?为什么是三次不是两次?TIME_WAIT 作用?

29. HTTP/1.1、HTTP/2、HTTP/3 的区别?队头阻塞如何解决?QUIC 协议了解吗?

30. HTTPS 握手过程?CA 证书的作用?中间人攻击如何防范?

31. nginx 反向代理与负载均衡算法(轮询、加权、ip_hash、least_conn)?动静分离怎么配置?

32. Docker 和 虚拟机的区别?镜像分层原理?CMDENTRYPOINT 区别?

33. Kubernetes 核心组件:Pod、Service、Deployment、Ingress。Pod 之间如何通信?


这类题没有标准答案,考察你的思路、权衡能力和沟通能力。

34. 设计一个秒杀系统(从流量接入、库存扣减、订单处理、防刷、降级等方面说)

35. 设计一个短链接系统(如何生成短码?重定向 301/302?数据量大了怎么分片?)

36. 如何设计一个排行榜(实时榜 vs 历史榜,Redis ZSet + 定时归档)

37. 如何设计一个消息推送系统(WebSocket + 消息队列 + 离线消息存储)

38. 有一个 100 亿条 URL 的黑名单,如何快速判断一个 URL 是否在黑名单中?(布隆过滤器,但需接受误判;或用分段哈希)

39. 微信朋友圈点赞/评论功能,如何设计数据模型?(读扩散 vs 写扩散)

40. 实现一个全局递增的 ID 生成器(数据库号段模式、雪花算法、Redis incr)


41. 性能测试关注哪些指标?(TPS、RT、吞吐量、CPU/内存/IO、错误率)

42. 如何对数据库做压力测试?(JMeter 直连 DB,模拟读写混合场景)

43. APP 测试和 Web 测试的主要区别?(安装卸载、网络切换、弱网、电量、兼容性、手势)

44. 你如何保证测试用例的覆盖率?(需求覆盖矩阵 + 代码覆盖率工具如 JaCoCo + 探索性测试)

45. 如果开发说“这个 Bug 我复现不了”,你怎么回应?(提供更详细的步骤、环境、数据、日志,或录屏,或远程协助)


46. 你做过的最有挑战的任务是什么?难点在哪里?你是怎么克服的?(用 STAR 法则:Situation, Task, Action, Result)

47. 你遇到过和同事意见不合的情况吗?怎么处理的?

48. 如果项目上线前突然发现一个严重的 Bug,你会怎么做?

49. 你最近在学习什么新技术?为什么学?怎么学的?

50. 你对未来的职业规划是什么?(1-3 年,3-5 年)

51. 为什么选择我们公司?(提前查公司业务、技术栈、文化)

52. 你还有什么想问我的?(反问环节,别问“加班多吗”,可以问“团队当前最大的技术挑战是什么”“新人的成长路径”)


来自一线面试反馈,概率不高但遇到就赚了。

  • “你用过 arthas 吗?怎么排查线上问题?”
  • “Git 的 rebasemerge 有什么区别?什么时候用 rebase?”
  • “Maven 的依赖仲裁规则?如何排除传递依赖?”
  • “什么是 CAP 理论?为什么说 BASE 是对 CAP 的妥协?”
  • “两阶段提交(2PC)的缺点是什么?三阶段提交(3PC)改进了什么?”
  • “你的项目里最大的并发量是多少?QPS?怎么测出来的?”

  1. 不要等面试官问完才想,平时多拿这些问题自问自答,录音或写下来。
  2. 场景题别追求唯一正确答案,要展现你的分析过程:先问清需求(数据量、并发量、一致性要求),然后给出方案,最后说优缺点和权衡。
  3. 简历上的每个字都要能讲出故事,尤其是“项目亮点”和“用了XX技术”,面试官大概率会深挖。