27届软件开发相关面试中小厂主要知识点
2026/9/12 19:54:54 网站建设 项目流程

主要面试点:Java MySQL docker(按遇到频率) 除八股外技术(flyway,xljob)

知识点目录

  • 一.主要知识点
    • Java
      • Java中==与equals()的区别。
      • 如何创建线程池?线程池常见参数有哪些?
      • 线程生命周期
    • ThreadLocal 的用法和实现原理。
      • JVM 运行时数据区
        • 一、线程私有
        • 二、线程共享
        • 三、补充:直接内存(堆外内存)
      • 说说JVM的垃圾回收算法。
      • 设计模式
    • spring
      • ioc
      • aop
      • bean的生命周期
    • redis
      • redis为什么这么快
      • redis常用数据类型及对应使用
      • redis持久化策略
      • 双写一致性
    • MySQL
      • MySQL调优
    • 网络
      • TCP 与 UDP 的 10 大核心区别是什么?
      • 三次握手
    • Linux
      • 常用指令
    • docker
      • 和虚拟机区别
  • 二.前端
    • vue
    • nginx
      • 反向代理
  • 项目相关,请查看项目相关文章

一.主要知识点

Java

Java中==与equals()的区别。

基本数据类型时,比较两个数值是否相等;比较引用类型,比较的是对象的内存地址是否相等。 equals() 没有重写时,Object默认以==来实现,重写以后,按照对象的内容进行比较

如何创建线程池?线程池常见参数有哪些?

ThreadPoolExecutor构造函数或Executors工具类
核心参数包括:核心线程数、最大线程数、存活时间、任务队列、拒绝策略。

// 核心参数:核心线程数、最大线程数、空闲存活时间、时间单位、阻塞队列ThreadPoolExecutorpool=newThreadPoolExecutor(2,// corePoolSize 核心线程4,// maximumPoolSize 最大线程2L,// 空闲线程存活时间TimeUnit.SECONDS,newArrayBlockingQueue<>(5),// 阻塞队列Executors.defaultThreadFactory(),newThreadPoolExecutor.AbortPolicy()// 拒绝策略:抛异常);// 创建固定3个线程的线程池ExecutorServicepool=Executors.newFixedThreadPool(3);

线程池有线程前置勾子后置勾子,可以用来传递上下文认证信息

线程生命周期

NEW
↓ start()
RUNNABLE
├─ 拿不到synchronized锁 → BLOCKED(拿到锁回到RUNNABLE)
├─ wait() / join() / park() → WAITING(被唤醒回到RUNNABLE)
└─ sleep(ms)/wait(超时) → TIMED_WAITING(超时/唤醒回到RUNNABLE)
↓ 任务跑完 / 异常
TERMINATED

ThreadLocal 的用法和实现原理。

ThreadLocal用于存储线程私有数据
每个Thread内部维护ThreadLocalMap
使用后及时remove()防止内存泄漏,弱引用键设计可辅助垃圾回收(key 是弱引用,value 是强引用)。

JVM 运行时数据区

一、线程私有
  1. 程序计数器:记录字节码执行地址,native 方法为空;唯一不会 OOM。
  2. 虚拟机栈:存放栈帧(局部变量表、操作数栈等);方法调用进出栈;可抛 StackOverflowError / OOM。
  3. 本地方法栈:服务 native 本地方法,结构同虚拟机栈。
二、线程共享
  1. :存放对象实例、数组,GC 主要区域;分新生代、老年代;OOM:Java heap space。
  2. 方法区(元空间 Metaspace):存类元信息、运行时常量池;不在 JVM 堆,默认受机器物理内存限制;大量动态生成类会报 Metaspace OOM。
三、补充:直接内存(堆外内存)

说说JVM的垃圾回收算法。

标记-清除(老年代,产生内存碎片)、复制算法(适合新生代)、标记-整理(适合老年代)

设计模式

  1. SRP 单一职责:一个类只有一个引起它变化的原因
  2. OCP 开闭原则:对扩展开放,对修改关闭(核心目标)
  3. LSP 里氏替换:子类可以替换父类,不破坏原有逻辑
  4. ISP 接口隔离:用多个小接口,不要大而全的臃肿接口
  5. DIP 依赖倒置:高层、低层都依赖抽象,不依赖具体细节(就是前面 IoC 用到的)
  6. 狸花猫类记忆
  7. LoD 迪米特法则(最少知识):对象尽量少了解其他对象内部,只和朋友通信

spring

ioc

IoC(控制反转)是一种设计原则,对象创建和依赖管理的控制权从程序转移至外部容器,降低代码耦合。核心思想是“依赖由外部注入而非主动创建”,常见实现方式为依赖注入(DI)。通过容器统一管理对象生命周期,提升代码灵活性和可维护性,使组件更易测试和扩展。

aop

AOP(面向切面编程)通过横向抽取共性功能(如日志、事务),解决代码重复和耦合问题。以动态代理机制在目标方法前后织入增强逻辑,核心概念包括切点(where)、通知(what)、切面(where+what)。实现了业务逻辑与横切关注点分离,提升代码复用性和可维护性。

bean的生命周期

实例化 → 属性填充 → 初始化 → 使用 → 销毁

redis

redis为什么这么快

Redis 是单线程模型 + 纯内存操作 + 高效 IO 多路复用 + 精简数据结构,再加上合理的网络协议,所以速度极高。
网络协议:Redis 通信协议简单,解析开销很小,不需要复杂的序列化 / 反序列化。

redis常用数据类型及对应使用

  1. string:主要:缓存、计数器、验证码、分布式锁
  2. hash:主要:存储对象,用户信息、购物车
  3. list:主要:简易消息队列、最新评论、消息时间线
  4. set:主要:点赞收藏、共同好友、黑白名单
  5. zset:主要:排行榜、热搜、延时队列

redis持久化策略

  1. RDB(二进制快照) 恢复速度快:二进制文件紧凑,加载速度远快于 AOF。

  2. AOF(追加日志)
    数据安全性高:最多丢失 1 秒数据(everysec模式)。
    可读性强:AOF 文件为文本格式,便于人工分析或修复。

  3. 混合持久化(RDB + AOF)

场景推荐方案理由
允许分钟级数据丢失RDBRDB恢复速度快,适合备份和快速重启;快照方式,故障丢失上一次快照后的数据
不允许数据丢失AOF最多丢失1秒数据,安全性高,每秒刷盘记录写命令
高吞吐量场景RDB 或 混合持久化减少AOF频繁同步带来的磁盘IO开销,提升吞吐量
数据恢复优先级混合持久化兼顾RDB快速恢复 和 AOF的数据完整性

双写一致性

常用方法包括:先更新数据库再删缓存(Cache-Aside)、延迟双删(更新前后均删缓存并延迟二次删除)、基于消息队列异步同步、监听数据库binlog触发缓存更新,以及设置缓存过期时间兜底。

MySQL

MySQL调优

一、语句及索引(动态查询方向)

  1. 避免索引失效:不要在索引列做函数运算、隐式转换、like%前缀模糊、or 连接非索引字段
  2. 避免大查询:禁用select *;分页大偏移用主键过滤;杜绝order by/group by无索引导致文件排序
  3. 减少事务内操作,缩小事务时长,降低锁等待
  4. 合理建索引:联合索引遵循最左前缀原则;区分度低字段不建索引;避免过多索引(影响写入)
  5. 优化 join:小表驱动大表,join 字段必须建索引;减少 join 表数量
  6. 减少事务内操作,缩小事务时长,降低锁等待

三、表结构优化(静态查询方面)
7. 字段类型尽量小:能用 int 不用 bigint;varchar 够用即可;日期推荐 datetime,少用 text/blob 大字段
8. 适当分表:水平分表(按时间 / 用户 id 拆分)、垂直分表(大字段拆到副表)
9. 引擎选择:业务绝大部分用 InnoDB,支持事务、行锁;MyISAM 不支持事务,少用

五、锁与事务优化(业务方面)

  • InnoDB 行锁基于索引,不走索引会退化为表锁
  • 降低隔离级别:默认 RR,读多业务可考虑 RC,减少幻读锁开销
  • 避免长事务,长事务占用 undo、锁资源,容易产生死锁

网络

TCP 与 UDP 的 10 大核心区别是什么?

维度TCPUDP
是否连接面向连接:三次握手建立、四次挥手释放无连接:直接发报文
可靠性序列号 + ACK + 重传 → 可靠、有序、不丢不重Best-Effort:可能丢、乱序、重复,不保证送达
传输粒度字节流(Stream) 应用看不到分段报文(Datagram) 一次send()= 一次完整包
流量 / 拥塞控制有窗口 + 拥塞算法(慢启动、拥塞避免、BBR…)无流控、无拥塞控制,发得快丢得多
首部开销20 Byte 起,带选项可到 40-60 Byte8 Byte 固定,结构简单
传输速度稳定但握手 + 拥塞控制 → 首包慢、稳中求胜低延迟、抖动小,但需应用自行容错
组播 / 广播不支持原生支持单播 / 组播 / 广播
适用场景HTTP/HTTPS、FTP、数据库、电子邮件…DNS、VoIP、直播、在线游戏、DHCP…
稳定性成本端口占用多、FD 常驻、握手耗 RTT资源占用低、无状态,服务端易做并发
消息边界无,需要应用层自行划分天然保留边界,一包一消息

三次握手

第一次握手:客户端向服务器端发送SYN,确认客户端的发送没问题。

第二次握手:服务器向客户端发送SYN和ACK包,确认服务器的发送与接收没问题

第三次握手:客户端最后回复一个ACK包,确认客户端的接收没问题。

Linux

常用指令

  1. ls 主要:列出目录文件
  2. cd 主要:切换目录
  3. pwd 主要:查看当前所在路径
  4. mkdir 主要:创建目录,-p 可创建多级目录
  5. rm 主要:删除文件或目录,rm -rf 强制删除
  6. cp 主要:复制文件、文件夹
  7. mv 主要:移动文件,也可用于重命名
  8. cat 主要:查看文件全部内容
  9. less 主要:分页查看大文件
  10. tail 主要:查看文件末尾,tail -f 实时跟踪日志
  11. grep 主要:过滤检索文本内容
  12. ps 主要:查看进程信息
  13. top 主要:实时监控 cpu、内存和进程
  14. kill 主要:终止进程;linux 命令行无法单独删除单个线程,只能 kill 整个进程
  15. ss 主要:查看端口连接信息,替代 netstat
  16. df 主要:查看磁盘分区使用率
  17. du 主要:查看文件夹占用磁盘大小
  18. tar 主要:文件压缩和解压

docker

和虚拟机区别

Docker 容器共享宿主机内核,轻量、启动快、资源占用低,但隔离性弱;虚拟机有独立完整操作系统,隔离安全,但体积大、启动慢、资源消耗高。

二.前端

vue

  1. Vue2 与 Vue3 核心区别 主要:Vue2 选项式 API,Object.defineProperty 实现响应式;Vue3 组合式 API,Proxy 实现响应式,支持 TS,打包体积更小、性能更好。
  2. 响应式原理 主要:Vue2 用 Object.defineProperty 劫持属性,无法监听新增 / 删除属性、数组下标;Vue3 用 Proxy 代理整个对象,可监听新增、删除、数组索引。
  3. 生命周期 主要:Vue2 选项式生命周期;Vue3 选项式保留,组合式用 onMounted/onUpdated 等钩子,在 setup 内部使用。
  4. 状态管理 Pinia 主要:Vue3 推荐,移除 mutation,可直接修改 state;天然支持 TS,无嵌套模块,更简洁。
  5. 组件通信 主要:父传子 props,子传父 $emit;跨层级 provide/inject;全局状态 Vuex/Pinia;兄弟组件可用事件总线。
  6. 编译优化 主要:Vue2 编译生成渲染函数;Vue3 编译时标记静态节点、提升静态常量,减少虚拟 DOM 创建开销。

nginx

反向代理

Nginx 反向代理 主要:接收客户端请求,转发请求到后端服务,再把后端结果返回给客户端;隐藏后端真实地址、做请求转发。

项目相关,请查看项目相关文章

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询