2026-05-18 16:41:29
宁波旷世智源25软件工程师面试核心问题及解答如下:
1. ArrayList 和 LinkedList 的区别及适用场景底层结构:ArrayList 基于动态数组,LinkedList 基于双向链表。
随机访问:ArrayList 支持 O(1) 时间复杂度的随机访问,LinkedList 需 O(n) 遍历。
插入/删除:LinkedList 在头部或尾部插入/删除效率高(O(1)),ArrayList 在中间插入需移动元素(O(n))。
内存占用:LinkedList 每个节点需存储前后指针,内存开销更大。
ArrayList:频繁随机访问、数据量较大且变动少(如缓存、静态数据展示)。
LinkedList:频繁插入/删除、数据量较小或需动态调整(如任务队列、实时数据流处理)。
结构:数组 + 链表(Entry 实体)。
冲突解决:链表法,通过 next 指针连接冲突的键值对。
结构:数组 + 链表 + 红黑树。
树化条件:链表长度 ≥ 8 且数组长度 ≥ 64 时转为红黑树(减少查询时间复杂度至 O(log n))。
扩容机制:
默认容量:16,负载因子 0.75。
扩容触发:元素数量 ≥ 容量 × 负载因子(如 16 × 0.75 = 12 时扩容)。
扩容规则:容量翻倍(2^n),重新计算哈希并分配位置。
短连接:每次请求需建立 TCP 连接,完成后立即关闭。
无持久化:不支持管道化(Pipelining),效率低。
长连接:默认保持 TCP 连接(Connection: keep-alive),复用连接减少开销。
管道化:支持多请求并发发送(但需按顺序响应,易头阻塞)。
新增方法:如 PUT、PATCH、OPTIONS。
二进制分帧:将数据拆分为二进制帧,实现多路复用(解决头阻塞)。
头部压缩:使用 HPACK 算法压缩请求/响应头,减少传输量。
服务器推送:主动向客户端发送资源(如 CSS/JS),减少请求次数。
HTTP 长连接:基于 HTTP 协议,通过 Connection: keep-alive 复用连接,仍为请求-响应模式。
WebSocket:独立协议(ws:///wss://),建立全双工通信通道,支持双向实时数据传输。
HTTP 长连接:需客户端主动发起请求,服务器无法主动推送。
WebSocket:连接建立后,服务器可主动推送数据(如实时通知、聊天应用)。
HTTP 长连接:每次请求仍需携带完整头部。
WebSocket:首次握手后,后续通信仅需 2 字节帧头,效率更高。
单机部署:适用于小型团队,直接安装 FineBI 服务端 + 客户端。
集群部署:通过 Nginx 负载均衡分配请求,结合 Redis 缓存会话,提升并发能力。
数据源连接:支持 MySQL、Oracle、Hive 等,需配置 JDBC 驱动及权限。
API 调用:通过 RESTful API 实现与业务系统的交互(如用户认证、数据导出)。
定时调度:利用 FineBI 内置任务调度功能,定期刷新数据集或发送报表。
前端:React + ECharts(交互性强,适合复杂图表)。
后端:Spring Boot(提供 RESTful API) + WebSocket(实时数据推送)。
数据库:MySQL(存储交易数据) + Redis(缓存聚合结果)。
中间件:Nginx(反向代理、负载均衡) + Kafka(处理高并发日志)。
数据量大导致查询慢:
方案:MySQL 分库分表 + Redis 缓存热点数据。
WebSocket 连接数过高:
方案:Nginx 限流(limit_conn) + 集群部署。
前端渲染卡顿:
方案:虚拟滚动(如 react-window)优化长列表,Web Worker 异步计算。
分层架构:前端(展示层) → 网关(Nginx) → 后端服务(API/WebSocket) → 数据层(MySQL/Redis)。
异步处理:非实时任务(如报表生成)通过消息队列(Kafka)解耦,避免阻塞主流程。
监控告警:集成 Prometheus + Grafana 监控 API 响应时间、Redis 命中率等关键指标。