高频面试题笔记

73 阅读5分钟

概念

集合

并发编程

IO

  • stream流:抽象概念表示数据的流动通道,数据从 源(Source)流向 目标(Destination)。
  • IO 输入 / 输出:为了解决计算机与外界数据传输,可用于文件读写操作(读取配置文件、保存用户数据、处理日志等)、网络通信(发送 HTTP 请求、接收服务器响应、实现即时通讯等)、设备交互(读取键盘输入、输出到显示器、控制打印机等)。
    • 文件读写操作
    • 网络通信
      • Socket
    • 设备交互

JVM

Web相关

Sevlet

  • Tomcat:Tomcat是一个开源的 Servlet 容器(也称为 Web 服务器),用于运行 Java Web 应用程序。
  • jsp:创建 java web 动态网页的一种技术。
  • Sevlet:Sevlet是运行在Web服务器的 java 程序。主要用于处理客户端(如浏览器)的请求并返回响应。
    • 页面跳转方式
      • forward转发服务器内部跳转:请求在服务器端被转发到另一个资源(Servlet、JSP 或静态文件),客户端感知不到中间跳转过程。一次请求:整个过程只产生一个 HTTP 请求,浏览器 URL 保持不变。
      • redirect重定向客户端跳转:服务器返回一个特殊响应(状态码 302/303),指示浏览器重新发送请求到新的 URL。两次请求:浏览器先请求 A 资源,A 返回重定向指令,浏览器再请求 B 资源,URL 会变为新地址。
    • 用户状态管理方式
      • cookie客户端存储:服务器发送到用户浏览器并保存在本地的小段数据。跨请求传递:浏览器下次向同一服务器再发起请求时,会自动携带这些数据。
      • session服务器端存储:为每个用户创建的独立会话空间,存储用户状态。依赖 Cookie 或 URL 重写:通过唯一的 session_id 标识用户。
    • filter过滤器拦截请求与响应:Filter 可以在请求到达 Servlet 之前或响应返回客户端之前,对请求和响应进行拦截和处理。链式处理:多个 Filter 可以组成一个链,依次对请求和响应进行处理。解耦通用逻辑:将与业务无关的通用功能(如编码转换、权限验证)从 Servlet 中分离出来。
    • listener监听器事件驱动:Listener 用于监听 Web 容器中的特定事件,当事件发生时执行相应的逻辑。无拦截能力:Listener 不拦截请求或响应,仅在事件触发时被动执行。系统级监控:常用于应用初始化、资源管理、会话统计等。

MyBatis

  • 持久层:将内存中的对象状态保存到数据库或文件系统中,以便长期保存。
  • ORM(对象关系映射):将面向对象的实体类与数据库表建立映射关系,实现对象与数据库记录的相互转换。
  • 缓存
    • 一级缓存:默认启用。基于 SqlSession(会话级缓存),随 SqlSession 关闭而清空。线程安全的,适用于短期、高频次查询。
      1. 首次执行查询时,结果存入 SqlSession 的缓存(Map)。
      2. 同一 SqlSession 内执行相同 SQL(相同语句和参数)时,直接从缓存返回结果,无需访问数据库
      3. 当执行 insertupdatedelete 操作或手动调用 clearCache() 时,缓存失效。
    • 二级缓存:需要手动开启。基于 Mapper(映射器级缓存)或命名空间,应用启动到应用关闭。跨会话共享(需考虑线程安全),适用于长期、跨会话的数据缓存、全局数据缓存。
      1. 首次执行查询时,结果存入二级缓存(跨 SqlSession 共享)。
      2. 不同 SqlSession 执行相同命名空间下的 SQL 时,优先从二级缓存获取。
      3. 同一命名空间内执行 insertupdatedelete 操作时,自动刷新缓存。

Spring

  • Bean
  • IOC控制反转
  • AOP面向切面编程

SpringMVC

  • Interceptor拦截器:用于在请求处理的前后执行特定逻辑。它类似于 Servlet Filter,但提供更精细的控制,可用于权限验证、日志记录、性能监控等场景。

SpringBoot

  • 自动装配

java基础

== 和 equals() 的区别

为什么重写 equals() 时必须重写 hashCode() 方法

String、StringBuffer、StringBuilder 的区别

泛型擦除

反射

代理

spi

集合

IO

并发编程

JVM

如何判断对象存活?请解释强引用、软引用、弱引用、虚引用

框架

如何对SpringBoot配置文件敏感信息加密?

为什么有些公司禁止使用@Transactional声明式事务?

场景题

如何设计一个订单号生成服务(全局唯一id)

设计要点 image.png 改造的twitter 雪花算法

为什么要分库分表

image.png

亿级用户热点数据更新如何优化

热点数据是指访问量频率很高、更新频繁的数据。比如并发量很高的某个接口、查询用户信息、优惠券信息等。

热点数据更新带来的问题。 image.png

大致出问题方向(微服务架构)

  • 应用线程被打挂。
    • 应用活跃的线程超过当前配置最大值。新请求进来,应用无法处理从而出现假死现象,基于K8s部署的应用通过请求探活接口,发现没响应后会不断重启应用,导致应用处理接口能力时好时坏。
  • 数据库被打挂(优先考虑,80%大概率)。
    • 数据库出现大量SQL,而且业务请求量很大,导致大量线程堵塞,CPU很块飙升100%。
    • 并发请求量太大,超过数据库承受的最大线程数TPS。CPU飙升100%。
  • Redis被打挂。
    • redis cpu被打爆。一般可能原因 redis出现热key。
    • redis 内存被打爆。一般可能原因 redis key短时间内增长很快超过内存最大值(设计不合理或设置过期时间太长)。
    • reids 网络io太大。一般可能原因 redis出现大key。

image.png

项目遇到的难点

秒杀

ThreadLocal内存泄漏

数据一致性问题