电竞比分网-中国电竞赛事及体育赛事平台

分享

這里有一份面經(jīng),請查收(1)

 勇敢走不回頭 2016-08-06


來源: 伯樂在線專欄作者 - 朱小廝 

鏈接:http://blog./103105/

點擊 → 了解如何加入專欄作者


博主畢業(yè)快滿三年了,由于種種原因想換一份工作。學了 7 年計算機技術,在目前的行業(yè)用到的技術不多,還是想去尋找一份互聯(lián)網(wǎng)行業(yè)的工作,這樣更能學以致用發(fā)揮自己的特長。從上次更新博客到現(xiàn)在已經(jīng)三周左右了,這三周博客基本斷更了,現(xiàn)在找工作也基本收尾了,來聊一聊我所遇到的一些面試經(jīng)歷,希望給各位尋求新機會的小伙伴一個參考??偣裁嫱?8 家收了 7 個 offer,應該算是比較成功的吧。博文中主要還是聊一下技術相關的,博文中所涉及的公司均以代號標志,不便透露細節(jié)。


第一家面試的公司是一家互聯(lián)網(wǎng)創(chuàng)業(yè)公司,這里簡稱 D,博主對這家公司的印象還是不錯的,共面試了 5 輪,筆試一輪,技術面 3 輪,最后一輪是 HR 面。雖然公司總共員工只有小幾百人,但是做事比較專業(yè),很多大型的成熟公司也未必做得更好。


首先說說筆試,很多一些小的公司,就是從網(wǎng)上題庫中拉點選擇題讓你做做,之后的面試和筆試題無關,這里我遇到的筆試題是和第一輪技術面相關的,有點小套路。


筆試題


據(jù)博主的回憶,共有這么些題(都是簡答題):


1. 寫出 java 中 synchronized 的使用方式。

可以參考:Java 多線程知識小抄集 (一)


2. Java 中設置最大堆和最小堆內(nèi)存的參數(shù)是什么?

-Xmx -Xms


3. volatile 的作用?

兩點:內(nèi)存可見性;防止指令重排序;


4. 寫一個二分查找算法


5. 寫一個你熟悉的設計模式,畫出 UML 圖,說出此模式的作用以及寫出此模式的主要方法。


6. 一道設計題。(略)


7. BeanFactory 和 ApplicationContext 的區(qū)別。(Sping 的容器可以分為兩種類型 :1. BeanFactory:(org.springframework.beans.factory.BeanFactory 接口定義)是最簡答的容器,提供了基本的 DI 支持。最常用的 BeanFactory 實現(xiàn)就是 XmlBeanFactory 類,它根據(jù) XML 文件中的定義加載 beans,該容器從 XML 文件讀取配置元數(shù)據(jù)并用它去創(chuàng)建一個完全配置的系統(tǒng)或應用。 2. ApplicationContext 應用上下文:org.springframework.context.ApplicationContext)基于 BeanFactory 之上構建,并提供面向應用的服務。)


(第 4,5 題在下面會解釋)


第一輪技術面


主要根據(jù)簡歷以及筆試題進行論述。


先將筆試題,首先是寫出一個熟悉的設計模式,那當然寫個單例咯,這個最簡單嘛,主要是 UML 圖也特別好畫。詳細可以參考設計模式:單例模式(Singleton)。博主寫的是內(nèi)部類的寫法:


public class LazyInitHolderSingleton {  

    private LazyInitHolderSingleton() {  

    }  

 

    private static class SingletonHolder {  

            private static final LazyInitHolderSingleton INSTANCE = new LazyInitHolderSingleton();  

    }  

 

    public static LazyInitHolderSingleton getInstance() {  

            return SingletonHolder.INSTANCE;  

    }  

}  


這種寫法是懶漢式線程安全的寫法。


面試官問到一個問題:為什么這種寫法是線程安全的?


那么這里就設計到一個 JVM 加載的知識:JVM 內(nèi)部機制可以保證在執(zhí)行類構造器 () 方法的時候是線程安全的,詳細可以參考博文: Java 虛擬機類加載機制。


這里博主還特意說了虛擬機規(guī)范嚴格規(guī)定了有且只有 5 種情況(JDK7)必須對類進行初始化 (執(zhí)行類構造器 () 方法):


  1. 遇到 new,getstatic,putstatic,invokestatic 這失調(diào)字節(jié)碼指令時,如果類沒有進行過初始化,則需要先觸發(fā)其初始化。生成這 4 條指令的最常見的 Java 代碼場景是:使用 new 關鍵字實例化對象的時候、讀取或設置一個類的靜態(tài)字段(被 final 修飾、已在編譯器把結果放入常量池的靜態(tài)字段除外)的時候,以及調(diào)用一個類的靜態(tài)方法的時候。

  2. 使用 java.lang.reflect 包的方法對類進行反射調(diào)用的時候,如果類沒有進行過初始化,則需要先觸發(fā)其初始化。

  3. 當初始化一個類的時候,如果發(fā)現(xiàn)其父類還沒有進行過初始化,則需要先觸發(fā)其父類的初始化。

  4. 當虛擬機啟動時,用戶需要指定一個要執(zhí)行的主類(包含 main() 方法的那個類),虛擬機會先初始化這個主類。

  5. 當使用 jdk1.7 動態(tài)語言支持時,如果一個 java.lang.invoke.MethodHandle 實例最后的解析結果 REF_getstatic,REF_putstatic,REF_invokeStatic 的方法句柄,并且這個方法句柄所對應的類沒有進行初始化,則需要先出觸發(fā)其初始化。


尤其是第 5 點,是個特別偏冷的知識點,當你記住這個的時候,可以給面試官留下一個很好的印象。在后面的博文中會經(jīng)常涉及這種冷知識,可以讓你的面試過程添加幾處亮點。


下面就是要說明一下的二分查找法(首先確保被排序的數(shù)組有序),這里有兩種寫法:遞歸和非遞歸的寫法。博主憋了一個遞歸的算法,不過最好還是用非遞歸的寫法。二分查找法還是很容易的,關鍵這里引申出了變種算法,譬如:給你一個 key,找出這個數(shù)組中最左邊的 key,或者最右邊的 key。當然還有其他變種算法,有興趣的朋友可以自行查找相關資料。


接下去就根據(jù)簡歷聊一聊項目和 Java 基礎了。下面稍微列舉一些問題:


  1. Memcached 和 Redis 的區(qū)別? 參考:Redis 和 Memcached 的區(qū)別


  2. ActiveMQ 的集群配置方式有哪些?(基于共享文件,基于數(shù)據(jù)庫,基于 Zookeeper 等)


  3. Mybatis 的一些知識點。(略)


  4. 虛擬機的類加載機制。(加載 - 驗證 - 準備 - 解析 - 初始化,詳細可以參考 Java 虛擬機類加載機制)


  5. 內(nèi)部類相關知識點。


  6. 面向?qū)ο蟮脑O計原則?參考:面向?qū)ο蟮脑O計原則


  7. Spring Aop 的原理?動態(tài)代理。


  8. Spring 常用的注解?


  9. NIO 的相關。參考:攻破 JAVA NIO 技術壁壘


  10. 數(shù)據(jù)庫優(yōu)化相關。(博主基本不直接接觸數(shù)據(jù)庫,so 遇到此類問題直接 say: I don’t know. 有興趣的小伙伴可以自行查閱一些資料,譬如數(shù)據(jù)訪問優(yōu)化漏斗法則。)


  11. linux 下查看文件有哪些方式?cat tac head tail more less nl vim vi gvim


技術面二面


約好的 10:00 電面,11:30 也沒來,后來咨詢了 HR 才說面試官出差去了。。。好吧,畢竟公司還在創(chuàng)業(yè)初期,管理上有疏忽可以理解。第二次約的 2 面同樣是 10:00,這次是 10:27 來的電話。額。。。這此的面試官好像是 CTO,面的也比較深一些:


1. 談談你對 HashMap 的理解,怎么樣去保證線程安全?


博主對 HashMap 巴拉巴拉的一陣,可以參考:Java 集合框架:HashMap. 然后有三種方法可以保證 hashMap 的線程安全:換成 HashTable;用 synchronizedMap 包裝一下 HashMap; 換成 ConcurrentHashMap。然后補了一句 ConcurrentHashMap 是比較推崇的,然后就被問了另一個問題:說一下 ConcurrentHashMap 的實現(xiàn)原理。然后解釋了一下,最后問了個問題:用 HashMap 怎么去實現(xiàn) ConcurrentHashMap?當時想了一個,覺得不 okay,想說第二個方案就被制止了?,F(xiàn)在想想:把 HashMap 用 Collections.synchronizedMap() 包裝一下替換屌 Segment 即可。(如果不知所云,請閱讀一下 ConcurrentHashMap 的源碼先~~)


補充:這里還問了平常用了那些線程安全的隊列,包括:ConcurrentLinkedQueue, ConcurrentLinkedDeque 以及 BlockingQueue 系列。


2.Java 集合中有哪些常用的類?ArrayList 的上級(父類或者接口)是什么,HashMap 的上級又是什么?


常用的類:Map 系(HashMap,LinkedHashMap,TreeMap, WeakHashMap, EnumMap 等);List 系(ArrayList, LinkedList, Vector, Stack 等);Set 系(HashSet, LinkedHashSet, TreeSet); 工具類(Collections,Arrays)。這里如果說出來了,就必須對其十分了解,比如博主在另一家互聯(lián)網(wǎng)公司 W 的面試過程中就被問到:你對 java 集合了解有多少?博主說:我看過所有集合的源碼。然后就被問到:Collections.sort() 里面的實現(xiàn)是什么排序算法?這個問題確實夠冷門的!幸虧看過,不然就被打臉了。。(TimSort, 加強型歸并排序)

ArrayList extends AbstractList implements List, RandomAccess, Cloneable, Serializable. 然后 AbstractList 又繼承了 AbstractCollection. 然后 List 和 AbstractCollection 又都 implements 了 Collection.


HashMap extends AbstractMap implements Map, Cloneable, Serializable.


3.css 導入方式?


這個只要 2 周不沒看過就會忘記。。博主當時就忘記了。。超簡單的題,但是又是最不起眼的題,細節(jié)做的不夠好。


'stylesheet' type='text/css' href='css/head.css' />



4.js 中的 ajax 操作的方式?這個寫的太多了,所以答起來很 easy


5. 一句話概括 NIO。博主說了一通,包括 Reactor 模式神馬的。但是面試官說:你說的也很對,但是不是我想要的結果。斯巴達。。。


6. 設計數(shù)據(jù)庫的一道題,比較簡單,不贅述。


7. 常用的 linux 命令?(這個被用了好多次了)


cat tac head tail more less nl vim vi gvim

date cal man shutdown poweroff reboot echo

uname -r; mount; unmount; exit

cd ls pwd mkdir cp scp rm mv

touch file which whereis locate find tar unzip

grep df top free kill killall

ifconfig ping netstat telnet ftp

passwd umask chrown chmod chgrp sudo ps who


8.Spring IOC 的原理?答案:基于反射


9. 數(shù)據(jù)庫事務隔離級別?

Uncommit Read; Commit Read; Repeated Read; Serializable.


10.memcached 與 Redis 的區(qū)別?


技術三面


之前說過博主對數(shù)據(jù)庫相關的知識,除了會寫 SQL 之外,其他的基本白癡。這次面試將近 40mins,差不多被問了 30mins 的數(shù)據(jù)庫的知識。比如:數(shù)據(jù)庫優(yōu)化;訪問多少條數(shù)據(jù),數(shù)據(jù)庫的反應延遲是多少;表和視圖的區(qū)別。


當然還有一些其他的,譬如 Spring 中的注解在 xml 文件中怎么配置?


context:annotation-config>



面試過程中有兩種問題比較難答:第一種,冷門知識,比如 Colletions.sort() 用到什么排序算法?第二種就是上面的這種特別簡單,用過的都知道,但是像這種在 Spring 配置文件中配置完之后就基本不動了,所以特別容易遺忘。


還有類似的比如:Spring 中的自動裝配怎么配置?


context:componenet-scan>



HR 面


最后是 HR 面,這個最簡單,只要言語不過激都是 okay 的,主要談談在原來公司主要做什么,為什么要換份新工作,期望薪資神馬的。


(ps: 談薪資是門藝術,同樣兩個人,面試打分也是一樣的,但是薪資會談和不會談之間可能相差很多,這門藝術博主還在研究中,雖然有所收獲,但是還是不敢出來賣弄,等博主把人事六大塊之一的薪酬領悟之后再來探討探討。)


總結


博主總結幾個心得,僅供參考:


面試第一要素:不要緊張,如果你真是技術族,而且對技術有所癡迷,一聊起技術來根本不會緊張。


面試第二要素:要對簡歷上的內(nèi)容了如指掌,包括原理源碼,如果略懂或者根本就是用了幾天就再也沒用過的技術就從簡歷上刪掉吧,否則被面試官抓住不放就糟糕了。


面試第三要素:學會引導面試,掌握主動權。這門技藝需要多去混點面筋,然后自我優(yōu)化之后,一般都可以掌握。


面試第四要素:做人要低調(diào)。面試你這個職位的人的技術肯定比這個職位高好幾個 level, 不要覺得你回答了你非常熟悉的問題就高調(diào)起來,面試官隨時可以挖出一堆坑來讓你往里面跳。


面試第五要素:要自信。有些面試官會對某些你回答完問題之后會補一句:你確定?這時候就要看你自己了,有可能面試官再提醒你,也有可能再詐你。歸根結底還是要技術掌握的夠硬,底氣就足一些。


參考資料:

1. Java 多線程知識小抄集 (一)

2. 設計模式:單例模式(Singleton)

3. Java 虛擬機類加載機制

4. Redis 和 Memcached 的區(qū)別

5. 面向?qū)ο蟮脑O計原則

6. 攻破 JAVA NIO 技術壁壘

7. Java 集合框架:HashMap


專欄作者簡介點擊 → 加入專欄作者 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多