Java 后端面试题汇总

Java 面试 About 6,025 words

开场

  • 自我介绍
  • 掌握的技术栈
  • 最近一个项目的架构和技术栈
  • 近期做的项目
    • 有什么亮点
    • 有什么值得改进

Java 基础

  • 面向对象有几大特性
    • Java中有没有多继承(interface
  • JDK新特性
    • Java8
      • CompletableFuture
      • Lambda
    • Java9
      • 模块化
      • String底层由char[]变为byte[]
    • Java10
      • 类型推断:var关键字
    • Java11
      • JFR
      • HttpClient
    • Java15
      • ZGCJava11开始预览)
      • record类(Java13开始预览)
      • 文本块(Java13开始预览)
      • 禁用、弃用偏向锁
    • Java17
      • sealed密封类(Java15开始预览)
    • Java19
      • Virutal Thread虚拟线程(开始预览)
  • hashCodeequals
    • 哪些地方用到了
      • HashMap key是对象时
      • switch string
  • Java Collections中的接口和实现类
  • ArrayListLinkedList区别
  • 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方法执行结束被终止而等不到执行
  • StringBufferStringBuilder
  • Java反射优化
  • 类加载机制
    • 类加载时,如何修改类(Java Agent

多线程与并发

  • sleepwait区别
  • 线程的几种状态
  • 守护线程和非守护线程的区别
  • Threadjoin方法的作用
  • 线程安全的集合类
    • CopyOnWriteArrayList
    • CopyOnWriteArraySet
    • ConcurrentHashMap
    • ConcurrentSkipListMap
    • ConcurrentSkipListSet
  • 单机版的限流
    • ConcurrentHashMap -> computeIfAbsent()方法。
  • 如何停止一个线程
  • volatile关键字
    • 可见性
    • 有序性
      • 什么情况下会发生指令重排序
    • 不能保证原子性
    • 懒汉式单例中,双重加锁为什么还要volatile
  • 如何保证原子性
  • 创建线程池主要参数
    • 何时创建非核心线程
    • 核心线程中出现了异常,会怎么样
  • Java中线程安全的类
    • AtomicInteger
    • LongAdder
  • ConcurrentHashMap/CopyOnWriteArrayList实现原理
  • ThreadLocal
    • 注意事项
  • Thread.sleep(0)作用

  • JDK中一共有几种锁
    • synchronized
    • ReentrantLock公平锁与非公平锁
    • ReentrantReadWriteLock读写锁
    • StampedLock读写锁,乐观锁
    • CAS自定义自旋锁
      • 如何避免ABA问题(AtomicStampReference
  • ReentrantLock公平锁与非公平锁实现上的区别
  • synchronized
  • ReentrantLocksynchronized区别
    • synchronized重量级锁能否退化
    • 瞬时高并发接口使用哪个
  • 什么场景会导致死锁
  • 简述AQS
  • AQS实现类
    • ReentrantLock
    • CountDownLatch,原理
    • CyclicBarrier
    • Semaphore
  • LockSupport

JVM

  • Java启动时命令行参数有哪些
  • Java命令行启动参数添加的几种方式
    • 直接指定:java -jar -Xmx50m
    • DockerfileCMDEnrerpoint
    • KubernetesDeployment
    • 环境变量:JDK_JAVA_OPTIONS(仅对java命令生效)、JAVA_TOOL_OPTIONSjava/javac/jshell等)
  • 如何指定启动参数
  • 语法糖
    • 增强for循环原理
      • 数值
      • 集合
    • 自动拆装箱
  • 使用过哪些诊断工具
    • JFRJava Flight Recorder
    • VisualVM
    • Arthas
    • jstack
    • jstat
    • jmap
    • jcmd
  • 一个Java进程中的内存组成
  • 如何排查Java进程内存占用过高问题
    • top查看RSS常驻内存和VIRT虚拟内存
    • pmap查看内存映射
    • NMT查看内存组成
    • jconsole查看堆外内存
  • 了解过NMT吗,如何查看
    • 各个分类代表什么意思
    • 内存最有可能出现问题的在哪个分类

GC

  • 哪些对象可以作为GC Root
  • Java中的引用类型有哪些(强、软、弱、虚、引用队列)
  • 垃圾回收器的种类
    • Serial
    • CMS
    • G1
    • ZGC
    • Shenandoah
  • Java 11默认垃圾回收器
    • CPU > 1 && RAM > 2GG1GC
    • CPU = 1 || RAM < 2GSerialGC
  • JVM如何使用垃圾回收器
  • 说一下SafePoint

设计模式

  • 六大原则
    • 单一职责:一个类和方法只作一件事
    • 里氏替换:多态,之类可扩展父类
    • 依赖倒置:细节依赖抽象,下层依赖上层
    • 接口隔离:建立单一接口
    • 迪米特原则:最少知道,降低耦合
    • 开闭原则:抽象架构,扩展实现
  • Spring设计模式
    • 单例模式(但不是Bean的单例)
    • 工厂模式
    • 责任链模式(拦截器,过滤器)
    • 适配器模式(Adapter

OAuth2

  • 简单说下OAuth2
  • OAuth2有几种授权模式
    • 授权码模式流程是怎么样的
    • 普通授权码模式安全吗?如何保证安全(PKCE
    • 设备码模式流程是怎么样的
  • OAuth2OIDC区别和联系
  • OIDC中的scope有哪些
    • offline_access的作用
  • 什么是Client,什么是ResourceServer
  • AccessTokenRefreshTokenIDToken的区别和关联
  • User退出后如何通知服务端(BackChannel Logout
  • 退出登录后Token如何做失效处理
  • 了解过Keycloak吗?简单说下他有几个概念
  • Spring Security如何实现的OAuth2
  • Spring Security原理

Spring

  • 实战

    • 如果设置服务端超时时间
      • 服务端超时后是否会继续执行业务逻辑
    • ControllerAdvice如何捕获Error级别错误,如StackOverflowErrorNoClassDefFoundError
    • Spring常用注解
      • @RequestMapping
      • @ResponseBody
      • @RequestBody
    • FilterInterceptor区别
      • 作用域
    • 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原理
      • Authentication
        • Filter中注入AuthenticationToken
      • Authorization
        • AuthenticationProvider校验AuthenticationToken
        • 校验access方法中实现的逻辑(如:permitAllauthenticated、自定义逻辑)
    • Spring大量使用反射,效率会变低吗
    • Spring中的IOC步骤
    • Spring中的AOP
    • Spring Bean
      • 对象是单例还是多例
      • 注册过程
      • 定义包含哪些(BeanDefinition
      • 生命周期
    • Spring三级缓存
    • Spring循环依赖
    • Spring循环依赖能否用二级缓存
    • SpringMVC流程
    • Spring Boot特性
    • Spring Boot启动流程
    • Spring Boot自动配置原理
    • Spring Boot Jar包启动原理

事务

  • Spring传播
  • Spring事务原理
  • Spring事务失效
  • Spring事务中有远程调用如何处理
  • 事务隔离级别

MySQL

    • 乐观锁与悲观锁的实现
    • 如何解决幻读(间隙锁,不是MVCC
    • 意向锁
    • 行锁/记录锁
    • 间隙锁
    • Next-Key
  • 索引
    • 聚集索引和非聚集索引(Cluster IndexNon 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:在设置了过期时间的所有键,抛弃存活时间最短的数据。
  • 如何持久化
    • RDBAOF优缺点
    • 如何选择
  • 单线程为什么这么快
    • 6.0版本后为什么改为多线程
  • bigkey查询大key命令
    • redis-cli --bigkeys -i 0.1
  • hotkey查询热点数据命令
    • 必须使用LFU淘汰策略
    • redis-cli --hotkeys -i 0.1
  • hash tag作用(将key存在同一物理节点上的slot上,减少查询)
  • 缓存雪崩
  • 缓存击穿
  • 缓存与数据库双写不一致
  • 线上禁用哪些命令
    • keys
    • flushall
    • flushdb

MQ

  • 为什么要使用队列
  • 使用场景是哪些
  • RabbitMQ集群模式,优缺点
  • RabbitMQ分发模式
  • 路由方式是怎么样的
  • 如何保证消息不丢失
  • 如何避免消息重复投递和重复消费

分布式

  • 如何保证接口幂等
  • 限流算法
    • 计数器(固定窗口):Redis incr
    • 滑动窗口:Redis zset
    • 漏桶
    • 令牌桶:Guava RateLimiter
  • 分布式定时任务和普通定时任务有什么区别
  • 分布式锁
    • 基于数据库
    • 基于Redis
    • 基于Zookeeper
  • 分布式Session
    • Session粘滞
    • 共享Session
      • Redis
      • MongoDB
      • 数据库
  • 分布式事务
    • 本地消息表
    • Ali Seata
    • 最终一致性
      • MQ
  • 高并发时,服务如何扩容
    • 新增实例,配置到负载均衡
    • Kubernetes调整Deploymentreplicas参数
    • 使用KubernetesHPA控制器,动态扩缩容
  • 负载均衡策略
    • ip hash
    • url hash
    • weight权重
    • 轮询
  • 什么是流量染色
    • 基于流量染色可以实现什么
      • 灰度发布
      • 蓝绿部署
      • 泳道隔离
  • 全链路追踪
    • HTTP Header添加TraceId
    • Slf4jMDC机制及原理(ThreadLocal
      • 能否在子线程中使用

压测

  • 是否做过压测
    • 使用什么工具
    • 压测的步骤
  • JVM参数
  • GC调优

Kubernetes

  • Pod控制器有哪几种
  • Deployment常用设置
    • replicas副本数
    • pod的属性,探针probe
    • 设置配置(环境变量envFrom
      • ConfigMap
      • Secrets
  • 如何查看namespace下所有pod的日志
  • 如何远程Debug一个Java应用
    • 添加command参数,暴露5005端口,port-forward端口
    • 使用Telepresence网络代理,直接本地调试,注意断点类型
  • 如何简化本地开发
    • Telepresence
    • kt-connect
    • nocalhost
  • 如何使用Helm Chart

架构

  • 日常职责是什么
  • 如何做技术选型?
    • 需求分析
    • 技术调研
    • 方案规划
    • 代码落地
  • 服务限流有哪些算法
  • 数据同步有哪些方式
  • 高并发和高性能的区别和联系
    • 高并发:访问数量
    • 高性能:访问响应时间
  • 如何设计高可用
  • 如何设计高扩展
  • 如何JVM调优
  • 如何复用及重构
  • 如何防止重放攻击
  • 如何做大文件上传下载
  • CAP定理
    • Consistency:一致性
    • Availability:可用性
    • Partition tolerance:分区容错性
  • BASE理论
    • Basically Available:基本可用
    • Soft-state:软状态
    • Eventually consistent:最终一致性

系统设计

  • 订单号生成规则

综合考察

  • 软件开发的全生命周期,开发流程
    • 独立工作能力
    • 需求分析
    • 详细设计
    • 模块划分(微服务)
    • 编码实现(用到哪些组件、依赖)
    • 自测及交付流程(ReviewCICD
Views: 1,446 · Posted: 2022-09-13

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb/LiteNote

扫描下方二维码关注公众号和小程序↓↓↓

扫描下方二维码关注公众号和小程序↓↓↓


Today On History
Browsing Refresh