致那些迷茫的JAVA面試者(特別是南京的1-4年經驗),致那些奮發的年輕人,致本身。寫這篇博文主要也是對個人成長道路的記錄,面試受挫後的反思,及對本身的勉勵。前端
本人介紹:3年多經驗的程序員,座標南京。java
背景:因水平有限,及對部分面試問題記憶及理解有限,可能有些問題並不能表達準確。掌握技術有限,學習主動性通常(雖遇到問題善於思考鑽研,但若是沒有遇到問題比較放縱本身...被自由,輕鬆,安逸迷失心智),以及原公司項目背景因素,基本不須要太多新的技術框架支持,更沒有涉及消息中間件,高併發分佈式等等相關較主流技術,技術體系相對較老。綜上致使我對不少新技術並非太瞭解。mysql
面試經驗背景:基本公司都是按簡歷掌握技術來問(固然也有超綱不按套路出牌的),若是你簡歷掌握技術什麼都不寫,也有可能接到面試邀請,那麼面試官問題可能就比較廣了,對面試者不利。掌握技術我寫了java基礎:多線程,io/nio,jvm,集合底層,tcp/ip協議,socket,websocket。spring,springmvc,xml,設計模式,eclipse plugin開發,數據庫,前端(基本沒有什麼人問,面的後端開發,也許熟悉前端也是加分項)瞭解netty、mybatis、redis(實際就是看了一點點).jquery
面試經歷(具體錄用薪資我就不說明了,只說我對薪資+公司福利滿意度。linux
面試中項目介紹一定要說的,以及項目中的細節問題,這些不細說了。只說技術問題)程序員
按時間前後排序(時間越遠遺忘的問題可能越多。不少重複的,將就看吧)web
1.小公司面試
名字忘了。時間久遠,只記得有多線程,線程池拒絕策略,jvm調優,tomcat調優,消息中間件,分佈式,集羣,zookeeper,微服務。sql左鏈接右鏈接區別,存儲過程。linux。基本全程懵逼,(由於第一次面試,簡歷技術什麼都沒寫,這貨敞開了問)。最後居然通知我面試經過。redis
2.軟通動力(華爲外包)算法
stringbuffer和stringbuild區別,stringbuild線程不安全體如今哪,你對線程安不安全怎麼理解(這個問題發揮空間很大,關鍵詞:全局變量、JVM運行時數據區、可見性、原子性、鎖、甚至能夠說到多核cpu硬件層面(我是不會的)),arraylist和linkedlist區別,spring ioc,aop做用,原理。springmvc執行流程(這種問題最扯淡),hashmap原理(問的很淺,底層結構,答數組+鏈表/紅黑樹。他就沒問了),hashmap,hashtable,concurrentHashMap(大體基本說下,他就不問了),hashmap遍歷。對大數據有關技術瞭解多少(答:瞭解一點,聽過hadoop)。其它忘了,整體難度不大。寫代碼:字符串分割排序(split+冒泡))。
3.鴻信集團(電信子公司)
一個年紀比較大的面試官,像管理層人員,感受技術水平有限。基本就問了項目,spring的理解,activemq,沒了。筆試,扯淡的筆試題,寫了一點走人了。公司總體給人的感受比較自由鬆散,適合養老。感受技術上沒有發展空間。
4.蘇寧
我先後面了4次(由於住的地方就靠着蘇寧,沒事就順便去面試打發時間,4個部門,經過了3個)。寫一塊兒。
蘇寧金服:問的項目業務,公司業務模塊(無從下口),爲何要用redis,相比於如memcached,mongodb有什麼優點,mybatis,activemq。springmvc有什麼好處,爲何要用它,springmvc和struts區別(都不會)...用過什麼數據庫,有沒有作過數據庫優化,什麼狀況下要用到索引,好處是什麼,哪些字段適合創建索引,mysql索引底層數據結構瞭解嗎,索引什麼狀況下會失效,聯合索引abc只用了a字段,索引是否會生效。什麼狀況下要用到多線程,爲何要用,好處。啓動多個線程,如何知道他們都運行完畢了。jquery要想取某個節點中的第幾個元素怎麼寫,具體哪一個方法((我看你是閒着蛋疼)答:元素選擇器,find,eq)。 整體回答的很很差,感受他就盯着我寫的瞭解程度的技術問,有爲難我下降我薪資要求的意思。最後通知面試經過(也許是真的缺人,也許是我吹牛比較6,畫了項目流程圖給他)
蘇寧易購網站購物車消費者業務線:string爲何是不可變的,重寫重載,object類有哪些方法,sleep和wait區別,實現線程的方式,run,start區別,線程有幾種狀態,synchronize實現原理(這個問題能夠說的不少,建議你們往深了看,往深了說,以震懾面試官),與lock區別,還知道哪些鎖,說說自旋鎖。線程池,線程池等待隊列,拒絕策略,死鎖產生緣由。爲何java能夠一次編譯,處處運行。事務特性,索引失效,mysql有哪些函數。http和https區別,get和post區別,springbean是單例嗎,spring源碼看過嗎,其中的單例bean是怎麼實現的。redis有支持哪些數據結構。servlet怎麼取前端參數。(兩個面試官,感受面試官水平有限,一直在想問什麼問題,越問越沒難度)設計個洗牌算法。線上購物車須要有個標誌惟一id,有什麼方法實現這個id(uuid,參考jdk中random實現原理,取隨機種子)
大數據部門:抽象類接口區別,接口中能夠定義成員變量嗎,默認是什麼類型的變量(public static final),接口中方法權限能夠是private嗎,接口是否能夠寫具體實現(答:jdk8開始能夠)重寫重載區別,線程的實現方式(我已經感受到這個部門有多缺人了)。sql交併集,事務隔離級別。能調用另外一個類的私有方法嗎,怎麼作。若是線程池執行shutdown或shutdownNow,線程池中線程會中斷嗎,會出現什麼異常,catch處理中該寫些什麼。用過哪些concurrent包下的類,說說原子類,cas操做可能會存在什麼問題。jdk中有哪些設計模式的運用,項目中用了哪些設計模式,treemap中compartor用了什麼設計模式,有哪些單例模式的實現方式,springbean是單例嗎。若是想要在某些本身指定的某些方法先後打印日誌怎麼實現(答:自定義註解,問:具體怎麼作,答:spring aop的實現思路...),註解實現原理。
蘇寧物流部:蘇寧最難的一次面試經歷,也許是晚上面試,時間充分,安靜,面試官比較好發揮,我全程半懵逼,面試官是中年人,看氣勢最起碼經理級別。
servlet和jsp區別,若是沒有servlet,jsp怎麼跟後端交互(大概是這個意思,沒聽太懂,一臉懵逼)。springmvc怎麼取前端數據,springmvc模式下,若是沒有註解怎麼取前端參數(答:servlet,requset.getParameter。他問,具體在哪怎麼用,也沒聽太懂,懵逼)。搭建springmvc項目步驟。spirngmvc controller中定義全局hashmap,它是不是線程安全的,爲何。
Io nio區別,nio原理。netty用的多嗎。答,很少。
項目中用哪一種方式解析xml的 答:jaxb,dom4j,digester。問:jaxp是什麼。 答:是jaxb,巴拉巴拉... 問:哦哦,挺好用的
servlet生命週期。tomcat在初始化中作了什麼事(答:啓動socket服務端...問:沒了嗎?答:... 很明顯該回答的還有不少,想了解的應該是我對tomcat的理解程度,以及是否看過tomcat源碼)。是否用過Nginx。過濾器和攔截器的區別。
項目中有用到緩存嗎,redis有提供了哪些存儲數據結構,redis持久化。
說說java內存模型,新生代老年代算法,你說的新生代老年代屬於堆仍是棧,還知道哪些gc算法,建立大對象也是在新生代分配嗎,(答:直接晉升進入老年代,問:具體多大對象,答:超過eden區大小,問:你是否肯定,頓時虛了,後來回去查閱過,我回答的不對,jvm這裏的看點不少,涉及到優化)。新生代的算法,說說minor gc,minor gc觸發條件。老年代用了什麼算法,說說標記整理算法,full gc是否真正回收了廢棄對象。有哪些gc策略。你以爲你的項目中若是須要jvm調優你會注重哪一個分帶的調優,或者說更注重哪一種gc調優,爲何,具體怎麼作(懵逼,隨便吹了下。問:你肯定嗎? 頓時又虛了)。
線上系統天天會收到20萬級的數據,一個月會有百萬條,而且還會遞增。你如何設計數據庫(答:分庫分表,創建索引,問:分庫分表對的,還有哪些點,分庫分表按什麼規則分)。若是查詢字段不是分庫分表的規則字段,怎麼辦(他說沒事,想到什麼說什麼,也許你的思路會比咱們的更好,你說說看)。沉默許久,不會,沒接觸過。(後來查了該問題:分庫分表多維度查詢)問:oracle分頁的sql關鍵字是什麼 答:limit 問:不對吧,那是mysql的 答:啊?好吧 問:也許是limit,我也記不清了,可能你說的是對的,回去我得看看。(面試官還算和善,實際上是rownum)
蘇寧結束,總結:蘇寧大部分部門都很是缺程序員,招人要求相比於其它大點公司要低一些,都會問的一樣的問題:可否接受蘇寧的加班(部門加班狀況不一,按我面試部門瞭解(加班從多到少:金服->物流/購物車->大數據部門),整體加班不少) ,蘇寧的軟件電商工做在外的名聲整體不太好,加班嚴重,福利通常,晉升難,據說不是太注重員工培養。
5.烽火科技
寫筆試題,筆試題一看就是用心出的(基礎題偏多,也有問答題:線上系統出現故障,怎麼排查。以及一些編程題:用jdk自帶包實現抓取指定網頁元素/內容(不會,後來查了,代碼以下:),兩個線程間隔輸出字符,文件夾中查詢指定類型文件)。
static void doGet() { try { String urlStr = "https://bbs.csdn.net"; URL url = new URL(urlStr); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestMethod("GET"); connection.setUseCaches(false); connection.setInstanceFollowRedirects(false); connection.connect(); BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String ss ,total=""; while ((ss = reader.readLine()) != null) { total += ss; total+="\n"; } System.out.println("total=" + total); reader.close(); connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } }
面試開始:1面。3個技術人員依次提問,jdbc鏈接步驟,statement和prepareStatement區別,項目中數據庫事務控制大家是怎麼作的。TreeMap,TreeSet,HashSet實現原理(以前只看了hashmap(別人都問hashmap,恰恰他就不問,這公司有套路的)其它回答的很差。此次面試經驗很重要-全部集合實現都得認真看一遍),dom4j怎麼取節點。爲何重寫equals方法最好也得重寫hashcode。treeMap中元素怎麼排序,若是沒實現comparator接口會怎麼樣。序列化做用。
中途hr跟我聊了聊公司福利,公司制度。
2面,也是3我的,項目經理(從言談中看得出來技術沉澱很不錯)+HR+不知道什麼人(女,基本沒說話)。都是項目經理問。自我介紹,項目介紹,項目細節(問的很細緻)。項目中有用到多線程,線程池嗎,怎麼用的。說說你對hash的理解。hashSet是怎麼去重的。你知道哪些map,set,說說他們實現原理。紅黑樹,二叉樹。sql優化。linux。socket長鏈接短鏈接,鏈接出現異常你是怎麼處理的。定時器。若是cpu有8個核心,那麼程序啓動多少個線程相對合適(懵逼)。最後仍是經過了。
6.擎天科技
7.亞信科技(亞信安全)
寫面試題(難度通常,sql,springmvc,編程)。Integer緩存-128-127對象相不相等問題,其它都是上面提到的問題,不細說了(感受面試官水平有限),問題基本都完整的回答出來了。跟面試官也談了好久,問了他們如今具體作什麼,用了什麼技術,這家公司所用技術挺老(估計還沒我原公司用到的技術多),貌似也是在作工具,非線上系統。還誇讚了我在原公司的作的項目(全部面試中惟一誇讚的)。
由於此次面試很成功,並且此公司環境和技術方面沒有吸引個人地方,並且面試官還說他們可能就12-13薪 。綜上最終我提了個很高的薪資要求,xx最低。
8.中地控股(付融寶),雲問科技。這兩家問題合併放一塊兒(由於問的不少問題對於我來講算是超綱了,更多的偏向了線上系統大流量狀況下的處理方案)。
9.焦點科技
兩位面試官。項目介紹,細節提問。
項目中用到緩存了嗎,答:曾經打算用用ehcache,後來發現種種緣由(細說)並不須要用到
eclipse插件開發,它的初始化方法是什麼(答:2年前作的了,實在是忘了...)
如下問題問的很細,我用紅色標註面試官的提問。
ArrayList和LinkedList區別,ArrayList有初始容量嗎,你看的是jdk幾版本 ,容量不夠怎麼辦 ,擴容爲多大 ,若是Arraylist當前容量是10,且有9個數據,那麼是添加第10個數據時擴容仍是第11個,擴容怎麼實現的,爲何採用複製數組的方式而不是日後直接添加數據 。(回答的很差,我回答的是jdk1.8初始化容量10,擴容回答的是2倍,都錯了...ArrayList沒細看,覺得很簡單,大概看看就好了,而後看完就忘了,實際上可看的點仍是不少的。回去以後研究了下,JDK6-8ArrayList實現都有變化:體如今初始容量不一樣,1.7以前初始化容量爲10,1.7及以後只會初始化空{},添加數據時纔會開始給定初始化容量,若是初始化時自定義容量,那麼狀況又不同,擴容規則
int newCapacity = oldCapacity + (oldCapacity >> 1);
以及其它一些細節,這裏就不細說了)而後我說ArrayList看的不太仔細,面試官問:你比較熟悉哪一個集合,答:hashmap。
說說hashmap數據結構(數組+鏈表,鏈表長度超過8此鏈表轉爲紅黑樹(其實不許確,後來又看了1.8源碼
final void treeifyBin(Node<K,V>[] tab, int hash) { int n, index; Node<K,V> e; if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY) resize(); else if ((e = tab[index = (n - 1) & hash]) != null) { TreeNode<K,V> hd = null, tl = null; do { TreeNode<K,V> p = replacementTreeNode(e, null); if (tl == null) hd = p; else { p.prev = tl; tl.next = p; } tl = p; } while ((e = e.next) != null); if ((tab[index] = hd) != null) hd.treeify(tab); }
數組長度少於MIN_TREEIFY_CAPACITY 是不優先轉紅黑樹的,而是優先進行擴容))。
說說紅黑樹,它是基於什麼數據結構實現的(紅黑樹瞭解不深,只是大體說了下思想-旋轉、平衡、大小比較。(我感受很難,有空得靜下心來好好研究))。紅黑樹可能會再轉爲鏈表嗎(答:長度低於8會轉回鏈表 問:你肯定是8而不是6 答:好像是6... (hashmap的看點真的不少,回去看了源碼真的是6,並且擴容時紅黑樹變化很複雜,暫時看不懂))。說下hashmap put的過程(答:key的hashcode高16位與低16位異或運算獲得新的hash,爲了讓數據(特別是在當前容量不大的狀況下)散列更均勻,而後把異或計算出的新hash與此時的hashmap容量-1作&運算,獲得插入下標。問:爲何要作&運算,還有什麼方式。答:二進制運算速度快,還能夠取模。以後若是下標位數組無數據則直接插入,若是有數據則鏈表往下逐個進行hash比較,若是產生hash碰撞再進行==或者equals比較key是否同樣,同樣則覆蓋原數據,不然添加到鏈表後面。問:發生hash衝突怎麼辦 答:剛剛說了(重複) 問:你肯定是添加到鏈表後面嗎 答:肯定(我懷疑他jdk8的hashmap沒看全(jdk7是新元素插入至鏈表頭部的)還問了產生hash衝突後爲何還會比較原來key的hashcode,表示沒聽懂,看了源碼也沒發現有再次比較的過程,並且以後也重複問rehash後的元素具體去向問題(1.7和1.8元素rehash後元素去向是不一樣的),還有擴容問題,感受他對jdk8的hashmap和1.7的有點混淆(還好我沒怎麼看jdk7,不過若是jdk7也看明白了,再說明與1.8的區別以後估計會大大加分吧,有點遺憾))。繼續,當hashmap中數據量超過當前容量*擴容因子(默認0.75)則擴容爲原來的2倍,問:還有什麼要求 答:好像沒了 問:當前插入的位置上沒有元素就不擴容吧 答:哦哦。(其實否則,他說的是jdk7的狀況,jdk8沒有這個要求。當時要是知道7和8的區別,指出這點,那就是亮點了,再次遺憾))。爲何是2次冪擴容。(答:我以爲有3點因素。2進制運算快;hash與當前容量-1作&運算很快且很巧妙地得到元素下標;擴容後能巧妙地從新分配元素位置)說下擴容的rehash,擴容後的部分節點數據會從新定位,具體規則是hash&原容量,獲得無非兩個結果:0和1,若是是0則該元素所在下標位置不動,若是是1則將該元素放置原位置擴容後的對應位置(假如原先容量爲16,元素位置在數組下標14的位置,則擴容後容量爲32,該元素移動到數組下標30的位置(即原索引+原容量位置)。當時沒這點解釋的不夠準確,有瑕疵)。爲何看hashmap源碼,你以爲看了後對你有什麼好處(答:比較喜歡探究(實際上是近期面試才認真看的...)。知道了計算機位運算速度會比其它數學運算快;學習了它的思想對我思考問題方式有提高(能吹多少儘可能吹多少);擴容是一個費性能的事,若是知道集合中大體會存多少元素最好給它一個初始容量),若是你知道里面會存100個左右數據,你會給它多大初始容量 (答:128) 它是線程安全的嗎(答:不是,jdk1.8多線程狀況下可能會形成數據丟失,1.8以前更可能形成死循環),線程安全的map有什麼(答:hashtable,concurrentHashMap,前者已經被後者替代了,效率更高),說說concurrentHashMap,默認容量多少(答:16。只是瞭解,太複雜了,沒細看,只知道jdk1.8以前採用分段鎖方式處理,1.8以後採用cas樂觀鎖的方式來操做)。其它集合類瞭解嗎(hashSet,treeSet,treeMap,都解釋的相對明白,篇幅過長,不細說了),它們是否容許插入空值(treeSet,treeMap不能夠)使用treeMap有什麼須要注意的 (其中的元素要實現comparator接口)
有關synchronize的問題(忘了怎麼問的了,只記得回答的挺多(做用,原理及jdk6以後的優化(鎖升級:偏向鎖->輕量級鎖->重量級鎖)))。Lock接口有哪些實現類,說說讀寫鎖。
java內存模型,新生代老年代算法,簡述新生代老年代gc過程,算法(複製回收(這裏沒說太明白,有點模糊),標記清除,標記整理(也說的不漂亮))。爲何新生代和老年代採用gc算法不一樣。jvm調優。
線程池有哪些參數,各表明什麼意思。線程池中提供哪些隊列種類。假如線程池核心池5,總池大小10,有界隊列長度10,如今有13個線程要用線程池運行,說下核心池和隊列中的線程狀況。jdk中提供了哪幾種線程池的實現。項目中用到線程池嗎。
JDK中有哪些設計模式的體現,io中用了什麼設計模式,說說觀察者模式,項目中用了哪些設計模式。jdk8有哪些新增功能(答:那個箭頭的那個叫什麼來着 面試官:(笑)lambda表達式 答:對,可讓一些操做更直白簡單,也有效率上的提升 問:說說它的閉包體如今哪 答:(隨便說說,也不知道對不對) 還有哪些其它功能 答:還能夠參數傳入方法 問:它有什麼好處 (隨便說了點,也不知道對不對))。
redis有哪些數據結構。spring bean的生命週期,spring的BeanFactory和FactoryBean有什麼區別。
以後問工做中,代碼上的一些注意細節,總共面試時間將近2小時,最長時間一次面試。給個人感受面試氛圍很好,有位面試官全程都是笑着的,另外一位稍微嚴肅,都挺好。
福利分享
Java程序員面臨的競爭壓力愈來愈大。那麼,做爲一名Java程序員,怎樣努力才能快速成長爲一名高級的程序員或者架構師,或者說一名優秀的高級工程師或架構師應該有怎樣的技術知識體系,這不只是一個剛剛踏入職場的初級程序員,也是工做三五年以後開始迷茫的老程序員,都必需要面對和想明白的問題。爲了幫助你們少走彎路,我總結出一個Java程序員的工做2-5年成長路線圖。
如何學習才能快速入門並精通呢? 當真正開始學習的時候不免不知道從哪入手,學習時頻繁踩坑,致使效率低下影響繼續學習的信心,最終浪費大量時間。 爲了讓學習變得輕鬆、高效!今天給你們免費分享一套教學資源,幫助你們在成爲架構師的道路上披荊斬棘。 羣內已經將知識體系整理好(源碼,筆記,PPT,學習視頻)進羣免費領取。 加Q羣:948368769,免費領取資料 享給喜歡Java,喜歡編程,有夢想成爲架構師的程序員們,但願可以幫助到大家。 最後,作一個愛思考,懂思考,會思考的程序員