博主畢業(yè)快滿三年了,由于種種原因想換一份工作。學(xué)了 7 年計(jì)算機(jī)技術(shù),在目前的行業(yè)用到的技術(shù)不多,還是想去尋找一份互聯(lián)網(wǎng)行業(yè)的工作,這樣更能學(xué)以致用發(fā)揮自己的特長。從上次更新博客到現(xiàn)在已經(jīng)三周左右了,這三周博客基本斷更了,現(xiàn)在找工作也基本收尾了,來聊一聊我所遇到的一些面試經(jīng)歷,希望給各位尋求新機(jī)會的小伙伴一個(gè)參考??偣裁嫱?8 家收了 7 個(gè) offer,應(yīng)該算是比較成功的吧。博文中主要還是聊一下技術(shù)相關(guān)的,博文中所涉及的公司均以代號標(biāo)志,不便透露細(xì)節(jié)。 第一家面試的公司是一家互聯(lián)網(wǎng)創(chuàng)業(yè)公司,這里簡稱 D,博主對這家公司的印象還是不錯(cuò)的,共面試了 5 輪,筆試一輪,技術(shù)面 3 輪,最后一輪是 HR 面。雖然公司總共員工只有小幾百人,但是做事比較專業(yè),很多大型的成熟公司也未必做得更好。 首先說說筆試,很多一些小的公司,就是從網(wǎng)上題庫中拉點(diǎn)選擇題讓你做做,之后的面試和筆試題無關(guān),這里我遇到的筆試題是和第一輪技術(shù)面相關(guān)的,有點(diǎn)小套路。 筆試題 據(jù)博主的回憶,共有這么些題(都是簡答題): 1. 寫出 java 中 synchronized 的使用方式。 可以參考:Java 多線程知識小抄集 (一) 2. Java 中設(shè)置最大堆和最小堆內(nèi)存的參數(shù)是什么? -Xmx -Xms 3. volatile 的作用? 兩點(diǎn):內(nèi)存可見性;防止指令重排序; 4. 寫一個(gè)二分查找算法 5. 寫一個(gè)你熟悉的設(shè)計(jì)模式,畫出 UML 圖,說出此模式的作用以及寫出此模式的主要方法。 6. 一道設(shè)計(jì)題。(略) 7. BeanFactory 和 ApplicationContext 的區(qū)別。(Sping 的容器可以分為兩種類型 :1. BeanFactory:(org.springframework.beans.factory.BeanFactory 接口定義)是最簡答的容器,提供了基本的 DI 支持。最常用的 BeanFactory 實(shí)現(xiàn)就是 XmlBeanFactory 類,它根據(jù) XML 文件中的定義加載 beans,該容器從 XML 文件讀取配置元數(shù)據(jù)并用它去創(chuàng)建一個(gè)完全配置的系統(tǒng)或應(yīng)用。 2. ApplicationContext 應(yīng)用上下文:org.springframework.context.ApplicationContext)基于 BeanFactory 之上構(gòu)建,并提供面向應(yīng)用的服務(wù)。) (第 4,5 題在下面會解釋) 第一輪技術(shù)面 主要根據(jù)簡歷以及筆試題進(jìn)行論述。 先將筆試題,首先是寫出一個(gè)熟悉的設(shè)計(jì)模式,那當(dāng)然寫個(gè)單例咯,這個(gè)最簡單嘛,主要是 UML 圖也特別好畫。詳細(xì)可以參考設(shè)計(jì)模式:單例模式(Singleton)。博主寫的是內(nèi)部類的寫法:
這種寫法是懶漢式線程安全的寫法。 面試官問到一個(gè)問題:為什么這種寫法是線程安全的? 那么這里就設(shè)計(jì)到一個(gè) JVM 加載的知識:JVM 內(nèi)部機(jī)制可以保證在執(zhí)行類構(gòu)造器 () 方法的時(shí)候是線程安全的,詳細(xì)可以參考博文: Java 虛擬機(jī)類加載機(jī)制。 這里博主還特意說了虛擬機(jī)規(guī)范嚴(yán)格規(guī)定了有且只有 5 種情況(JDK7)必須對類進(jìn)行初始化 (執(zhí)行類構(gòu)造器 () 方法):
尤其是第 5 點(diǎn),是個(gè)特別偏冷的知識點(diǎn),當(dāng)你記住這個(gè)的時(shí)候,可以給面試官留下一個(gè)很好的印象。在后面的博文中會經(jīng)常涉及這種冷知識,可以讓你的面試過程添加幾處亮點(diǎn)。 下面就是要說明一下的二分查找法(首先確保被排序的數(shù)組有序),這里有兩種寫法:遞歸和非遞歸的寫法。博主憋了一個(gè)遞歸的算法,不過最好還是用非遞歸的寫法。二分查找法還是很容易的,關(guān)鍵這里引申出了變種算法,譬如:給你一個(gè) key,找出這個(gè)數(shù)組中最左邊的 key,或者最右邊的 key。當(dāng)然還有其他變種算法,有興趣的朋友可以自行查找相關(guān)資料。 接下去就根據(jù)簡歷聊一聊項(xiàng)目和 Java 基礎(chǔ)了。下面稍微列舉一些問題:
技術(shù)面二面 約好的 10:00 電面,11:30 也沒來,后來咨詢了 HR 才說面試官出差去了。。。好吧,畢竟公司還在創(chuàng)業(yè)初期,管理上有疏忽可以理解。第二次約的 2 面同樣是 10:00,這次是 10:27 來的電話。額。。。這此的面試官好像是 CTO,面的也比較深一些: 1. 談?wù)勀銓?HashMap 的理解,怎么樣去保證線程安全? 博主對 HashMap 巴拉巴拉的一陣,可以參考:Java 集合框架:HashMap. 然后有三種方法可以保證 hashMap 的線程安全:換成 HashTable;用 synchronizedMap 包裝一下 HashMap; 換成 ConcurrentHashMap。然后補(bǔ)了一句 ConcurrentHashMap 是比較推崇的,然后就被問了另一個(gè)問題:說一下 ConcurrentHashMap 的實(shí)現(xiàn)原理。然后解釋了一下,最后問了個(gè)問題:用 HashMap 怎么去實(shí)現(xiàn) ConcurrentHashMap?當(dāng)時(shí)想了一個(gè),覺得不 okay,想說第二個(gè)方案就被制止了?,F(xiàn)在想想:把 HashMap 用 Collections.synchronizedMap() 包裝一下替換屌 Segment 即可。(如果不知所云,請閱讀一下 ConcurrentHashMap 的源碼先~~) 補(bǔ)充:這里還問了平常用了那些線程安全的隊(duì)列,包括: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() 里面的實(shí)現(xiàn)是什么排序算法?這個(gè)問題確實(shí)夠冷門的!幸虧看過,不然就被打臉了。。(TimSort, 加強(qiáng)型歸并排序) ArrayList extends AbstractList implements List, RandomAccess, Cloneable, Serializable. 然后 AbstractList 又繼承了 AbstractCollection. 然后 List 和 AbstractCollection 又都 implements 了 Collection. HashMap extends AbstractMap implements Map, Cloneable, Serializable. 3.css 導(dǎo)入方式? 這個(gè)只要 2 周不沒看過就會忘記。。博主當(dāng)時(shí)就忘記了。。超簡單的題,但是又是最不起眼的題,細(xì)節(jié)做的不夠好。
4.js 中的 ajax 操作的方式?這個(gè)寫的太多了,所以答起來很 easy 5. 一句話概括 NIO。博主說了一通,包括 Reactor 模式神馬的。但是面試官說:你說的也很對,但是不是我想要的結(jié)果。斯巴達(dá)。。。 6. 設(shè)計(jì)數(shù)據(jù)庫的一道題,比較簡單,不贅述。 7. 常用的 linux 命令?(這個(gè)被用了好多次了)
8.Spring IOC 的原理?答案:基于反射 9. 數(shù)據(jù)庫事務(wù)隔離級別? Uncommit Read; Commit Read; Repeated Read; Serializable. 10.memcached 與 Redis 的區(qū)別? 技術(shù)三面 之前說過博主對數(shù)據(jù)庫相關(guān)的知識,除了會寫 SQL 之外,其他的基本白癡。這次面試將近 40mins,差不多被問了 30mins 的數(shù)據(jù)庫的知識。比如:數(shù)據(jù)庫優(yōu)化;訪問多少條數(shù)據(jù),數(shù)據(jù)庫的反應(yīng)延遲是多少;表和視圖的區(qū)別。 當(dāng)然還有一些其他的,譬如 Spring 中的注解在 xml 文件中怎么配置?
面試過程中有兩種問題比較難答:第一種,冷門知識,比如 Colletions.sort() 用到什么排序算法?第二種就是上面的這種特別簡單,用過的都知道,但是像這種在 Spring 配置文件中配置完之后就基本不動(dòng)了,所以特別容易遺忘。 還有類似的比如:Spring 中的自動(dòng)裝配怎么配置?
HR 面 最后是 HR 面,這個(gè)最簡單,只要言語不過激都是 okay 的,主要談?wù)勗谠瓉砉局饕鍪裁矗瑸槭裁匆獡Q份新工作,期望薪資神馬的。 (ps: 談薪資是門藝術(shù),同樣兩個(gè)人,面試打分也是一樣的,但是薪資會談和不會談之間可能相差很多,這門藝術(shù)博主還在研究中,雖然有所收獲,但是還是不敢出來賣弄,等博主把人事六大塊之一的薪酬領(lǐng)悟之后再來探討探討。) 總結(jié) 博主總結(jié)幾個(gè)心得,僅供參考: 面試第一要素:不要緊張,如果你真是技術(shù)族,而且對技術(shù)有所癡迷,一聊起技術(shù)來根本不會緊張。 面試第二要素:要對簡歷上的內(nèi)容了如指掌,包括原理源碼,如果略懂或者根本就是用了幾天就再也沒用過的技術(shù)就從簡歷上刪掉吧,否則被面試官抓住不放就糟糕了。 面試第三要素:學(xué)會引導(dǎo)面試,掌握主動(dòng)權(quán)。這門技藝需要多去混點(diǎn)面筋,然后自我優(yōu)化之后,一般都可以掌握。 面試第四要素:做人要低調(diào)。面試你這個(gè)職位的人的技術(shù)肯定比這個(gè)職位高好幾個(gè) level, 不要覺得你回答了你非常熟悉的問題就高調(diào)起來,面試官隨時(shí)可以挖出一堆坑來讓你往里面跳。 面試第五要素:要自信。有些面試官會對某些你回答完問題之后會補(bǔ)一句:你確定?這時(shí)候就要看你自己了,有可能面試官再提醒你,也有可能再詐你。歸根結(jié)底還是要技術(shù)掌握的夠硬,底氣就足一些。 參考資料: 1. Java 多線程知識小抄集 (一) 2. 設(shè)計(jì)模式:單例模式(Singleton) 3. Java 虛擬機(jī)類加載機(jī)制 4. Redis 和 Memcached 的區(qū)別 5. 面向?qū)ο蟮脑O(shè)計(jì)原則 6. 攻破 JAVA NIO 技術(shù)壁壘 7. Java 集合框架:HashMap 專欄作者簡介 ( 點(diǎn)擊 → 加入專欄作者 ) |
|
|