小米面经(已完结)



小米面经(已完结)
小米集团是一家以智能手机、智能硬件和 IoT 平台为核心的消费电子及智能制造公司,也
是目前全球领先的智能手机品牌之一。2024 年,小米汽车宣布造车成功,意味着小米从
此也是一家车企了。
秋招薪资
24 届秋招薪资一览表
1712622550418-c63d4fbd-3001-43fa-bc80-b3fc7edeba26.png
同学 E(附答案)
之前有两位球友一起去了小米,这是其中一位球友的面经,面试题问的还是非常经典的,
有球友的参考答案,大部分也都可以从面渣逆袭中找到答案,给大家参考一下。
小米第一个部门
1.一面
●过来的时候面试官让我做了一道算法题,然后让我讲了一下思路,这个算法题我觉得大
家应该都非常熟悉:三数之和为 0
●你了解类的加载机制吗?(双亲委派开始吟唱)
●那你知道类的热更新的?(类的热部署,重写类的加载方式,监听类文件,每次类文件
修改的时候重新加载类)
●你对 redis 了解多少,说说常见的数据结构和应用场景
●你知道 redis 的 zset 底层实现吗(这个我说了一下 zset 是由哈希表和跳表共同实现的,
哈希表单值检索效率高,跳表范围查询效率高)
●为什么 hash 表范围查询效率比跳表低
●你说跳表是基于双向链表实现的,那跳表为什么要用双向链表不用单向呢(这里卡了很
久很久,我一直强调双向链表逆向排序查询的时候更方便,然后修改一个节点的时候也更
方便,但是面试官一直说做范围查询你用单向链表不就行了吗?我说逆序排序查找的时候
更快,但面试官不对就卡在这里了,然后我说不太清楚就下一题了)
●你了解那些集合?(我说主要是 List 和 Map 大类)
●说说 List 里面各种类的对比(LinkedList ArrayList Vector 对比我都说了一遍)
●说说 HashMap 的扩容机制(达到负载阈值的时候会以两倍扩容,然后说了一下 1.7 和
1.8 扩容的对比,1.8 做的优化)
●1.8 扩容具体实现(我说只需要对比你原先 hash 表长度进行位运算,如果为 1 则扩容的
位置+这个长度,如果为 0 则位置不变)
●那你说说扩容的时候每个节点都要进行位运算吗,如果我这个 hashmap 里面有几十万
条数据,都要进行位运算吗?(这里我很懵逼,我记得当时看源码的时候确实会沿着链表
遍历每一个节点然后进行位运算,我就开始犹豫了,但最后还是说会对每一位进行位运
算,然后提了一下 Concurrenthashmap 扩容的时候进行多线程扩容,hashmap 的优化机
制不太清楚)
●你知道 redis 的一致性 hash 吗(当时听的时候有点懵逼,没有听过这个名词,然后就说
了一下分片集群的 hash 曹运算,还有 hash 轮机制)
●那你临时增加一个 redis 节点,数据如何迁移呢(我不太清楚就没有回答了)
详细答案:传送门
2.二面
●前面一直问我项目相关的问题,还有技术选型(我项目中用了 minio 和 protobuf 然后说
了一下它们的特性)
●如何通过 mysql 定位哪条增删改查语句拖慢了整个系统(一开始说了慢日志,被否定
了,我就懵逼了?然后就被成功带偏了,面试在这里卡了很久)
●你的项目并发量高吗(我说数据量比较大,然后说了用 countdown 和线程池完成 mysql
数据向 es 的迁移)
●10 亿个 url 里面找到频率最高的前 100 个
小米第二个部门
1.一面
●前面一直在描述项目的事情
●你封装过 springboot starter 吗(我的项目封装过然后将项目业务)
●看你项目里面用到了 dubbo 和 gateaway 你阅读过源码(没有)
●你平时用到的数据库(mysql)
●说一说 mysql 索引的底层机制(我说了 B 树、B+树、hash 还有三大引擎对比和扩展)
●为什么需要索引(空间换时间,举了个例子就是书本的目录和具体页数的关系)
●什么时候需要索引(where group by order by 经常使用的字段、还有字段属性唯一的字
段,后面还扩展说了一下什么时候不需要索引,比如数据量小的时候、经常更改的数据、
where group by order by 都没用上的字段……)
●spring 的隔离机制(数据库四大隔离级别吟唱)
●默认是哪一种(可重复读,然后我补充说了底层的实现原理,mvcc :readview 还有日
志机制)
●你有没有看过哪些框架的源码(我说看过数据库的,有用 java 实现一个简单的数据
库,这个思路是 mydb 项目带来的,然后说了一点我知道的)
●代码题 链表删除重复元素
详细答案:传送门
2.二面
●看你项目使用的 xxl job 你看过源码吗(这个我说没看过,但是我把 xxl job 的执行流程
说了一遍)
●你看过那些分布式组件的源码比如 dubbo springcloud 组件之类的(看过 nacos 的)
●为什么要看 nacos 的(因为自己项目有使用过就了解一下)
●nacos 的服务注册流程
●nacos 的服务实列是如何实现的(有临时实列和持久化实例)
●nacos 服务实例如何存储的(有缓存机制)
●看你项目用到了 dubbo 为什么不看 dubbo 源码(平时能够真正接触到的分布式业务和
环境很少,看的源码主要是使用的比较多的框架比如 mybatis 和 springboot)
●gateaway 的源码看过吗
●后续就展开了一系列话题但是主要围绕着两个点
●我为什么要录取你
●你为什么选择小米(这里我表达出了非常强烈进入小米的意愿,真情实感,我实验室的
人还有面试官基本都能看出来我很想进小米)
面试过程其实有很多可以拓展回答,不太会的问题你也可以尝试说一些自己会的来拉扯一
下面试官
同学 F
详细答案:https://mp.weixin.qq.com/s/OELA0PVm-nPGOf-CsTWmCg
小米的三面感觉都不太难,实际场景题问的多一些,聊的都很愉快,而且三面感觉是一个
领导大佬,会聊的较深,第三面的表现不是很好。以下是根据回忆的面试题(乱序):
Java
1、HashMap 的八股(底层,链表/红黑树转换原因),
2、HashTable 和 ConcurrentHashMap 的底层实现
3、ArrayList 和 LinkedList 的区别和使用场景(简单的问题反而被提到是亮点回答,所以
说不起眼的知识点也很重要)
4、线程池的参数及创建线程的方式
5、volatile 保证了什么(问了具体的内存屏障),volatile 加在基本类型和对象上的区别
6、synchronized 和 ReentrantLock 区别和场景
7、垃圾回收的算法及详细介绍
8、反射的介绍与使用场景
9、两种动态代理的区别
10、SpringBoot 和 Spring 的区别,自动装配的原理
11、SpringCloudAlibaba 的组件介绍