2017 年小米春招内推面试面经

fanfh_open 7年前
   <p>首先,我感到很讶异的是,在我投完简历一天后(2017年2月 23日),小米的工作人员就打电话给我,并且敲定了电话面试的日期(2017年2月27日)。当时我还在家里享受着寒假呢,这也许是来自东北某末流985的优势吧2333。</p>    <p>在等待面试的这几天中,我感到非常惶恐,毕竟我始终没有料到小米会这么早让我面试(宝宝的内心是崩溃的,我还没准备好!)于是乎我开始恶补Java知识(我面的是Java后端开发)以及牛客网上刷<<剑指offer>>编程题。PS:强烈建议大家去牛客网上刷题哦,很有用!</p>    <p>面试当天,我既紧张又期待,抱着试一试的心态,终于等来了面试官的电话。他让我准备好一台电脑(用来现场撸代码),然后让我打开一个指定的网址。由于我当时还在实验室里,于是我专门找了一个人少的地方进行面试,生怕吵到同学(其实是怕出丑)。</p>    <p>首先开始一面。一上来,还是依旧自我介绍,说实话,我原先并没有准备这个环节,所以讲的非常仓促,没有条理(我自己都不知道在讲什么 ,大概是 自己的基本信息以及学习过的编程语言)。下面我整理一下面试官问的问题:</p>    <p>1、说说你对java的认识?</p>    <p>2、对java了解哪些?</p>    <p>3、说说java集合类?</p>    <p>ANSWER:</p>    <p>4、说说Java多线程的内容?(同步机制等)</p>    <p>其中第三个问题,他又延伸开来,问了我:</p>    <p>①TreeMap与HashMap区别?实现原理?</p>    <p>②List的实现原理?</p>    <p>③ArrayList初始化的默认长度?ArrayList的长度是固定的吗?其实现的原理是什么?</p>    <p>ArrayList的底层是由一个Object[]数组构成的, 而这个Object[]数组,默认的长度是10 。</p>    <pre>  <code class="language-java">ArrayList<String> al = new ArrayList<String>();</code></pre>    <p>如果直接打印al.size()当然是0,size()方法,因为10指的是“逻辑”长度。 所谓“逻辑”长度,是指内存已存在的“实际元素的长度” 而“空元素不被计算“;即:当你利用add()方法,向ArrayList内添加一个“元素”时, 逻辑长度就增加1位。 而剩下的9个空元素不被计算。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/fdb603d670ca4f500442da32c3f5090a.png"></p>    <p>下面是ArrayList的部分源代码:</p>    <pre>  <code class="language-java"><pre name="code" class="html"> public ArrayList()      {        this(10);      }</code></pre>    <p>java自动增加ArrayList大小的思路是:向ArrayList添加对象时,原对象数目加1如果大于原底层数组的长度,则以适当长度新建一个原数组的拷贝,并修改原数组,指向这个新建数组。原数组自动抛弃(java垃圾回收机制自动回收)。size则在向数组添加对象,自增1。</p>    <p>第四个问题,他也有延伸开来,问了我:</p>    <p>①synchronize关键字的相关内容;</p>    <p>② <a href="/misc/goto?guid=4959739474590172999" rel="nofollow,noindex">volatile关键字的相关内容</a> ;</p>    <p>问完这些问题,就开始了最为残忍的现场撸代码环节:(首先问了我对于排序算法了解吗?)</p>    <p>1、二分查找</p>    <pre>  <code class="language-java">/**   * Created by HuangQinJian on 2017/2/27.   */  public class main {      public static int sort(int da[], int a) {          int len = da.length;          int left = 0, right = len - 1;          int mid = 0;          while (left <= right) {              mid = (left + right) / 2;              if (a < da[mid]) {                  right = mid - 1;              } else if (a > da[mid]) {                  left = mid + 1;              } else {                  return mid;              }          }          return -1;      }        public static void main(String[] args) {          int a[] = {1, 2, 6, 87, 456, 899};          int result = sort(a, 899);          System.out.println(result);      }  }</code></pre>    <p>2、冒泡排序</p>    <p>3、快速排序(算法复杂度)</p>    <p>4、给一个无序数组int[] nums 和一个整数 target,在这个数组中找到两个数 ,使得这个两个数的和等于target,找到这个数组中所有的满足这样条件的数。</p>    <p>附上现场截屏图片:(图中代码请忽略,应该有错)</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/3368afb753c5e95ba846f3e511f17d7c.png"></p>    <p>代码写完以后,面试官跟我说一面到此结束,待会会由他的同事对我进行二面。</p>    <p>然后,此时我的内心是奔溃的,竟然还有二面!竟然这么快就二面了!</p>    <p>大概过了半小时后(煎熬的等待),又一个电话打来,说是对我进行二面(讲道理,我此时没有那么紧张)。开始照样是自我介绍,还是无厘头的自我介绍,不过跟第一次的自我介绍讲的内容完全不同,不要问我是怎么做到的,我自己也不知道!</p>    <p>然后,他的第一个问题问的是关于我项目的一些内容,这我就不详细介绍了,毕竟每个人的项目经历都是不一样的。(不过,我想说,项目经历很重要!!大概是关于Spring+SpringMVC+Mybatis的)</p>    <p>关于面试中问到的SSM框架的工作原理:</p>    <p><strong>Spring</strong></p>    <p>Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。</p>    <p>Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地 new 一个对象,而是让Spring框架帮你来完成这一切。</p>    <p><strong>SpringMVC</strong> SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller,Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。</p>    <p><strong>Mybatis</strong> Mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。</p>    <p>SSM框架的Web程序主要用到了三个技术:</p>    <p>Spring:用到了注解和自动装配,就是Spring的两个精髓IOC(反向控制)和 AOP(面向切面编程)。</p>    <p>SpringMVC:用到了MVC模型,将逻辑代码放到Controller层处理。</p>    <p>Mybatis:用到了与数据库打交道的层面,放在所有的逻辑之后,处理与数据库的CRUD相关的操作。</p>    <p>要完成一个功能:</p>    <p>1、先写实体类entity,定义对象的属性,(可以参照数据库中表的字段来设置,数据库的设计应该在所有编码开始之前)。</p>    <p>2、写Mapper.xml(Mybatis),其中定义你的功能,对应要对数据库进行的那些操作,比如 insert、selectAll、selectByKey、delete、update等。</p>    <p>3、写Mapper.java,将Mapper.xml中的操作按照id映射成Java函数。</p>    <p>4、写Service.java,为控制层提供服务,接受控制层的参数,完成相应的功能,并返回给控制层。</p>    <p>5、写Controller.java,连接页面请求和服务层,获取页面请求的参数,通过自动装配,映射不同的URL到相应的处理函数,并获取参数,对参数进行处理,之后传给服务层。</p>    <p>6、写JSP页面调用,请求哪些参数,需要获取什么数据。</p>    <p>接着,他就开始问我一些关于数据库方面的问题:</p>    <p>1、对于数据库事务的了解?——— <a href="/misc/goto?guid=4959739474676996430" rel="nofollow,noindex">数据库事务的四大特性以及事务的隔离级别</a></p>    <p>2、介绍一下数据库范式?——— <a href="/misc/goto?guid=4959739474765953013" rel="nofollow,noindex">关于SQL数据库中的范式</a></p>    <p>3、重载与重写的区别?——— <a href="/misc/goto?guid=4959739474851262229" rel="nofollow,noindex">重载、重写(覆盖)的区别实例分析</a></p>    <p>4、数据库优化?——— <a href="/misc/goto?guid=4959739474933034033" rel="nofollow,noindex">SQL 优化经验总结34条</a></p>    <p>最后,终于机会反转,他问我有什么想问的问题,我大概问了几个问题(关于技术以及一些琐碎的东西)。最后的最后,他让我等通知,我估计是黄了。</p>    <p>漏了一点,他还我问了我能实习多久(感觉他很在意这个),刚开始还问我有没有实习经历(我也很绝望啊,我才大三啊,我哪来的实习机会!)</p>    <p> </p>    <p>来自:http://blog.csdn.net/sinat_35512245/article/details/58209966</p>    <p> </p>