---
url: /notes/面试/真实面经/飞速创新/index.md
---
业务 工作流引擎 PM物料管理平台

## 介绍独立开发的需求-辅料到货计划

**表设计**

需求计划表：月份，日期（到每一天），版本，辅料，数量

库存表：辅料，数量

采购订单：辅料、单位、订单未到货数量、采购订单发货时间、计划到货时间

仓库作业能力：最大作业能力（1托盘-x单位）

到货计划表：月份，日期（到每一天），版本，辅料，数量

**整体逻辑**

1. 生产工单的成品需要的辅料（来源辅料BOM）生成辅料需求计划
2. 根据需求，库存，仓库作业能力 测算 每天需要的到货量
3. 根据采购订单去分配给对应的供应商

![image-20250409215513161](https://note-1259190304.cos.ap-chengdu.myqcloud.com/noteimage-20250409215513161.png)

## 开发过程中，怎么实现一个用户角色权限管理系统的整体方案

根据 用户-角色 设计到菜单、按钮的权限控制

用户表

角色表

角色用户关联表

菜单表

按钮表

角色菜单关联表

角色按钮关联表

**菜单展示逻辑**

用户登录后，前端发送请求到后端，获取用户所属角色的菜单权限。

**按钮显示逻辑**

当用户访问某个页面时，前端发送请求到后端，获取用户所属角色的按钮权限。

如果用户通过禁用JavaScript来绕过前端的权限校验，那么前端的任何基于JavaScript的校验逻辑都将失效。

后端进行权限校验

## 项目上遇到的难解决的问题

服务器无法处理请求，nginx代理其中一台服务器处理不了请求，直接访问也打不开页面

1.**日志查看出现GC**

```
jmap -dump 查看是否内存溢出
发现某个对象频繁创建！！！复制❌！已复制！
```

2.查看进程占用高达1400%

```
top -Hp

printf %\n

jstack 线程 获取堆栈信息
发现某个方法一直在执行，分析可能是数据量大/数据库死锁复制❌！已复制！
```

这个方法是统计报表用到，每个月底会执行，数据每天20w作业，统计实验室的温度，湿度；获取数据湖的数据

本地debug 直接卡死，GC

多线程并行分批处理，发现一天一天执行时间还是10分钟左右

排查sql问题，sql执行1-3s

方法里面打印执行时间，发现查询数据慢

可能是sql字段过多，映射实体较慢

修改xml指定具体字段，换指定jdbc类型和java类型转换

发现问题还是没有解决

可能是mybatis默认的反射（运行时动态解析）填充字段慢

修改为构造器（编译时，调用类的构造函数）方式映射

修改完执行时间减少到1-2分钟（每一天的数据）

## 上一家公司如何承接项目，项目开发人员架构

## List的集合实现-ArrayList和LinkedList的区别

ArrayList基于数组

LinkedList基于双向链表

本质是数组和链表的区别

数组通过下标快速访问，在移动元素的情况下，插入和删除较慢

链表在中间插入和删除需要找到对应元素，才能删除

## 有没有其它优化的链表结构能使从中间插入或删除时的时间复杂度更快

跳表（Skip List）：跳表的查找和插入操作的平均时间复杂度可以达到 O(log n)

[Redis 中跳表的实现原理是什么？ - 面试鸭 - 程序员求职面试刷题神器](https://www.mianshiya.com/question/1780933295597449217)

多层链表实现，底层链表保存所有元素，每一层链表都是下一层的子集

![image-20250318202935210](https://note-1259190304.cos.ap-chengdu.myqcloud.com/noteimage-20250318202935210.png)

## HashMap插入流程

HashMap主要由**数组和链表**组成，存储键值对，不是线程安全的。

插入数据用`put`，`get`查询数据以及扩容的方式。

jdk1.7和1.8的主要区别在于**头插**和**尾插**方式的修改,头插容易导致HashMap链表死循环，并且1.8后加入红黑树性能有提升。

https://blog.csdn.net/littlehaes/article/details/105241194

### [put插入数据流程](http://xiaofei.site:10082/#/面试/面试题?id=put插入数据流程)

向map插入数据时获得**key的hash与数组长度-1进行与运算**【(n-1)\&hash】。找到数组中的位置后，如果数组中**没有元素，则直接存入**，有元素则**判断key是否相同**，**相同则覆盖**，**不相同则插入到链表的尾部**，**如果链表长度超过8并且数据长度超过64，则会转换成红黑树**（CRUD操作的时间复杂度都为O(log n)），最后判断数组长度是否超过**默认长度（16）\* 负载因子（0.75）**，超过则进行扩容。

### [get查询数据](http://xiaofei.site:10082/#/面试/面试题?id=get查询数据)

首先计算hash值，去数组查询，是红黑树就去红黑树查，链表就遍历链表查询

### [resize扩容过程](http://xiaofei.site:10082/#/面试/面试题?id=resize扩容过程)

对key重新计算hash，把数据拷贝到新的数组

## HashMap默认16，负载因子0.75 ，每次到12，就扩容了，那剩下4个元素不是浪费了吗，为什么

[为什么 Java 中 HashMap 的默认负载因子是 0.75？ - 面试鸭 - 程序员求职面试刷题神器](https://www.mianshiya.com/question/1780933294758588418)

负载因子过高，导致剩余利用空间不足，导致hash冲突过多，导致查找，插入，删除的效率降低

负载因子过低，导致空间利用不足

## hash冲突除了通过链表这种拉链法形式解决有了解过其它的方案吗

[什么是 Hash 碰撞？怎么解决哈希碰撞？ - 面试鸭 - 程序员求职面试刷题神器](https://www.mianshiya.com/question/1821481519536611330)

**开放寻址**

寻找下一个空闲位置

线性探查（寻找下一个连续槽位）、平方探查（类似线性探查，步长为二次方，减少聚焦问题）、双散列（第一次决定初始位置，第二次决定探查步长）

**双重哈希**

使用多个hash函数重新计算

## 数据库隔离级别分别解决了什么问题

![image-20250318205516306](https://note-1259190304.cos.ap-chengdu.myqcloud.com/noteimage-20250318205516306.png)

[MySQL 中的事务隔离级别有哪些？ - 面试鸭 - 程序员求职面试刷题神器](https://www.mianshiya.com/question/1780933295492591617)

读未提交：脏读（读到未提交的数据）

读已提交：不可重复读（同一事务中，读取结果不同）

可重复读：幻读（数据数量变化）

串行化

MYSQL InnoDB默认：可重复读

## 聚簇索引和非聚簇索引的区别

[MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别？ - 面试鸭 - 程序员求职面试刷题神器](https://www.mianshiya.com/question/1780933295442259970)

**聚簇索引**

索引叶子节点存储的是数据行，可直接访问完整数据

每个表只能有一个聚簇索引,通常是主键索引，适合范围查询和排序

**非聚簇索引**

索引叶子节点存储的是数据行的主键和对应的索引键，需通过主键才能访问完整的数据行

每个表可以有用多个非聚簇索引，适用于快速查询特定列的数据

![image-20250318205915994](https://note-1259190304.cos.ap-chengdu.myqcloud.com/noteimage-20250318205915994.png)

## 什么时候考虑使用联合索引

**多列查询条件**：当查询中经常涉及多个列的条件时，联合索引可以显著提高查询效率

**排序和分组操作**

```sql
SELECT * FROM orders ORDER BY customer_id, order_date;
```

**范围查询和等值查询结合**

```sql
SELECT * FROM orders WHERE customer_id = 1 AND order_date BETWEEN '2024-01-01' AND '2024-12-31';
```

在这种情况下，联合索引   (customer\_id, order\_date)   可以先通过   customer\_id   快速定位到相关记录，然后在这些记录中进行范围查询

## 联合索引什么情况下会失效

范围查询

查询不满足最左匹配原则

[MySQL 索引的最左前缀匹配原则是什么？ - 面试鸭 - 程序员求职面试刷题神器](https://www.mianshiya.com/question/1780933295450648578)

## 平时怎么进行SQL优化

[MySQL 中如何进行 SQL 调优？ - 面试鸭 - 程序员求职面试刷题神器](https://www.mianshiya.com/question/1780933295521951745)

尽量避免select \*，明确指定查询字段

避免全表扫描，合理设计索引，对于经常查询的字段

联表查询，使用left join左边最好使用数量量小的，子查询in适合数据量小的，因为会先进行子查询再比对外面的表，exists适合子查询数据量大的，因为会在外层循环比对里面的表

尽量避免使用函数，比如日期函数

联合索引满足，最左匹配

左like无法利用索引

or条件两侧字段未全部索引，可能导致全表扫描

## select \* 为什么比select具体字段快

[MySQL 的覆盖索引是什么？ - 面试鸭 - 程序员求职面试刷题神器](https://www.mianshiya.com/question/1780933295454842881)

[MySQL 中的回表是什么？ - 面试鸭 - 程序员求职面试刷题神器](https://www.mianshiya.com/question/1780933295446454273)

减少回表次数，如果需要查询的字段只包含部分字段，可以只利用非聚簇索引就可以找到对应数据，而不用通过主键索引再获取到完整数据
