Java 后端面试题汇总
Java 面试 About 6,025 words开场
- 自我介绍
- 掌握的技术栈
- 最近一个项目的架构和技术栈
- 近期做的项目
- 有什么亮点
- 有什么值得改进
Java 基础
- 面向对象有几大特性
Java中有没有多继承(interface)
JDK新特性Java8CompletableFutureLambda
Java9- 模块化
String底层由char[]变为byte[]
Java10- 类型推断:
var关键字
- 类型推断:
Java11JFRHttpClient
Java15ZGC(Java11开始预览)record类(Java13开始预览)- 文本块(
Java13开始预览) - 禁用、弃用偏向锁
Java17sealed密封类(Java15开始预览)
Java19Virutal Thread虚拟线程(开始预览)
hashCode与equals- 哪些地方用到了
HashMap key是对象时switch string时
- 哪些地方用到了
Java Collections中的接口和实现类ArrayList与LinkedList区别List集合去重HashSet实现原理HashMap实现原理final关键字final修饰的类有哪些(String)- 匿名内部类引用局部变量,需要注意什么(必须
final修饰) - 为什么匿名内部类引用外部局部变量必须要加
final关键字 - 为什么匿名内部类引用外部局部变量不用加
final也不报错
finally- 什么时候执行
finally代码块 - 什么时候不会执行
finally代码块(问这个问题基本就是找茬)- 未进入
try代码块:if条件未进入、在try之前return、在try之前异常 try代码块中死循环try代码块中退出虚拟机System.exit(0)- 守护线程
run方法中的finally可能因为main方法执行结束被终止而等不到执行
- 未进入
- 什么时候执行
StringBuffer和StringBuilderJava反射优化- 类加载机制
- 类加载时,如何修改类(
Java Agent)
- 类加载时,如何修改类(
多线程与并发
sleep和wait区别- 线程的几种状态
- 守护线程和非守护线程的区别
Thread的join方法的作用- 线程安全的集合类
CopyOnWriteArrayListCopyOnWriteArraySetConcurrentHashMapConcurrentSkipListMapConcurrentSkipListSet
- 单机版的限流
ConcurrentHashMap->computeIfAbsent()方法。
- 如何停止一个线程
volatile关键字- 可见性
- 有序性
- 什么情况下会发生指令重排序
- 不能保证原子性
- 懒汉式单例中,双重加锁为什么还要
volatile
- 如何保证原子性
- 创建线程池主要参数
- 何时创建非核心线程
- 核心线程中出现了异常,会怎么样
Java中线程安全的类AtomicIntegerLongAdder
ConcurrentHashMap/CopyOnWriteArrayList实现原理ThreadLocal- 注意事项
Thread.sleep(0)作用
锁
JDK中一共有几种锁synchronizedReentrantLock公平锁与非公平锁ReentrantReadWriteLock读写锁StampedLock读写锁,乐观锁CAS自定义自旋锁- 如何避免
ABA问题(AtomicStampReference)
- 如何避免
ReentrantLock公平锁与非公平锁实现上的区别synchronizedReentrantLock与synchronized区别synchronized重量级锁能否退化- 瞬时高并发接口使用哪个
- 什么场景会导致死锁
- 简述
AQS AQS实现类ReentrantLockCountDownLatch,原理CyclicBarrierSemaphore
LockSupport
JVM
Java启动时命令行参数有哪些Java命令行启动参数添加的几种方式- 直接指定:
java -jar -Xmx50m Dockerfile:CMD、EnrerpointKubernetes:Deployment- 环境变量:
JDK_JAVA_OPTIONS(仅对java命令生效)、JAVA_TOOL_OPTIONS(java/javac/jshell等)
- 直接指定:
- 如何指定启动参数
- 语法糖
- 增强
for循环原理- 数值
- 集合
- 自动拆装箱
- 增强
- 使用过哪些诊断工具
JFR:Java Flight RecorderVisualVMArthasjstackjstatjmapjcmd
- 一个
Java进程中的内存组成 - 如何排查
Java进程内存占用过高问题top查看RSS常驻内存和VIRT虚拟内存pmap查看内存映射NMT查看内存组成jconsole查看堆外内存
- 了解过
NMT吗,如何查看- 各个分类代表什么意思
- 内存最有可能出现问题的在哪个分类
GC
- 哪些对象可以作为
GC Root Java中的引用类型有哪些(强、软、弱、虚、引用队列)- 垃圾回收器的种类
SerialCMSG1ZGCShenandoah
Java 11默认垃圾回收器CPU > 1 && RAM > 2G:G1GCCPU = 1 || RAM < 2G:SerialGC
JVM如何使用垃圾回收器- 说一下
SafePoint
设计模式
- 六大原则
- 单一职责:一个类和方法只作一件事
- 里氏替换:多态,之类可扩展父类
- 依赖倒置:细节依赖抽象,下层依赖上层
- 接口隔离:建立单一接口
- 迪米特原则:最少知道,降低耦合
- 开闭原则:抽象架构,扩展实现
Spring设计模式- 单例模式(但不是
Bean的单例) - 工厂模式
- 责任链模式(拦截器,过滤器)
- 适配器模式(
Adapter)
- 单例模式(但不是
OAuth2
- 简单说下
OAuth2 OAuth2有几种授权模式- 授权码模式流程是怎么样的
- 普通授权码模式安全吗?如何保证安全(
PKCE) - 设备码模式流程是怎么样的
OAuth2与OIDC区别和联系OIDC中的scope有哪些offline_access的作用
- 什么是
Client,什么是ResourceServer AccessToken、RefreshToken、IDToken的区别和关联User退出后如何通知服务端(BackChannel Logout)- 退出登录后
Token如何做失效处理 - 了解过
Keycloak吗?简单说下他有几个概念 Spring Security如何实现的OAuth2Spring Security原理
Spring
实战
- 如果设置服务端超时时间
- 服务端超时后是否会继续执行业务逻辑
ControllerAdvice如何捕获Error级别错误,如StackOverflowError、NoClassDefFoundErrorSpring常用注解@RequestMapping@ResponseBody@RequestBody
Filter和Interceptor区别- 作用域
Spring如何解析HTTP报文信息(HttpMessageConverters)Spring中注入的几种方式,Spring推荐哪种注入方式@Resource@Autowired- 构建函数注入
Spring不用@Autowired、@Resource能否注入对象Spring Boot配置优先级Spring Boot路径匹配规则Spring Boot优雅停机- 如何自定义
spring boot starter - 如何排除
spring boot starter中加载的配置 @Conditional使用与原理Spring Boot镜像分层构建- 优点
- 原理
- 如果设置服务端超时时间
原理
Spring Security原理AuthenticationFilter中注入AuthenticationToken
AuthorizationAuthenticationProvider校验AuthenticationToken- 校验
access方法中实现的逻辑(如:permitAll、authenticated、自定义逻辑)
Spring大量使用反射,效率会变低吗Spring中的IOC步骤Spring中的AOPSpring Bean- 对象是单例还是多例
- 注册过程
- 定义包含哪些(
BeanDefinition) - 生命周期
Spring三级缓存Spring循环依赖Spring循环依赖能否用二级缓存SpringMVC流程Spring Boot特性Spring Boot启动流程Spring Boot自动配置原理Spring BootJar包启动原理
事务
Spring传播Spring事务原理Spring事务失效Spring事务中有远程调用如何处理- 事务隔离级别
MySQL
- 锁
- 乐观锁与悲观锁的实现
- 如何解决幻读(间隙锁,不是
MVCC) - 意向锁
- 行锁/记录锁
- 间隙锁
Next-Key锁
- 索引
- 聚集索引和非聚集索引(
Cluster Index、Non Cluster Index) - 覆盖索引
- 索引条件下推
- 聚集索引和非聚集索引(
SQL
- 数据库表的设计规范:三范式
select *与select id区别- 如何定位
SQL需要优化及如何优化- 慢
SQL EXPLAIN- 聚集索引
Cluster Index非聚集索引Non-Cluster Index - 覆盖索引
exist in区别- 索引条件下推
- 慢
- 索引失效的情况
- 模糊索引,头部模糊如何走索引
- 成绩表:学生名字,学科,成绩。
- 找出所有学科成绩大于等于
90分的学生名字 - 获取总分最高的前三名(
sum -> group by name fetch first 3 rows) - 获取单科成绩最高的前三名(
rank() over(partition by subject order by score desc) -> rank <= 3)
- 找出所有学科成绩大于等于
- 删除重复数据保留最新一条数据
Redis
- 常用的数据类型
zset实现原理(skiplist)
- 数据淘汰策略
noeviction:默认策略,不淘汰,如果内存已满,添加数据是报错。allkeys-lru:在所有键中,选取最近最少使用的数据抛弃。volatile-lru:在设置了过期时间的所有键中,选取最近最少使用的数据抛弃。allkeys-random:在所有键中,随机抛弃。volatile-random:在设置了过期时间的所有键,随机抛弃。volatile-ttl:在设置了过期时间的所有键,抛弃存活时间最短的数据。
- 如何持久化
RDB和AOF优缺点- 如何选择
- 单线程为什么这么快
6.0版本后为什么改为多线程
bigkey查询大key命令redis-cli --bigkeys -i 0.1
hotkey查询热点数据命令- 必须使用
LFU淘汰策略 redis-cli --hotkeys -i 0.1
- 必须使用
hash tag作用(将key存在同一物理节点上的slot上,减少查询)- 缓存雪崩
- 缓存击穿
- 缓存与数据库双写不一致
- 线上禁用哪些命令
keysflushallflushdb
MQ
- 为什么要使用队列
- 使用场景是哪些
RabbitMQ集群模式,优缺点RabbitMQ分发模式- 路由方式是怎么样的
- 如何保证消息不丢失
- 如何避免消息重复投递和重复消费
分布式
- 如何保证接口幂等
- 限流算法
- 计数器(固定窗口):
Redis incr - 滑动窗口:
Redis zset - 漏桶
- 令牌桶:
Guava RateLimiter
- 计数器(固定窗口):
- 分布式定时任务和普通定时任务有什么区别
- 分布式锁
- 基于数据库
- 基于
Redis - 基于
Zookeeper
- 分布式
SessionSession粘滞- 共享
SessionRedisMongoDB- 数据库
- 分布式事务
- 本地消息表
Ali Seata- 最终一致性
MQ
- 高并发时,服务如何扩容
- 新增实例,配置到负载均衡
Kubernetes调整Deployment的replicas参数- 使用
Kubernetes的HPA控制器,动态扩缩容
- 负载均衡策略
ip hashurl hashweight权重- 轮询
- 什么是流量染色
- 基于流量染色可以实现什么
- 灰度发布
- 蓝绿部署
- 泳道隔离
- 基于流量染色可以实现什么
- 全链路追踪
HTTP Header添加TraceIdSlf4j的MDC机制及原理(ThreadLocal)- 能否在子线程中使用
压测
- 是否做过压测
- 使用什么工具
- 压测的步骤
JVM参数GC调优
Kubernetes
Pod控制器有哪几种Deployment常用设置replicas副本数pod的属性,探针probe- 设置配置(环境变量
envFrom)ConfigMapSecrets
- 如何查看
namespace下所有pod的日志 - 如何远程
Debug一个Java应用- 添加
command参数,暴露5005端口,port-forward端口 - 使用
Telepresence网络代理,直接本地调试,注意断点类型
- 添加
- 如何简化本地开发
Telepresencekt-connectnocalhost
- 如何使用
Helm Chart
架构
- 日常职责是什么
- 如何做技术选型?
- 需求分析
- 技术调研
- 方案规划
- 代码落地
- 服务限流有哪些算法
- 数据同步有哪些方式
- 高并发和高性能的区别和联系
- 高并发:访问数量
- 高性能:访问响应时间
- 如何设计高可用
- 如何设计高扩展
- 如何
JVM调优 - 如何复用及重构
- 如何防止重放攻击
- 如何做大文件上传下载
CAP定理Consistency:一致性Availability:可用性Partition tolerance:分区容错性
BASE理论Basically Available:基本可用Soft-state:软状态Eventually consistent:最终一致性
系统设计
- 订单号生成规则
综合考察
- 软件开发的全生命周期,开发流程
- 独立工作能力
- 需求分析
- 详细设计
- 模块划分(微服务)
- 编码实现(用到哪些组件、依赖)
- 自测及交付流程(
Review、CI、CD)
Views: 2,609 · Posted: 2022-09-13
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
Loading...