這裡有一份面經,請查收(1)
來源:伯樂在線專欄作者 - 朱小廝
鏈接:http://blog.jobbole.com/103105/
點擊 → 了解如何加入專欄作者
博主畢業快滿三年了,由於種種原因想換一份工作。學了 7 年計算機技術,在目前的行業用到的技術不多,還是想去尋找一份互聯網行業的工作,這樣更能學以致用發揮自己的特長。從上次更新博客到現在已經三周左右了,這三周博客基本斷更了,現在找工作也基本收尾了,來聊一聊我所遇到的一些面試經歷,希望給各位尋求新機會的小夥伴一個參考。總共面完 8 家收了 7 個 offer,應該算是比較成功的吧。博文中主要還是聊一下技術相關的,博文中所涉及的公司均以代號標誌,不便透露細節。
第一家面試的公司是一家互聯網創業公司,這裡簡稱 D,博主對這家公司的印象還是不錯的,共面試了 5 輪,筆試一輪,技術面 3 輪,最後一輪是 HR 面。雖然公司總共員工只有小几百人,但是做事比較專業,很多大型的成熟公司也未必做得更好。
首先說說筆試,很多一些小的公司,就是從網上題庫中拉點選擇題讓你做做,之後的面試和筆試題無關,這裡我遇到的筆試題是和第一輪技術面相關的,有點小套路。
筆試題
據博主的回憶,共有這麼些題(都是簡答題):
1. 寫出 java 中 synchronized 的使用方式。
可以參考:Java 多線程知識小抄集 (一)
2. Java 中設置最大堆和最小堆內存的參數是什麼?
-Xmx -Xms
3. volatile 的作用?
兩點:內存可見性;防止指令重排序;
4. 寫一個二分查找演算法
5. 寫一個你熟悉的設計模式,畫出 UML 圖,說出此模式的作用以及寫出此模式的主要方法。
6. 一道設計題。(略)
7. BeanFactory 和 ApplicationContext 的區別。(Sping 的容器可以分為兩種類型 :1. BeanFactory:(org.springframework.beans.factory.BeanFactory 介面定義)是最簡答的容器,提供了基本的 DI 支持。最常用的 BeanFactory 實現就是 XmlBeanFactory 類,它根據 XML 文件中的定義載入 beans,該容器從 XML 文件讀取配置元數據並用它去創建一個完全配置的系統或應用。 2. ApplicationContext 應用上下文:org.springframework.context.ApplicationContext)基於 BeanFactory 之上構建,並提供面嚮應用的服務。)
(第 4,5 題在下面會解釋)
第一輪技術面
主要根據簡歷以及筆試題進行論述。
先將筆試題,首先是寫出一個熟悉的設計模式,那當然寫個單例咯,這個最簡單嘛,主要是 UML 圖也特別好畫。詳細可以參考設計模式:單例模式(Singleton)。博主寫的是內部類的寫法:
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 內部機制可以保證在執行類構造器 () 方法的時候是線程安全的,詳細可以參考博文: Java 虛擬機類載入機制。
這裡博主還特意說了虛擬機規範嚴格規定了有且只有 5 種情況(JDK7)必須對類進行初始化 (執行類構造器 () 方法):
遇到 new,getstatic,putstatic,invokestatic 這失調位元組碼指令時,如果類沒有進行過初始化,則需要先觸發其初始化。生成這 4 條指令的最常見的 Java 代碼場景是:使用 new 關鍵字實例化對象的時候、讀取或設置一個類的靜態欄位(被 final 修飾、已在編譯器把結果放入常量池的靜態欄位除外)的時候,以及調用一個類的靜態方法的時候。
使用 java.lang.reflect 包的方法對類進行反射調用的時候,如果類沒有進行過初始化,則需要先觸發其初始化。
當初始化一個類的時候,如果發現其父類還沒有進行過初始化,則需要先觸發其父類的初始化。
當虛擬機啟動時,用戶需要指定一個要執行的主類(包含 main() 方法的那個類),虛擬機會先初始化這個主類。
當使用 jdk1.7 動態語言支持時,如果一個 java.lang.invoke.MethodHandle 實例最後的解析結果 REF_getstatic,REF_putstatic,REF_invokeStatic 的方法句柄,並且這個方法句柄所對應的類沒有進行初始化,則需要先出觸發其初始化。
尤其是第 5 點,是個特別偏冷的知識點,當你記住這個的時候,可以給面試官留下一個很好的印象。在後面的博文中會經常涉及這種冷知識,可以讓你的面試過程添加幾處亮點。
下面就是要說明一下的二分查找法(首先確保被排序的數組有序),這裡有兩種寫法:遞歸和非遞歸的寫法。博主憋了一個遞歸的演算法,不過最好還是用非遞歸的寫法。二分查找法還是很容易的,關鍵這裡引申出了變種演算法,譬如:給你一個 key,找出這個數組中最左邊的 key,或者最右邊的 key。當然還有其他變種演算法,有興趣的朋友可以自行查找相關資料。
接下去就根據簡歷聊一聊項目和 Java 基礎了。下面稍微列舉一些問題:
Memcached 和 Redis 的區別? 參考:Redis 和 Memcached 的區別
ActiveMQ 的集群配置方式有哪些?(基於共享文件,基於資料庫,基於 Zookeeper 等)
Mybatis 的一些知識點。(略)
虛擬機的類載入機制。(載入 - 驗證 - 準備 - 解析 - 初始化,詳細可以參考 Java 虛擬機類載入機制)
內部類相關知識點。
面向對象的設計原則?參考:面向對象的設計原則
Spring Aop 的原理?動態代理。
Spring 常用的註解?
NIO 的相關。參考:攻破 JAVA NIO 技術壁壘
資料庫優化相關。(博主基本不直接接觸資料庫,so 遇到此類問題直接 say: I don』t know. 有興趣的小夥伴可以自行查閱一些資料,譬如數據訪問優化漏鬥法則。)
linux 下查看文件有哪些方式?cat tac head tail more less nl vim vi gvim
技術面二面
約好的 10:00 電面,11:30 也沒來,後來諮詢了 HR 才說面試官出差去了。。。好吧,畢竟公司還在創業初期,管理上有疏忽可以理解。第二次約的 2 面同樣是 10:00,這次是 10:27 來的電話。額。。。這此的面試官好像是 CTO,面的也比較深一些:
1. 談談你對 HashMap 的理解,怎麼樣去保證線程安全?
博主對 HashMap 巴拉巴拉的一陣,可以參考:Java 集合框架:HashMap. 然後有三種方法可以保證 hashMap 的線程安全:換成 HashTable;用 synchronizedMap 包裝一下 HashMap; 換成 ConcurrentHashMap。然後補了一句 ConcurrentHashMap 是比較推崇的,然後就被問了另一個問題:說一下 ConcurrentHashMap 的實現原理。然後解釋了一下,最後問了個問題:用 HashMap 怎麼去實現 ConcurrentHashMap?當時想了一個,覺得不 okay,想說第二個方案就被制止了。現在想想:把 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)。這裡如果說出來了,就必須對其十分了解,比如博主在另一家互聯網公司 W 的面試過程中就被問到:你對 java 集合了解有多少?博主說:我看過所有集合的源碼。然後就被問到:Collections.sort() 裡面的實現是什麼排序演算法?這個問題確實夠冷門的!幸虧看過,不然就被打臉了。。(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 周不沒看過就會忘記。。博主當時就忘記了。。超簡單的題,但是又是最不起眼的題,細節做的不夠好。
"stylesheet" type="text/css" href="css/head.css" />
4.js 中的 ajax 操作的方式?這個寫的太多了,所以答起來很 easy
5. 一句話概括 NIO。博主說了一通,包括 Reactor 模式神馬的。但是面試官說:你說的也很對,但是不是我想要的結果。斯巴達。。。
6. 設計資料庫的一道題,比較簡單,不贅述。
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. 資料庫事務隔離級別?
Uncommit Read; Commit Read; Repeated Read; Serializable.
10.memcached 與 Redis 的區別?
技術三面
之前說過博主對資料庫相關的知識,除了會寫 SQL 之外,其他的基本白痴。這次面試將近 40mins,差不多被問了 30mins 的資料庫的知識。比如:資料庫優化;訪問多少條數據,資料庫的反應延遲是多少;表和視圖的區別。
當然還有一些其他的,譬如 Spring 中的註解在 xml 文件中怎麼配置?
context:annotation-config>
面試過程中有兩種問題比較難答:第一種,冷門知識,比如 Colletions.sort() 用到什麼排序演算法?第二種就是上面的這種特別簡單,用過的都知道,但是像這種在 Spring 配置文件中配置完之後就基本不動了,所以特別容易遺忘。
還有類似的比如:Spring 中的自動裝配怎麼配置?
context:componenet-scan>
HR 面
最後是 HR 面,這個最簡單,只要言語不過激都是 okay 的,主要談談在原來公司主要做什麼,為什麼要換份新工作,期望薪資神馬的。
(ps: 談薪資是門藝術,同樣兩個人,面試打分也是一樣的,但是薪資會談和不會談之間可能相差很多,這門藝術博主還在研究中,雖然有所收穫,但是還是不敢出來賣弄,等博主把人事六大塊之一的薪酬領悟之後再來探討探討。)
總結
博主總結幾個心得,僅供參考:
面試第一要素:不要緊張,如果你真是技術族,而且對技術有所痴迷,一聊起技術來根本不會緊張。
面試第二要素:要對簡歷上的內容了如指掌,包括原理源碼,如果略懂或者根本就是用了幾天就再也沒用過的技術就從簡歷上刪掉吧,否則被面試官抓住不放就糟糕了。
面試第三要素:學會引導面試,掌握主動權。這門技藝需要多去混點麵筋,然後自我優化之後,一般都可以掌握。
面試第四要素:做人要低調。面試你這個職位的人的技術肯定比這個職位高好幾個 level, 不要覺得你回答了你非常熟悉的問題就高調起來,面試官隨時可以挖出一堆坑來讓你往裡面跳。
面試第五要素:要自信。有些面試官會對某些你回答完問題之後會補一句:你確定?這時候就要看你自己了,有可能面試官再提醒你,也有可能再詐你。歸根結底還是要技術掌握的夠硬,底氣就足一些。
參考資料:
1. Java 多線程知識小抄集 (一)
2. 設計模式:單例模式(Singleton)
3. Java 虛擬機類載入機制
4. Redis 和 Memcached 的區別
5. 面向對象的設計原則
6. 攻破 JAVA NIO 技術壁壘
7. Java 集合框架:HashMap
專欄作者簡介 ( 點擊 → 加入專欄作者)
推薦閱讀:
※來到甘南,相信你一定會愛上這裡的自然風光的!
※不管男女「這裡」越長,命就越長,福大命大,必定有兒有女又有福
※海外公司開設銀行賬戶有疑問?請看這裡
※這裡有痣的人,不管男女老少,都是富貴之命!
※【技術貼】60㎡住下三代人,秘密全在這裡!
TAG:這裡 |