前言: 本文基于一份面试要点清单进行整理和扩展,涵盖了Java开发、运维、测试三个方向的核心面试题。内容力求简洁、准确,并提供参考答案和进一步学习的思路。请注意,这并非一份“万能答案”,而是帮助你梳理知识体系的笔记。真正的面试需要你理解原理,并能结合自己的项目经验进行阐述。
多态:同一个行为具有多个不同表现形式。比如Animal a = new Dog(),调用a.eat()实际执行的是Dog的eat方法。多态三要素:继承、重写、父类引用指向子类对象。
== 和 equals 区别:
==:基本类型比较值,引用类型比较内存地址。equals:默认(Object类)也是比较地址,但String、Integer等重写了equals,变成比较内容。String s1 = new String("hello");
String s2 = new String("hello");
s1 == s2 // false,不同对象
s1.equals(s2) // true,内容相同
扩展:String拼接用
+还是StringBuilder?循环内用StringBuilder,单次拼接编译器会优化成StringBuilder。
不一定为true。hashCode相同只是说明两个对象在散列结构中可能落到同一个桶里,但equals是否相等要看具体实现。规范要求:如果equals为true,hashCode必须相同;反过来不成立。
场景:查询多用ArrayList,频繁插入删除用LinkedList。
底层:数组 + 链表/红黑树。JDK1.8后,当链表长度 > 8且数组长度 >= 64时,链表转红黑树。
红黑树退化链表条件:
扩容原理:
扩展:ConcurrentHashMap分段锁原理(JDK1.7)和CAS+synchronized(JDK1.8)。
线程池种类(Executors提供):
newFixedThreadPool:固定线程数,无界队列。newCachedThreadPool:动态扩容,空闲60s回收,适合短任务。newSingleThreadExecutor:单线程,保证顺序执行。newScheduledThreadPool:支持定时/周期任务。注意:阿里规范禁止用Executors,推荐
ThreadPoolExecutor手动指定参数,防止OOM。
线程创建方式:
IOC(控制反转):把对象的创建和依赖关系的管理交给Spring容器。你不再new对象,而是从容器中“拿”。
AOP(面向切面编程):把横切逻辑(日志、事务、权限)从业务代码中抽离出来,通过动态代理在运行时织入。
Spring默认:有接口用JDK,没有接口用CGLIB。
Controller默认是单例,成员变量会被所有线程共享,存在线程安全问题。解决方案:
@Scope("prototype")改为原型模式#{}:预编译,用?占位,防止SQL注入。${}:直接拼接SQL字符串,有注入风险,通常用于表名、列名动态传入。-- 查询
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;
数据按行和列组织成表格,表之间有明确的关系(通过外键等),使用SQL操作。代表:MySQL、Oracle、PostgreSQL。
DELETE FROM table;:逐行删除,可回滚,不重置自增。TRUNCATE TABLE table;:DDL操作,删除后重建,速度快,不可回滚,重置自增。SELECT DISTINCT column FROM table;SELECT column FROM table GROUP BY column;LEFT JOIN返回左表所有行,右表没有匹配的补NULL。
SELECT a.name, b.order_id
FROM user a
LEFT JOIN orders b ON a.id = b.user_id;
UNION:合并结果集并去重,有排序开销。UNION ALL:合并不去重,效率更高,无需去重时优先使用。ACID:原子性、一致性、隔离性、持久性。
隔离级别(从低到高):
MySQL默认:REPEATABLE READ
类型:普通索引、唯一索引、主键索引、联合索引、全文索引。
什么时候用到索引:
什么时候不走索引:
WHERE age+1=20WHERE phone=123456按粒度:表锁、行锁、页锁
按模式:共享锁(读锁)、排他锁(写锁)
按算法(InnoDB):记录锁、间隙锁、临键锁
乐观锁:不加锁,用版本号或时间戳实现。更新时检查version:
UPDATE goods SET stock = stock - 1, version = version + 1
WHERE id = 1 AND version = #{version};
死锁处理:
SHOW ENGINE INNODB STATUS不修改数据库怎么办?可以用本地日志表 + 消息队列 + 重试 + 幂等设计。
常用场景:缓存、分布式锁、计数器、排行榜(ZSet)、消息队列(Stream)
数据类型:String(最常用)、Hash、List、Set、ZSet、Bitmap、HyperLogLog
集群方案:主从 + 哨兵(高可用)、Redis Cluster(分片)
退出处理:清除全局Session + 通知所有子系统清除局部Session
df -hcat, less, more, head, taills -lh, du -shtop, htop, free -hps aux, ps -effind / -name "*.log"grep -r "error" /var/log/grep -c "error" app.lognetstat -tunlp, ss -tunlp, lsof -i:8080kill -9 PIDuseradd -m username,默认目录/home/usernameusermod -s /sbin/nologin usernameawk:列处理
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粘贴
cat, less, morehead -n 10 file:看前10行tail -n 100 file:看最后100行tail -f file:实时追踪sed -n '1000,2000p' file:查看指定行范围INSERT INTO ... SELECT ... LIMIT offset, batch_sizemysqldump + mysql命令INSERT INTO user (id, name, age) VALUES (1, '张三', 20)
ON DUPLICATE KEY UPDATE age = VALUES(age);
或者用REPLACE INTO(先删后插,注意外键)
255.255.255.0192.168.1.18.8.8.8(谷歌)或114.114.114.114软件测试是验证软件是否符合需求、发现缺陷的过程。重要因为:保证质量、降低风险、节约成本、提升用户体验。
功能测试、性能测试(负载/压力/稳定性)、安全测试、兼容性测试、回归测试、冒烟测试、验收测试。
维度:
用例要素:编号、模块、前置条件、步骤、输入数据、预期结果、优先级。
输入年龄范围1-120,边界值测试:0、1、2、119、120、121。边界值经常出bug。
新建 → 已确认 → 已分配 → 修复中 → 已修复 → 待验证 → 已关闭 / 重新打开 / 拒绝
工具:Selenium(Web)、Appium(移动端)、JMeter(接口/性能)、Postman/Newman(接口)
优势:回归快、可重复、7x24执行、提高覆盖率
局限:不能完全替代手工、维护成本高、不适合UI频繁变化
自动化测试框架组成:测试数据管理 + 用例管理 + 断言 + 报告 + 日志 + CI集成
' or 1=1 --<script>alert(1)</script>需求评审 → 制定测试计划 → 设计测试用例 → 用例评审 → 环境准备 → 执行测试(冒烟→功能→回归)→ 缺陷跟踪 → 测试报告 → 上线验证
在敏捷开发中,测试不再是最后阶段,而是贯穿每个迭代。测试人员参与需求讨论、快速反馈、自动化回归、持续集成。强调:小步快跑、高度协作、拥抱变化。
测试是QA的一部分,QA是更高纬度的质量体系。
示例(可套用):
在实习期间,我负责的一个报表导出功能,数据量达到50万行时经常超时或内存溢出。
排查过程:
- 分析日志发现是内存不足,一次性查询所有数据到内存导致。
- 定位到代码用的是
List<User> list = mapper.selectAll()解决方案:
- 改用MyBatis流式查询 + 游标,每1000条写一次Excel
- 前端分批请求,后端使用SXSSFWorkbook(只保留100行在内存)
- 添加导出任务队列 + 进度提示
最终结果:导出时间从2分钟降到30秒,无OOM,用户可异步下载。
根据实际情况说。示例:
在校园二手交易平台项目中,我负责后端Java开发,具体包括:
- 商品模块的CRUD接口设计
- 使用Redis实现商品浏览量统计和热门商品排行榜
- 对接微信支付沙箱环境
- 编写单元测试和接口文档
使用分布式链路追踪系统,如:
以上是整理的大部分问题,肯定还有很多遗漏。比如:
最后送你几个小建议:
祝你面试顺利,拿到心仪的offer!💪
什么是多态? 、= 、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查看磁盘分区的命令?
怎么查看一个文件的内容,都有哪些命令?
如果文件内容比较多,用什么命令,如何看前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)和软件测试之间有何区别?
程序计数器、虚拟机栈、本地方法栈是线程私有;堆、方法区(元空间)是共享。栈管运行,堆管存储。
标记-清除、标记-复制、标记-整理。CMS 注重低停顿但会产生碎片,G1 可预测停顿且分 Region。
避免核心类被替换。打破的例子:Tomcat 的 WebappClassLoader、JDBC 的 ThreadContextClassLoader。
volatile 关键字的作用?可见性 和 禁止指令重排 如何实现?内存屏障 + 总线嗅探。不能保证原子性(如 i++ 不安全)。
synchronized 和 ReentrantLock 的区别?锁升级过程(无锁 → 偏向锁 → 轻量级锁 → 重量级锁)了解吗?弱引用 Key,但 Value 是强引用,不手动 remove 会导致内存泄漏。用完后一定要 remove。
@Contended 或填充解决?CompletableFuture 用过吗?如何编排异步任务?@EnableAutoConfiguration 和 spring.factories 的关系?解决构造器注入的循环依赖需要
@Lazy。三级缓存解决 AOP 代理对象提前暴露的问题。
穿透:布隆过滤器或缓存空对象。击穿:互斥锁或逻辑过期。雪崩:随机过期时间 + 高可用 + 熔断限流。
CMD 和 ENTRYPOINT 区别?这类题没有标准答案,考察你的思路、权衡能力和沟通能力。
来自一线面试反馈,概率不高但遇到就赚了。
arthas 吗?怎么排查线上问题?”rebase 和 merge 有什么区别?什么时候用 rebase?”