Java面经:小米暑期实习+秋招真题分享

秋招结束,总结了一下从寒假回来开始的实习生招聘和秋招面经,过来回馈一下牛客网。

上学期寒假回来就开始投简历,找人内推的小米,过几天后约时间面试,部门未知。

一面 1小时7分钟

上来先自我介绍,然后开始问项目

说说你最近做的一个项目吧,用到了哪些技术

然后我就说了当时做的一个网站,我做了哪些模块

你们这个网站部署了吗,网址给我,打开以后又问了哪些模块是你做的?

我就又大概讲了一些

你们这个架构用的是strust2,你能讲一下你对这个框架的理解吗?

这个我不的很懂,我大概说了一点,然后说我对Spring了解一些

那你说一下你对Spring的认识吧。

然后我说了源码里IOC容器的初始化的整个过程

那你觉得IOC最大的好处是什么呢?

我说是代码解耦合,然后说了下控制反转和依赖注入之类的

这块应该就这么多

接下来是数据库

你对sql了解怎么样?

我说我本科不是计算机的,没有学过数据库这门课,但是写一些简单的sql应该也是可以的。

那你本科是什么专业的?

我说是自动化的,然后他也没说什么

网络

然后他问那你对网络了解怎么样?

我说还可以吧

那你说说吧,你了解的网络协议相关的知识,TCP、IP的

然后我就说了TCP和UDP的区别,TCP的报文结构,三次握手过程流量控制和拥塞控制

然后他问了你知道CLOSE_WAIT这个状态吗

我说这个状态应该是四次挥手过程中的吧,他说你确定? 我说应该就是四次挥手过程中的状态的。他说那你说一下四次挥手吧,我又说了四次挥手的过程

你知道长连接与短连接吗?

当时这块我有点蒙了一时没想起来,我就问你指的是HTTP中的长连接吗?

都可以,那你就说说HTTP中的长连接吧

我就说了keep-alive相关的扯了会

然后应该就是看我的简历开始问了

我看你简历上写了了解JDK容器类库的实现,那你说说常用的吧,这里他停顿想了一会然后说讲讲HashMap吧

然后我就开始讲HashMap怎么怎么实现的。中间的一些细节说的不明白他会直接指出来问

说到红黑树的时候他问你有没有用过红黑树或者看过Java里的红黑树是怎么实现的吗?

我说没有

然后又问说哈希碰撞以后链表转为红黑树是一直就有的吗?

我说以前貌似没有,是Java8以后加进去的。

然后又问我HashMap是线程安全的吗?

我说不是,HashTable是线程安全的,但是HashMap不是,如果要线程安全要用ConcurrentHashMap,ConcurrentHashMap的源码我也简单了解过

那你说一下ConcurrentHashMap是怎么实现的吧

我又大致讲了一下,期间表达不清楚的地方他也详细的问了

最后又问,那ConcurrentHashMap就一定是线程安全的吗

我说是啊,除了获取size属性的时候是估计值而不是准确值,但是操作就是线程安全的。

那你在平时写过多线程的程序吗,写过什么

我说自己写过一点,像wait、notify之类的。

那也就是说只是自己学习过,而没有实际用过呗

我说是,实际使用就在上面说的网站的排行榜上更新的时候用到了锁。然后说了一下具体的实现

他貌似没什么兴趣,估计是觉得我实际经验太少了也没有继续问下去。

然后应该又看了看简历,又来一波

你简历上写你熟悉常见的设计模式,那你都了解哪些模式呢,实际用过什么?

我说我用的比较多的就是工厂模式和单例模式,在网站的缓存那块自己实现过

那你说说单例模式,单例模式有很多种写法吧,你用的是哪种

我说单例模式确实有很多种写法,我知道的就有5种,我用的是Enum方式是实现的,因为我看EFFECTIVE JAVA这本书上是推荐这种方法的

那你说说其他的几种写法都怎么写?

我就说了懒汉式,饿汉式和他们各自的改进,

然后说到双重检测保证线程安全的时候,他又问你确定双重检测就能保证线程安全吗?

我说对啊。

他说不对,这个也无法完全保证,在实际使用中,会有可能获取正在创建的实例还是怎么来的我没有太明白。

然后就是问算法,一共问了三道题

最大堆怎么实现

我讲了怎么筛选法建堆,不知道是不是我没表述清楚这里他问的特别细。说了很长时间

然后问我时间复杂度是多少?我说应该是nlogn吧

他说不对,实际上应该是O(n)。通过数学证明是可以证出来的。后来又补充说你按照算法的思路分析出nlogn是没错的,但是如果通过数学证明,应该是O(n)的。

然后我恍然大悟的样子说好像以前在算法课上是学过这个证明,但是具体的忘记了。他也没说什么,就像上面告诉我单例模式那块一样,就像讨论问题一样告诉我了,感觉面试官还是很好的。

在一个数组中,统计出现频率最高的元素

这题也是答的最失败的地方,可能是有点大意了,因为编程之美上有类似的题,leetcode上也有原题,但是有一个前提条件是频率最高的元素超过一半。

我忘记了他有没有加这个条件,我说了摩尔投票法找出频率最高的,然后再判断这个频率是不是超过数组一半了。然后他举出反例说你这样有问题啊,比如我给你个数组1,2,1,2,1,2,3,3.那么你返回的数字就是3了,明显不对啊。

这时候我有点懵逼了,但是其实是他偷换了概念,因为他出的题就是返回超过一半的元素,所以如果是他给的这个数组,那么就是不存在超过一半的元素,返回null就可以了。但是我完全懵逼,和他争论了一会以后就放弃了。

最后一道题是把字符串转换成int型。

我说了自己是思路,感觉这题主要考察的就是边界条件。

后来又延伸了一下说如果转换成16进制的呢?我想了一下说那就把乘10改成乘16,他说对这样没问题。

然后就完事了。

总结

面试官很和蔼,大部分情况下都是自己知道什么就讲什么,遇到细节会提问,所以在回答的时候引导话题很重要,自己知道什么就一定要往那上面引导,不知道什么也要往知道的上面引导,面试官一般不会纠结一个知识点,而是看你对了解的知识点到底掌握到什么程度

在具体的知识点上被提出了几点问题:

 - 单例模式的双重检测其实也并不能保证线程安全

 - ConcurrentHashMap的线程安全性是有局限性的

 - 建堆有两种方法,自顶像下建堆也就是像堆排序那样的时间复杂度是nlogn,而如果采用筛选法建堆,那么时间复杂度应该是O(n),而不是nlogn

最后我问面试官表现如何在哪些方面还需要提高呢?他的原话是:基础知识很好,注重细节,加强实战经验

这次面试虽然范围很广且时间很长,但仔细回想一下其实也并没有很难,问的问题确实都是必须要掌握的

关于那个算法题,我后来还是发短信给面试官解释说我当时的算法并没有错,快10点的时候回复我和我讨论了一会最后应该是被我说服了或者不耐烦了,说没问题让我再想想有没有更好的方法。我说不好意思因为一道题打扰这么久。它说没事,做技术就需要你这种精神。

之后就没有任何通知了


以上是实习生招聘。在北京实习的时候又找人内推了小米,打电话约到现场面试,MIUI部门

一面

自我介绍

Java中的集合类有哪些了解呢?

垃圾回收机制

项目中用到过哪些缓存?

数据库联合表

linux了解怎么样。各个用户之间的权限了解吗

手写代码:求两个链表相交。

提示;链表可能有环。需要考虑几种情况。

二面

类加载机制

新建线程的方式,有什么区别

Thread的run方法和start方法的区别是什么

怎么关闭线程

对线程安全是怎样理解的

项目中提到反射技术,反射在哪些情况是获取不到参数的呢?

写sql,获取一列中最大的数。

数据库建立索引的原则有哪些?

先写个简单的代码:不用额外空间交换AB的值

手写代码:顺时针打印矩阵

三面

写个代码,括号匹配。

写好之后,改一下,如果能匹配的不止大括号小括号,还有自己定义的符号呢

写好之后,再改一下,如果括号之间有优先级呢

写好之后,再改一下,如果加一个限制,相同的括号不能超过指定数目呢?

再写的代码,m*n的矩阵,从左上角到右下角一共有多少种走法,每次只能向右或者向下走

再来个问题,MIUI每次用户升级都会有一个打点信息,包括:用户id,原来的版本,升级到的版本,升级的时间等等。要求是,我需要频繁统计出:1.某个用户所有的升级记录。2.指定一段时间内从某个版本升级到某个版本最多的。3. 某个版本的所有用户

针对这个情况,给出合理的存储和解决方案。

总结

前两面都是女面试官,三面是男的,这样的配置还是第一次遇见

每次面试都50分钟左右

三面都要手写代码,一面基础知识多一些,二面更加深入,三面感觉是看代码风格,扩展性和系统设计经验。

中午没睡觉连续面了三面,感觉有点累,回去就发烧了。小米,为发烧而生。

过了大概两周通知面试通过,不用再参加校招了。


作者:paine1690

本文来源于牛客网

——————————

牛客网(www.nowcoder.com)

- 互联网名企笔试真题

- 校招求职笔经&面经

- 程序员求职实习信息

- 程序员学习交流社区

你可能感兴趣的:(Java面经:小米暑期实习+秋招真题分享)