汇丰面试-内面

我爱海鲸 2025-07-18 17:59:54 暂无标签

简介内面、英文面试

Good morning, my name is liuhaijin.I'm from Longhui, Hunan I graduated from Hunan International Economics University with a bachelor's degree.

I'm a Java developer with six years of experience in software development.

I specialize in backend development using Java ecosystem including Spring Boot, JPA、Mybatis, and microservices architecture.

In my current role at Eastern Communication Company, I've successfully delivered projects involving psychological helper APP, microservice gateway.

I'm eager to bring my technical skills and problem-solving abilities to your team. Thank you for this opportunity to introduce myself.

JPA 面试题精选(附简洁答案)

基础概念

  1. JPA 和 Hibernate 的关系?
    A: JPA 是规范,Hibernate 是最流行的实现。类似 JDBC 与 MySQL 驱动的关系。

  2. Entity 必须满足的条件?
    A: ① @Entity注解 ② 无参构造器 ③ 非final类 ④ 有主键(@Id)

核心注解

  1. @Id 和 @GeneratedValue 的作用?
    A:

    • @Id:标记主键

    • @GeneratedValue:主键生成策略(AUTO/IDENTITY/SEQUENCE/TABLE)

  2. @OneToMany 默认加载策略?如何优化N+1问题?
    A:

    • 默认LAZY加载

    • 优化:@EntityGraph 或 JOIN FETCH

缓存机制

  1. JPA 一级缓存 vs 二级缓存?
    A:

    • 一级缓存:EntityManager级别,事务内有效

    • 二级缓存:跨Session,需要额外配置(如Ehcache)

事务管理

  1. @Transactional 注解失效的常见场景?
    A:
    ① 非public方法
    ② 同类方法调用(未通过代理)
    ③ 异常类型不匹配
    ④ 多线程调用

性能优化

  1. 如何批量插入10万条数据?
    A:

    1. 使用EntityManager#persist()+批次flush

    2. 设置hibernate.jdbc.batch_size=500

    3. 关闭二级缓存

高级特性

  1. JPA 如何实现乐观锁?
    A: 添加@Version注解字段,更新时自动检查版本号。

  2. @Embeddable 的作用?
    A: 将多个字段组合为值对象(如Address),可嵌入到Entity中复用。

常见问题排查

  1. LazyInitializationException 怎么解决?
    A:
    ① 事务范围内完成操作
    ② @Transactional注解
    ③ FetchType.EAGER(慎用)
    ④ Hibernate.initialize()主动初始化

对比题

  1. JPA 与 MyBatis 核心区别?
    A:

    • JPA:ORM框架,面向对象操作

    • MyBatis:SQL映射框架,灵活SQL控制

附:记忆技巧

  • 注解记关键3个:@Entity @Id @Transactional

  • 性能问题记:N+1用FETCH,批量调size,缓存分两级

  • 异常记:Lazy→事务,OptimisticLock→版本号

 

Jenkins 面试题精选

  1. Jenkins 是什么?核心功能?
    A: 开源CI/CD工具,核心功能包括:自动化构建、测试、部署,支持流水线(Pipeline)

  2. Jenkinsfile 是什么?
    A: 用代码定义的CI/CD流程,支持Groovy语法,分为声明式(Declarative)和脚本式(Scripted)

  1. Jenkins 架构主要组件?
    A:

    • Master:调度任务、管理界面

    • Agent/Node:实际执行任务的节点

    • Executor:单个任务执行线程

  2. 什么是 Jenkins Pipeline?优势?
    A:

    • 将整个CI/CD流程代码化

    • 优势:版本控制、可复用、可视化、支持复杂流程

常用插件

  1. 列举5个常用插件及作用
    A:
    ① Git:源码拉取
    ② Docker:容器化构建
    ③ Blue Ocean:可视化界面
    ④ SonarQube:代码质量检测
    ⑤ Credentials:凭据管理

  1. 如何实现自动化触发构建?
    A:
    ① Webhook触发(GitHub/GitLab)
    ② 定时触发(cron语法)
    ③ 上游任务触发

  1. Jenkinsfile 与传统Freestyle项目区别?
    A:

    • Freestyle:通过界面配置,适合简单任务

    • Jenkinsfile:代码化配置,适合复杂流程,可版本控制

附:记忆口诀

  • 核心三件套:Master/Agent/Pipeline

  • 优化四要素:节点/清理/并发/轻量

  • 故障排查法:日志/重试/超时/可视化

多线程面试题

Java创建线程的3种方式?
A:

  1. 继承 Thread 类(不推荐,单继承限制)

  2. 实现 Runnable 接口(推荐,可复用)

  3. 实现 Callable 接口(可返回结果,配合 FutureTask

Runnable vs Callable
A:

  • Runnablerun() 无返回值

  • Callablecall() 可返回结果,可抛异常

线程安全

Q: synchronized 的3种用法?
A:

  1. 修饰实例方法(锁当前对象)

  2. 修饰静态方法(锁类对象)

  3. 同步代码块(锁指定对象)

Q: volatile 的作用?
A:

  • 保证可见性(直接读写主存)

  • 禁止指令重排序(防止JVM优化)

  • 不保证原子性(如 i++ 仍需 synchronized

ReentrantLock 和 synchronized 的区别?
A:

特性 synchronized ReentrantLock
锁获取 JVM自动管理 手动 lock()/unlock()
可中断 ✅(lockInterruptibly()
公平锁 ✅(构造函数设置)
条件变量 wait()/notify() Condition 更灵活

线程池的7大核心参数?
A:

  1. corePoolSize(核心线程数)

  2. maxPoolSize(最大线程数)

  3. keepAliveTime(空闲线程存活时间)

  4. workQueue(任务队列,如 LinkedBlockingQueue

  5. threadFactory(线程工厂)

  6. handler(拒绝策略,如 AbortPolicy

  7. unit(时间单位)

线程池的4种拒绝策略?
A:

  1. AbortPolicy(默认,抛异常)

  2. CallerRunsPolicy(回退给调用者执行)

  3. DiscardPolicy(静默丢弃)

  4. DiscardOldestPolicy(丢弃队列最老任务)

并发工具类

Q: CountDownLatch 和 CyclicBarrier 的区别?
A:

特性 CountDownLatch CyclicBarrier
计数 单向递减(countDown() 可重置(reset()
用途 等待多个任务完成 多个线程互相等待
复用

ThreadLocal 的作用和内存泄漏问题?
A:

  • 作用:线程私有变量,避免共享问题(如 SimpleDateFormat

  • 内存泄漏:线程池中线程存活时间长,ThreadLocal 未 remove() 导致无法回收

如何避免死锁?(死锁的四个必要条件是:互斥、占有且等待、不可抢占和循环等待。)
A:

  1. 按固定顺序获取锁(如 A→B,避免 A←→B

  2. 设置超时tryLock(timeout)

  3. 死锁检测(如 jstack 分析)

记忆技巧

  • 线程安全三件套synchronizedvolatileLock

  • 线程池四要素:核心数、队列、拒绝策略、非核心线程存活时间

  • 并发工具类CountDownLatch(减数)、CyclicBarrier(循环栅栏)

JDK 17 新特性面试题

密封类(Sealed Classes)是什么?如何使用?

  • 作用:限制哪些类可以继承/实现它

模式匹配(Pattern Matching)

instanceof 模式匹配怎么用?
✅ A: 直接转换变量,避免额外强制类型转换:

if (obj instanceof String s) {
    System.out.println(s.length()); // 直接使用 s,无需 (String)obj
}

switch 表达式增强

  • 支持 -> 箭头语法(省略 break

  • String dayType = switch (day) {
        case "MON", "TUE" -> "Weekday";
        case "SAT", "SUN" -> "Weekend";
        default -> throw new IllegalArgumentException();
    };

JDK 17 移除了哪些功能?
✅ A:

  • 移除了 Applet API(已标记废弃多年)

  • 移除了 实验性 AOT/JIT 编译器(GraalVM 替代)

  • 移除了 Security Manager(现代应用很少使用)

Q: 新增的 HexFormat 类有什么用?
✅ A: 方便处理 16 进制字符串转换:

HexFormat hex = HexFormat.of();
String hexStr = hex.toHexDigits(255); // "ff"
int num = hex.fromHexDigits("FF");    // 255

性能与垃圾回收

JDK 17 默认垃圾回收器是什么?
✅ A: G1 GC(Garbage-First),但 ZGC(低延迟)和 Shenandoah(高吞吐)也可用。

Q: JDK 17 对 String 做了什么优化?
✅ A:

  • 内部存储优化(减少内存占用)

  • switch 对 String 的匹配更快

其他重要特性

Q: 什么是 Foreign Function & Memory API(孵化器模块)?
✅ A: 允许 Java 直接调用本地代码(如 C/C++)和操作堆外内存,替代 JNI。

Q: RandomGenerator 接口的作用?
✅ A: 提供更灵活的随机数生成器(如 L32X64Random 比 Random 性能更好)。

面试技巧

  • 重点记忆:密封类、模式匹配、switch 表达式

  • 对比 JDK 11:JDK 17 是下一个 LTS,强调长期支持

  • 实战举例

    • “我用密封类优化了支付系统的状态流转”

    • switch 表达式让代码更简洁”

✅ 加分点:提及 Amber(语言特性)Loom(虚拟线程)Valhalla(值类型) 等未来方向。

Spring Boot 版本兼容性

1. Spring Boot 与 Java 版本兼容性

Q: Spring Boot 3.x 要求的最低 Java 版本是多少?
✅ A:

  • Spring Boot 3.x 需要 Java 17+(不再支持 Java 8/11)

  • Spring Boot 2.x 支持 Java 8~17

Q: 为什么升级 Spring Boot 3.x 必须升级 Java?
✅ A:

  • Spring Boot 3 基于 Spring Framework 6,后者依赖 Java 17 新特性(如模块化、新 API)

  • Jakarta EE 9+ 要求(javax → jakarta 包名变更)

如何检查项目中不兼容的依赖?
✅ A:

  1. 使用 mvn dependency:tree 或 gradle dependencies 查看依赖树

  2. 访问 Spring Boot 官方兼容性矩阵

  3. 运行应用时观察启动日志

记忆技巧

  • Java 版本:Spring Boot 3 == Java 17+(记住 LTS 版本)

  • 包名变更javax → jakarta(影响所有持久化、Web 相关代码)

  • 依赖冲突:优先检查 Hibernate、Jackson、数据库驱动

✅ 面试加分点:结合项目经验,例如:

  • “我们在升级时用 spring-boot-migrator 自动修复了 80% 的兼容性问题”

  • “通过分模块升级,将停机时间控制在 2 小时内”

Docker 面试题

Docker 和虚拟机的区别?

  • Docker:轻量级,共享宿主机内核,启动快(秒级),资源占用少,适合微服务。

  • 虚拟机:完整 OS,独立内核,启动慢(分钟级),资源占用高,适合强隔离场景。

Dockerfile 常用指令?

FROM      # 基础镜像  
COPY      # 复制文件  
RUN       # 执行命令  
EXPOSE    # 暴露端口  
CMD       # 容器启动命令  
ENV       # 设置环境变量  
VOLUME    # 挂载数据卷

多阶段构建减少镜像大小(如 FROM builder AS build + FROM alpine)。

如何进入运行中的容器

docker exec -it <container_id> /bin/bash

如何减少 Docker 镜像体积?

  • 使用 alpine 基础镜像

  • 多阶段构建(如 maven 构建 + jre 运行)

  • 清理缓存(如 apt-get clean

Docker 数据持久化方式?

  • Volume(Docker 管理,docker volume create

  • Bind Mount(直接挂载主机目录,-v /host/path:/container/path

Kubernetes (K8s) 面试题

Kubernetes 核心组件?

  • Master:API Server、Scheduler、Controller Manager、etcd

  • Node:kubelet、kube-proxy、容器运行时(Docker/containerd)

2. Pod 是什么?

  • 最小调度单元,包含 1 个或多个容器(共享网络/存储)。

  • 特点:临时性(可被销毁重建),通过 Deployment 管理生命周期。

3. Service 类型?

  • ClusterIP(默认,集群内部访问)

  • NodePort(暴露节点端口)

  • LoadBalancer(云厂商 LB)

  • ExternalName(DNS 映射)

4. Deployment vs StatefulSet

  • Deployment:无状态应用(如 Web 服务),支持滚动更新。

  • StatefulSet:有状态应用(如 MySQL),保证 Pod 唯一性、持久存储。

5. 如何排查 Pod 一直 Pending?

  • kubectl describe pod <pod_name> 查看事件

  • 常见原因:资源不足、NodeSelector 不匹配、PV 未绑定。

Kafka 面试题 

Kafka 为什么高性能?

  • 顺序磁盘 I/O(日志追加写入)

  • 零拷贝sendfile 减少 CPU 拷贝)

  • 批量发送batch.size + linger.ms

2. 如何保证消息不丢失?

  • Produceracks=all(等待所有副本确认)

  • Brokerreplication.factor ≥ 3(多副本)

  • Consumer:手动提交 Offset(enable.auto.commit=false

3. ISR 是什么?

  • In-Sync Replicas(同步副本集合),Leader 故障时从 ISR 选举新 Leader。

4. 消费者组(Consumer Group)作用?

  • 负载均衡:组内消费者分摊分区消息。

  • 容错:消费者宕机后,分区重新分配。

Kafka vs RabbitMQ

特性 Kafka RabbitMQ
吞吐量 高(百万级) 中(万级)
消息顺序 分区有序 队列有序
适用场景 日志/流处理 企业级消息队列

MQ(消息队列)面试题 

为什么用消息队列?

  • 解耦(生产者消费者独立)

  • 异步(非阻塞调用)

  • 削峰(缓冲高并发请求)

2. RabbitMQ 如何保证消息可靠?

  • 持久化(队列+消息+交换机)

  • ACK 机制(手动确认 basic_ack

  • 事务/Confirm 模式(确保消息到达 Broker)

3. 消息积压怎么处理?

  • 临时方案:增加消费者实例

  • 长期方案:优化消费逻辑(如批量处理)

4. 如何避免重复消费?

  • 幂等设计(如数据库唯一键)

  • Redis 记录已处理消息 ID

总结

  • Docker:轻量、镜像优化、数据持久化

  • K8s:Pod/Service/Deployment、故障排查

  • Kafka:高性能、ISR、Exactly-Once

  • MQ:解耦、可靠投递、幂等性

建议结合项目经验回答(如“我们用 Kafka 处理日志,通过 acks=all 确保不丢失”)。

Redis面试

Redis 是什么?主要用途?
✅ A:

  • 内存数据库,支持持久化,单线程高性能

  • 用途:缓存、会话存储、排行榜、消息队列

Q: Redis 为什么快?
✅ A:

  1. 内存操作(纳秒级响应)

  2. 单线程(避免锁竞争,IO多路复用)

  3. 高效数据结构(如哈希表、跳表)


2. 数据类型与使用场景

Q: Redis 5种核心数据类型及场景?
✅ A:

类型 示例命令 典型场景
String SET/GET 缓存、计数器
Hash HSET/HGET 存储对象(如用户信息)
List LPUSH/LPOP 消息队列、最新消息
Set SADD/SMEMBERS 标签、好友关系
ZSet ZADD/ZRANGE 排行榜、延迟队列

Q: 如何实现分布式锁?

SET lock_key unique_value NX PX 30000  # NX(不存在才设置)+ PX(过期时间)

关键点

  • 唯一值防误删(如UUID)

  • 设置过期时间避免死锁

持久化与高可用

Q: RDB 和 AOF 的区别?
✅ A:

RDB AOF
快照存储(二进制) 日志追加(可读文本)
恢复快,可能丢数据 数据更安全,文件更大
SAVE/BGSAVE 触发 支持 fsync 策略(每秒/始终)

Q: Redis 集群方案有哪些?
✅ A:

  1. 主从复制(读写分离,主节点故障需手动切换)

  2. 哨兵模式(自动故障转移,监控主从状态)

  3. Cluster 模式(分片存储,16384个槽位,自动重平衡)

性能优化

Q: 如何解决缓存穿透?
✅ A:

  1. 布隆过滤器(拦截无效请求)

  2. 缓存空值SET null 60s

Q: 如何避免缓存雪崩?
✅ A:

  1. 随机过期时间(如基础时间+随机偏移)

  2. 多级缓存(本地缓存+Redis)

  3. 熔断降级(如 Hystrix)

Redis 内存满了怎么办?
✅ A:

  1. 淘汰策略(如 volatile-lru 删除最近最少使用的带过期键)

  2. 分片集群(水平扩展)

  3. 压缩数据(如用 Hash 代替多个 String)

Q: 如何保证缓存与数据库一致性?
✅ A:

  • 先更新DB,再删缓存(延迟双删更保险)

  • 监听Binlog(如 Canal 同步到Redis)

记忆技巧

  • 数据类型:String(简单)、Hash(对象)、List(队列)、Set(去重)、ZSet(排序)

  • 高可用三件套:主从、哨兵、Cluster

  • 缓存问题:穿透(空值/布隆)、雪崩(随机过期)、击穿(互斥锁)

✅ 加分点:结合项目举例,如“用ZSet实现电商秒杀排行榜,QPS 10万+”。

多主多从架构解析

什么是多主多从?

✅ 定义

  • 多主(Multi-Master):多个节点均可写入,数据双向同步。

  • 多从(Multi-Slave):多个节点只读,从主节点单向同步数据。

2. 典型应用场景

场景 说明 示例
读写分离 主节点写入,从节点分担读压力 电商商品页(读多写少)
高可用 主节点故障时快速切换 金融交易系统(低容错时间)
地理分布式部署 多地就近读写 全球游戏服务器(降低延迟)

3. 实现方式

数据库(如MySQL)

  • 多主:通过Galera Cluster、MySQL Group Replication实现多主同步。

  • 多从:通过主从复制(binlog)扩展读性能。

Redis

  • 多主:Redis Cluster模式(分片存储,每个分片主从结构)。

  • 多从:主从复制+哨兵(Sentinel)自动故障转移。

Kafka

  • 多主:每个分区(Partition)有Leader(可读写)和Follower(只同步)。

4. 核心挑战与解决方案

问题 解决方案
数据冲突 时间戳/版本号合并(如CRDT数据结构)
同步延迟 最终一致性+监控告警
脑裂(Split-Brain) 仲裁节点(如ZooKeeper)

5. 面试回答模板

Q: 多主多从架构的优缺点?
✅ A:

  • 优点

    1. 高可用(节点冗余)

    2. 负载均衡(读写分离)

    3. 容灾(多地部署)

  • 缺点

    1. 数据一致性难保证(需权衡CAP)

    2. 运维复杂度高(如冲突解决)

6. 记忆口诀

  • 多主多从 = 读写扩展 + 高可用

  • 三核心问题:冲突、延迟、脑裂

  • 场景匹配:读多写少选从库,多地部署用多主

✅ 加分点:结合项目举例,如“在支付系统中,用MySQL多主同步实现跨机房容灾,通过GTID解决数据冲突”。

你好:我的2025