2017 年小米春招內推面試面經
首先,我感到很訝異的是,在我投完簡歷一天后(2017年2月 23日),小米的工作人員就打電話給我,并且敲定了電話面試的日期(2017年2月27日)。當時我還在家里享受著寒假呢,這也許是來自東北某末流985的優勢吧2333。
在等待面試的這幾天中,我感到非常惶恐,畢竟我始終沒有料到小米會這么早讓我面試(寶寶的內心是崩潰的,我還沒準備好!)于是乎我開始惡補Java知識(我面的是Java后端開發)以及牛客網上刷<<劍指offer>>編程題。PS:強烈建議大家去牛客網上刷題哦,很有用!
面試當天,我既緊張又期待,抱著試一試的心態,終于等來了面試官的電話。他讓我準備好一臺電腦(用來現場擼代碼),然后讓我打開一個指定的網址。由于我當時還在實驗室里,于是我專門找了一個人少的地方進行面試,生怕吵到同學(其實是怕出丑)。
首先開始一面。一上來,還是依舊自我介紹,說實話,我原先并沒有準備這個環節,所以講的非常倉促,沒有條理(我自己都不知道在講什么 ,大概是 自己的基本信息以及學習過的編程語言)。下面我整理一下面試官問的問題:
1、說說你對java的認識?
2、對java了解哪些?
3、說說java集合類?
ANSWER:
4、說說Java多線程的內容?(同步機制等)
其中第三個問題,他又延伸開來,問了我:
①TreeMap與HashMap區別?實現原理?
②List的實現原理?
③ArrayList初始化的默認長度?ArrayList的長度是固定的嗎?其實現的原理是什么?
ArrayList的底層是由一個Object[]數組構成的, 而這個Object[]數組,默認的長度是10 。
ArrayList<String> al = new ArrayList<String>();
如果直接打印al.size()當然是0,size()方法,因為10指的是“邏輯”長度。 所謂“邏輯”長度,是指內存已存在的“實際元素的長度” 而“空元素不被計算“;即:當你利用add()方法,向ArrayList內添加一個“元素”時, 邏輯長度就增加1位。 而剩下的9個空元素不被計算。
下面是ArrayList的部分源代碼:
<pre name="code" class="html"> public ArrayList()
{
this(10);
}
java自動增加ArrayList大小的思路是:向ArrayList添加對象時,原對象數目加1如果大于原底層數組的長度,則以適當長度新建一個原數組的拷貝,并修改原數組,指向這個新建數組。原數組自動拋棄(java垃圾回收機制自動回收)。size則在向數組添加對象,自增1。
第四個問題,他也有延伸開來,問了我:
①synchronize關鍵字的相關內容;
② volatile關鍵字的相關內容 ;
問完這些問題,就開始了最為殘忍的現場擼代碼環節:(首先問了我對于排序算法了解嗎?)
1、二分查找
/**
* 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);
}
}
2、冒泡排序
3、快速排序(算法復雜度)
4、給一個無序數組int[] nums 和一個整數 target,在這個數組中找到兩個數 ,使得這個兩個數的和等于target,找到這個數組中所有的滿足這樣條件的數。
附上現場截屏圖片:(圖中代碼請忽略,應該有錯)
代碼寫完以后,面試官跟我說一面到此結束,待會會由他的同事對我進行二面。
然后,此時我的內心是奔潰的,竟然還有二面!竟然這么快就二面了!
大概過了半小時后(煎熬的等待),又一個電話打來,說是對我進行二面(講道理,我此時沒有那么緊張)。開始照樣是自我介紹,還是無厘頭的自我介紹,不過跟第一次的自我介紹講的內容完全不同,不要問我是怎么做到的,我自己也不知道!
然后,他的第一個問題問的是關于我項目的一些內容,這我就不詳細介紹了,畢竟每個人的項目經歷都是不一樣的。(不過,我想說,項目經歷很重要!!大概是關于Spring+SpringMVC+Mybatis的)
關于面試中問到的SSM框架的工作原理:
Spring
Spring就像是整個項目中裝配bean的大工廠,在配置文件中可以指定使用特定的參數去調用實體類的構造方法來實例化對象。
Spring的核心思想是IoC(控制反轉),即不再需要程序員去顯式地 new 一個對象,而是讓Spring框架幫你來完成這一切。
SpringMVC SpringMVC在項目中攔截用戶請求,它的核心Servlet即DispatcherServlet承擔中介或是前臺這樣的職責,將用戶請求通過HandlerMapping去匹配Controller,Controller就是具體對應請求所執行的操作。SpringMVC相當于SSH框架中struts。
Mybatis Mybatis是對jdbc的封裝,它讓數據庫底層操作變的透明。mybatis的操作都是圍繞一個sqlSessionFactory實例展開的。mybatis通過配置文件關聯到各實體類的Mapper文件,Mapper文件中配置了每個類對數據庫所需進行的sql語句映射。在每次與數據庫交互時,通過sqlSessionFactory拿到一個sqlSession,再執行sql命令。
SSM框架的Web程序主要用到了三個技術:
Spring:用到了注解和自動裝配,就是Spring的兩個精髓IOC(反向控制)和 AOP(面向切面編程)。
SpringMVC:用到了MVC模型,將邏輯代碼放到Controller層處理。
Mybatis:用到了與數據庫打交道的層面,放在所有的邏輯之后,處理與數據庫的CRUD相關的操作。
要完成一個功能:
1、先寫實體類entity,定義對象的屬性,(可以參照數據庫中表的字段來設置,數據庫的設計應該在所有編碼開始之前)。
2、寫Mapper.xml(Mybatis),其中定義你的功能,對應要對數據庫進行的那些操作,比如 insert、selectAll、selectByKey、delete、update等。
3、寫Mapper.java,將Mapper.xml中的操作按照id映射成Java函數。
4、寫Service.java,為控制層提供服務,接受控制層的參數,完成相應的功能,并返回給控制層。
5、寫Controller.java,連接頁面請求和服務層,獲取頁面請求的參數,通過自動裝配,映射不同的URL到相應的處理函數,并獲取參數,對參數進行處理,之后傳給服務層。
6、寫JSP頁面調用,請求哪些參數,需要獲取什么數據。
接著,他就開始問我一些關于數據庫方面的問題:
1、對于數據庫事務的了解?——— 數據庫事務的四大特性以及事務的隔離級別
2、介紹一下數據庫范式?——— 關于SQL數據庫中的范式
3、重載與重寫的區別?——— 重載、重寫(覆蓋)的區別實例分析
4、數據庫優化?——— SQL 優化經驗總結34條
最后,終于機會反轉,他問我有什么想問的問題,我大概問了幾個問題(關于技術以及一些瑣碎的東西)。最后的最后,他讓我等通知,我估計是黃了。
漏了一點,他還我問了我能實習多久(感覺他很在意這個),剛開始還問我有沒有實習經歷(我也很絕望啊,我才大三啊,我哪來的實習機會!)
來自:http://blog.csdn.net/sinat_35512245/article/details/58209966