北京明光振铎数据科技 - java开发 一面 面经

1. 能说说ArrayList和LinkedList的区别吗?什么场景下会选择使用它们?

ArrayList底层是基于动态数组实现的,它在内存中是连续存储的。优势在于随机访问效率高,时间复杂度是O(1),因为可以通过索引直接定位。但插入和删除操作(特别是在中间位置)效率较低,需要移动大量元素,时间复杂度O(n)。

LinkedList是基于双向链表实现的,每个节点包含数据和前后指针。它的优势是插入和删除操作效率高,只需要修改指针指向,时间复杂度O(1)。但随机访问效率低,需要从头或尾遍历,时间复杂度O(n)。

使用场景上,如果需要频繁随机访问元素,比如根据索引查询,选ArrayList;如果需要频繁在列表中间插入删除元素,选LinkedList。实际开发中ArrayList使用更多,因为现代CPU缓存对连续内存访问更友好。

2. Redis有哪些持久化方式?不同场景下怎么选择?

Redis主要有三种持久化机制:

RDB(快照):按照设定的时间间隔,将内存中的数据集快照写入磁盘。优点是恢复速度快,文件紧凑,适合备份。缺点是可能丢失最后一次快照之后的数据。

AOF(追加文件):记录每个写操作命令,重启时重新执行这些命令来恢复数据。优点是数据更完整,可以选择不同的同步策略(everysec、always、no)。缺点是文件体积大,恢复速度慢。

混合持久化(RDB+AOF):Redis 4.0后支持,结合了两者优点,AOF重写时使用RDB格式保存基础数据,增量部分用AOF格式。

选择建议:如果能容忍几分钟的数据丢失,对性能要求高,用RDB;如果对数据安全性要求高,用AOF的everysec策略;生产环境建议使用混合持久化,兼顾性能和数据安全。

3. 微服务架构中网关的作用是什么?

网关在微服务架构中扮演统一入口的角色,主要作用包括:

路由转发:根据请求路径将流量分发到对应的微服务实例。

统一鉴权:在网关层统一处理身份认证和授权,避免每个服务重复实现。

限流熔断:保护后端服务,防止流量过载,实现服务降级。

协议转换:支持HTTP、gRPC等不同协议的转换。

日志监控:统一收集请求日志,便于追踪和分析。

跨域处理:统一处理CORS问题。

常用的网关有Spring Cloud Gateway、Zuul、Kong等。网关让客户端不需要知道后端服务的具体地址,降低了耦合度,也便于统一管理横切关注点。

4. 遇到RabbitMQ消息堆积的情况,你会怎么处理?

消息堆积通常是消费速度跟不上生产速度导致的,我会从几个方面处理:

短期应急:增加消费者实例数量,提高并发消费能力;优化消费者代码逻辑,提升单个消费者的处理速度;如果是非核心业务,可以临时提高消费者的prefetch count。

排查原因:检查消费者是否有慢查询或阻塞操作;查看是否有消费失败反复重试的情况;监控消费者的CPU、内存等资源使用情况。

长期优化:对消息进行优先级分类,重要消息优先处理;引入消息削峰,使用延迟队列平滑流量;考虑业务拆分,将耗时操作异步化;设置合理的TTL和死信队列,避免无效消息占用资源。

预防措施:建立监控告警机制,队列深度超过阈值及时通知;做好容量规划和压测。

5. JWT的组成部分有哪些?它是如何防止被篡改的?

JWT由三部分组成,用点号分隔:

Header(头部):包含令牌类型(JWT)和签名算法(如HS256、RS256)。

Payload(载荷):包含声明信息,比如用户ID、过期时间等业务数据。分为注册声明(如exp、iat)、公共声明和私有声明。

Signature(签名):使用Header中指定的算法,对Header和Payload进行签名。

防篡改机制:服务端使用密钥对Header

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试圣经 文章被收录于专栏

Java面试圣经,带你练透java圣经

全部评论

相关推荐

03-04 07:14
门头沟学院 C++
何木健一:去啥?你能考虑去就是思想有问题,当然一周到岗一天可以考虑一下😨
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务