博主畢業快滿3年了,由于種種緣由想換1份工作。學了7年計算機技術,在目前的行業用到的技術不多,還是想去尋覓1份互聯網行業的工作,這樣更能學以致用發揮自己的特長。從上次更新博客到現在已3周左右了,這3周博客基本斷更了,現在找工作也基本掃尾了,來聊1聊我所遇到的1些面試經歷,希望給各位尋求新機會的小火伴1個參考。總共面完8家收了7個offer,應當算是比較成功的吧。博文中主要還是聊1下技術相干的,博文中所觸及的公司均以代號標志,不便流露細節。
第1家面試的公司是1家互聯網創業公司,這里簡稱D,博主對這家公司的印象還是不錯的,共面試了5輪,筆試1輪,技術面3輪,最后1輪是HR面。雖然公司總共員工只有小幾百人,但是做事比較專業,很多大型的成熟公司也未必做得更好。
首先說說筆試,很多1些小的公司,就是從網上題庫中拉點選擇題讓你做做,以后的面試和筆試題無關,這里我遇到的筆試題是和第1輪技術面相干的,有點小套路。
據博主的回想,共有這么些題(都是簡答題):
1. 寫出java中synchronized的使用方式。
可以參考:Java多線程知識小抄集(1)
2. Java中設置最大堆和最小堆內存的參數是甚么?
-Xmx -Xms
3. volatile的作用?
兩點:內存可見性;避免指令重排序;
4. 寫1個2分查找算法
5. 寫1個你熟習的設計模式,畫出UML圖,說出此模式的作用和寫出此模式的主要方法。
6. 1道設計題。(略)
7. BeanFactory和ApplicationContext的區分。(Sping的容器可以分為兩種類型 :1. BeanFactory:(org.springframework.beans.factory.BeanFactory接口定義)是最簡答的容器,提供了基本的DI支持。最經常使用的BeanFactory實現就是XmlBeanFactory類,它根據XML文件中的定義加載beans,該容器從XML文件讀取配置元數據并用它去創建1個完全配置的系統或利用。 2. ApplicationContext利用上下文:org.springframework.context.ApplicationContext)基于BeanFactory之上構建,并提供面向利用的服務。)
(第4,5題在下面會解釋)
主要根據簡歷和筆試題進行論述。
先將筆試題,首先是寫出1個熟習的設計模式,那固然寫個單例咯,這個最簡單嘛,主要是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;
}
}
這類寫法是懶漢式線程安全的寫法。
面試官問到1個問題:為何這類寫法是線程安全的?
那末這里就設計到1個JVM加載的知識:JVM內部機制可以保證在履行類構造器<clinit>()方法的時候是線程安全的,詳細可以參考博文: Java虛擬機類加載機制。
這里博主還特地說了虛擬機規范嚴格規定了有且只有5種情況(JDK7)必須對類進行初始化(履行類構造器<clinit>()方法):
特別是第5點,是個特別偏冷的知識點,當你記住這個的時候,可以給面試官留下1個很好的印象。在后面的博文中會常常觸及這類冷知識,可讓你的面試進程添加幾處亮點。
下面就是要說明1下的2分查找法(首先確保被排序的數組有序),這里有兩種寫法:遞歸和非遞歸的寫法。博主憋了1個遞歸的算法,不過最好還是用非遞歸的寫法。2分查找法還是很容易的,關鍵這里引伸出了變種算法,比方:給你1個key,找出這個數組中最左側的key,或最右側的key。固然還有其他變種算法,有興趣的朋友可以自行查找相干資料。
接下去就根據簡歷聊1聊項目和Java基礎了。下面略微羅列1些問題:
1. Memcached和Redis的區分?參考:Redis和Memcached的區分
2. ActiveMQ的集群配置方式有哪些?(基于同享文件,基于數據庫,基于Zookeeper等)
3. Mybatis的1些知識點。(略)
4. 虛擬機的類加載機制。(加載-驗證-準備-解析-初始化,詳細可以參考 Java虛擬機類加載機制)
5. 內部類相干知識點。
6. 面向對象的設計原則?參考:面向對象的設計原則
7. Spring Aop的原理?動態代理。
8. Spring經常使用的注解?
9. NIO的相干。參考:攻破JAVA NIO技術壁壘
10. 數據庫優化相干。(博主基本不直接接觸數據庫,so遇到此類問題直接say: I don’t know. 有興趣的小火伴可以自行查閱1些資料,比方數據訪問優化漏斗法則。)
11. linux下查看文件有哪些方式?cat tac head tail more less nl vim vi gvim
約好的10:00電面,11:30也沒來,后來咨詢了HR才說面試官出差去了。。。好吧,畢竟公司還在創業早期,管理上有忽視可以理解。第2次約的2面一樣是10:00,這次是10:27來的電話。額。。。這此的面試官好像是CTO,面的也比較深1些:
1.談談你對HashMap的理解,怎樣樣去保證線程安全?
博主對HashMap巴拉巴拉的1陣,可以參考:Java集合框架:HashMap. 然后有3種方法可以保證hashMap的線程安全:換成HashTable;用synchronizedMap包裝1下HashMap;換成ConcurrentHashMap。然后補了1句ConcurrentHashMap是比較推重的,然后就被問了另外一個問題:說1下ConcurrentHashMap的實現原理。然后解釋了1下,最后問了個問題:用HashMap怎樣去實現ConcurrentHashMap?當時想了1個,覺得不okay,想說第2個方案就被制止了。現在想一想:把HashMap用Collections.synchronizedMap()包裝1下替換屌Segment便可。(如果不知所云,請瀏覽1下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)。這里如果說出來了,就必須對其10分了解,比如博主在另外一家互聯網公司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周不沒看過就會忘記。。博主當時就忘記了。。超簡單的題,但是又是最不起眼的題,細節做的不夠好。
<link rel="stylesheet" type="text/css" href="css/head.css" />
4.js中的ajax操作的方式?這個寫的太多了,所以答起來很easy
5.1句話概括NIO。博主說了1通,包括Reactor模式神馬的。但是面試官說:你說的也很對,但是否是我想要的結果。斯巴達。。。
6.設計數據庫的1道題,比較簡單,不贅述。
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的數據庫的知識。比如:數據庫優化;訪問多少條數據,數據庫的反應延遲是多少;表和視圖的區分。
固然還有1些其他的,比方Spring中的注解在xml文件中怎樣配置?
<context:annotation-config>
面試進程中有兩種問題比較難答:第1種,冷門知識,比如Colletions.sort()用到甚么排序算法?第2種就是上面的這類特別簡單,用過的都知道,但是像這類在Spring配置文件中配置完以后就基本不動了,所以特別容易遺忘。
還有類似的比如:Spring中的自動裝配怎樣配置?
<context:componenet-scan>
最后是HR面,這個最簡單,只要言語不過激都是okay的,主要談談在原來公司主要做甚么,為何要換份新工作,期望薪資神馬的。(ps: 談薪資是門藝術,一樣兩個人,面試打分也是1樣的,但是薪資會談和不會談之間可能相差很多,這門藝術博主還在研究中,雖然有所收獲,但是還是不敢出來賣弄,等博主把人事6大塊之1的薪酬領悟以后再來探討探討。)
博主總結幾個心得,僅供參考:
面試第1要素:不要緊張,如果你真是技術族,而且對技術有所癡迷,1聊起技術來根本不會緊張。
面試第2要素:要對簡歷上的內容了如指掌,包括原理源碼,如果略懂或根本就是用了幾天就再也沒用過的技術就從簡歷上刪掉吧,否則被面試官捉住不放就糟了。
面試第3要素:學會引導面試,掌握主動權。這門技藝需要多去混點面筋,然后自我優化以后,1般都可以掌握。
面試第4要素:做人要低調。面試你這個職位的人的技術肯定比這個職位高好幾個level, 不要覺得你回答了你非常熟習的問題就高調起來,面試官隨時可以挖出1堆坑來讓你往里面跳。
面試第5要素:要自信。有些面試官會對某些你回答完問題以后會補1句:你肯定?這時候候就要看你自己了,有可能面試官再提示你,也有可能再炸你。歸根結柢還是要技術掌握的夠硬,底氣就足1些。
參考資料:
1. Java多線程知識小抄集(1)
2. 設計模式:單例模式(Singleton)
3. Java虛擬機類加載機制
4. Redis和Memcached的區分
5. 面向對象的設計原則
6. 攻破JAVA NIO技術壁壘
7. Java集合框架:HashMap
下一篇 二叉搜索樹與雙向鏈表