前言:從過年前就萌生出要跳槽的想法,到過年來公司從3月初提出離職到23號正式離職,上班的時間也出去面試過幾家公司,後來總覺的在職找工作總是得請假,便決心離職後找工作。到4月10號找到了一家互聯網公司成功應聘上,中間也經歷了很多公司,有外包的、創業的、互聯網的等等各種類型,也收到了很多offer,也有面試不順利的...今天就通過博客來記錄一下自己面試中的問題,圍繞着兩年java到底應該具備什麼樣的水平才能適應現在市場的要求的主題來談一談。
一:面試中的問題
二: 面試中要注意的問題
三:關於最後的選擇
四:兩年java到底應該具備什麼樣的水平
一:面試中的問題
java集合框架:
1:介紹一下java的集合框架
2:HashMap遇見哈希衝突會如何怎麼辦?HashMap是線程安全的嗎?HashMap在高併發下會有什麼問題?然後引入ConcurrentHashMap的原理?
3:Hahtable和concurrentHashMap的區別?
4:數組和ArrayList的區別?Arraylist是如何擴容的?
5:線程池中的阻塞隊列一般會選擇哪種隊列?爲什麼?
6:RetreenLock的原理?AQS的原理?
7:HashMap的容量爲什麼推薦是2的冪次方?
框架類:
1:mybatis的二級緩存有什麼問題?
2:mybaits中的mapper的#{}和${}有什麼區別?哪種可以防止sql注入?
2:我們知道mybatis的mapper和接口之間是沒有對象的,那麼它是如何映射的?
4:說說springmvc的註解有哪些?他們的原理是什麼?
5:springmvc的控制器是單例的嗎?是線程安全的嗎?
6:struts1和struts2的區別?是線程安全的嗎?
7:spring如何解析它的xml文件?
8:spring的核心是什麼?Aop的原理是什麼?
redis相關:
1:redis數據類型有哪些?
2:zset數據類型是如何排序的?
3:redis如何做項目的中間緩存層?
4:redis的Hash的時間複雜度是多少?
數據庫:
1:數據庫索引分爲哪幾種?組合索引有什麼要注意的問題?
2:什麼是悲觀鎖 什麼是樂觀鎖?如何實現悲觀鎖?
3: 數據庫關鍵字的執行順序是什麼?
4:如何進行sql優化?
5:有沒有進行過分庫分表操作?分庫之後如何保持事務一致?
分佈式和微服務:
1:微服務要克服那些問題?微服務系統是怎樣通信的?
2:分佈式環境下如何解決session不一致的問題?
3:分佈式下如何保證id一致?
4:你在dubbo的使用過程中遇到什麼問題?
5: zookeeper的負載均衡算法有哪些?
jdk源碼相關
1:synchronized的原理?它該怎麼用?如何一個方法是synchronized的,其他的非synchronzied線程能進入嗎?
2:cvs中的ABA問題如何解決?
3:volatile的原理是什麼?volatile一定是線程安全的嗎?
4:ThreadLocal是什麼?它的原理是什麼?
5:CountDowanLatch有沒有用過?適合在什麼樣的場景下用?
設計模式相關:
1:實現兩種單例模式
2:講一下觀察者模式
3:spring中都用到哪些設計模式?
4:動態代理模式是如何實現的?
5:你在項目中用到哪些設計模式了?講解一下業務場景
算法相關:
1:快速排序的時間複雜度?手寫快速排序(注意遞歸式和非遞歸式的實現方式)
2:手寫二分查找
3:手寫堆排序
4:一個int數組如何進行奇數和偶數分離?
5:用算法實現String轉double
jvm相關:
1: jvm的垃圾回收算法有哪些?分別解釋一下?
2: 新生代爲什麼要設置兩個survior區?
3:如何通過一個.class文件獲取它的jdk版本?
4:jvm的內存模型?哪些是線程私有的?哪些是公共的?
關於自己的項目(問的時間最長)
1:簡述一下自己的項目?你在其中主要是做什麼的?
2:你在項目中都遇到了哪些難題?最後都是怎麼解決的?
3:項目有多大規模?週期多久(這個很多都問到的)
4:講一下某一模塊的具體實現方式?然後從中挑刺
5:如何解決某一時刻的高併發請求?
6:如何解決訂單支付回調的超時問題?輪詢應該怎麼寫?
其他:
1:秒殺場景如何削峯?
2:http和udp的區別是什麼?
3:ajax的跨域問題
4:nio與io的區別?什麼情況下適合用nio
5: 說說常見的linux命令,linux查看內存的命令是什麼?
7:git遇見代碼衝突了怎麼辦?
8:說幾個常見的maven命令,maven如何排除一個jar包的衝突?
二: 面試中要注意的問題
2.1:一定要有自己的實際項目經驗
按照我這麼多面試經驗?其實有的公司會側重於問自己做的項目經驗,有的公司側重於問問題,一般互聯網公司會對技術要求比較高,既要求項目經驗又要要求技術水平
2.2:可以適當渲染,但是不要誇大其詞
面試的過程中最忌諱的就是誇誇其談,高屋建瓴很厲害,但是一到實際細節都不知所云了,在技術總監面前,其實你吹牛或者是真的會他是一目瞭然的。不懂裝懂,有的面試官又給你臺階下,不然你就卡帶了,這很容易造成面試的不好印象
2.3:要會自我介紹
面試的時候一般的話都會讓你做一個自我介紹,這個要分對象,是技術官還是Hr,如果是技術官側重於綜述一下自己的項目的實際技術棧和技術路線,如果是Hr的話不要用過多的技術語言,而要說一些自己的實際工作經歷或者自己上家公司的運營情況
2.4:關於簡歷
簡歷切記不可太囉嗦,但是不可太簡單,作爲技術的簡歷一般起碼得在3頁,不然HR會覺得你的求職態度不怎麼好,不管如何求職結果如何,一個良好的簡歷會給人留下好的第一印象
三:關於最後的選擇
說實話也接受到很多HR的offer邀請,但是我一般會選擇說考慮一下一天以後再給回覆,切不可直接把話說死,不然後面就尷尬了。實際提供的offer的有一家外包公司,三家創業公司,兩家互聯網公司,最終選擇了一家互聯網公司,雖然實際上班地點有點遠(下了地鐵還得座公交,後來還是選擇騎單車了),但是互聯網公司會給你快的成長速度,並且互聯網技術棧都比較新..相比於傳統企業會有更多的技術挑戰。而外包公司的話,可能環境不怎麼好,我記得自己當初還是個小白的時候,去了外包,那裏的優點就是會有不斷的活,新人進去的話收穫還是挺多的,但是作爲已經有兩年經驗的我,外包很顯然不適合我的後期職業發展。缺點:技術更新迭代的太慢,沒有歸屬感,最後的選擇我個人的意見是選擇技術優先,畢竟以後軟件路還長,技術纔是王道
四:兩年java到底應該具備什麼樣的水平
兩年java的面試過程中遇到了很多挑戰,也遇到了一些不談技術的公司,從上面的面試題可以看出,目前對於java的要求越來越高,水漲船高,畢竟這個行業的人數越來越多,而保持自己的競爭力的唯一方法就是找對方向,不斷學習,注意這裏我提到的第一點是方向,然後纔是學習。給自己制定一個職業規劃,按照這個路線往前走,我其實還在想分佈式微服務這塊以後再深入學習,可是按照市場要求,現在已經刻不容緩了,一些技術架構比如:springcloud、duboo都得保持學習,這樣纔能有競爭力!作爲一名兩年的javaSir,你必須具備以下技能
1:閱讀源碼的能力,多用Intelj idea這個開發工具,而不是eclipse。它是直接支持反編譯class文件的,多讀jdk源碼,吸收優秀的源碼並加以複用
2:做到能夠手寫常見的排序算法,比如快速排序和堆排序、冒泡排序、選擇排序、二分查找這些都是必須的
3:對java的框架有很深入的認識,現在基本流行的ssm框架很多人都會,可是知道一些原理的人就不多了,得不斷研究這些框架本身,它們都是經過無數次錘鍊 出來的優秀框架
4:多用redis\mongodb,傳統的關係型數據庫已經無法市場需求了,這些東西也是面試中的一部分,雖不是重點,但也是加分的選項
5:對於微服務和分佈式,這個是有一定難度的,我在面試人人車的時候,一面很順利,二面被技術總監給pass了,問題就是分佈式不是特別熟悉!要想進入好的互聯網公司,分佈式和微服務是很必須的
6:jvm的底層,這裏要推薦的書就是周志明的《深入jvm虛擬機》這本書了,我總在閒暇時間讀它,所以jvm的問題還是信手拈來的