從深圳回武漢的面試感想以及一些面試題
從深圳回武漢的面試感想以及一些面試題
大家好,我是ITDragon龍,今天分享一些面試中常問的題目,和一些面試感受。我是四月二十五號離職,二十六號上午八點從深圳出發,下午三點到武漢。二十七號便開始參加面試。每天上午去面試,中午去小區監工,下午再去面試,中途可能還有幾個電話面試。面試算的上頗有經驗吧!這幾天的面試給我很多感受。
一、面試的幾家公司大部分是北上廣深在武漢建立的研發部門。原因很簡單,武漢人才性價比高。
二、面試的幾家公司大部分面試官都會很直接告訴你加班強度很大。
三、無關技術,從深圳回到武漢,工資大概要打七折。原因嘛,五花八門。
因為房子和交通,我選擇公司的範圍縮小了很多。因為回來匆忙,對於面試題和公司都沒有很好的了解,因此在面試中一直處於劣勢。現在把自己的面試經驗分享出來,幫大家把部分坑填平。預祝大家都能拿高薪。我這炮灰的作用也算是盡職了。
找工作不將就
找工作不能將就,不能進公司後發現不滿意而選擇離職,這樣對自己和對公司都有損失。所以一開始就要問清楚。以下是我比較在意的四個點,僅供參考。
一、加班強度:現在程序員加班已成常態,產品發布還要等到夜深人靜的時候。我覺得程序員就像一支蠟燭,燃燒自己照亮世界。加班一定要適量。不加,老板不會放過你!多加,醫生也不會放過你!所以我希望加班強度不能太大。
二、出差頻率:有的人喜歡出差,有的人不喜歡出差,比如我。
三、額外待遇:比如每月的績效獎金,項目現金,一年的年終獎。年終獎一定要問清楚:未滿一年的是怎麽計算?除了每月固定工資外,一定要有其他額外福利,不然動力從何而來。
四、接觸領域:如果有機會進入貴公司,最好問清楚接觸的技術領域,最好是主流的技術。不建議推倒車。
最後註意點:你用一個月加班換來的錢,還不夠在醫院消費一次。
技術面試題
你需要註意:回答技術問題的時候,面試官希望聽到更多的答案
IO和NIO的區別
這是一個很常見的問題,如果單純的只回答IO和NIO的區別,只能算及格。我個人覺得應該從以下幾個方面回答:
1)、IO簡介,
2)、TCP的三次握手,因為這也是兩者的區別之一,
3)、NIO簡介,
IO:(Block-IO)是一種阻塞同步的通信模式。是一個比較傳統的通信方式,模式簡單,使用簡單。但並發處理能力低(每次連接都會創建新的線程進行鏈路處理),通信耗時(TCP三次握手),依賴網速。
TCP三次握手:
第一次握手:建立連接,客戶端發送syn包到服務器端,等待服務器確認
第二次握手:服務器收到客戶端傳來的syn包,給客戶端返回ack和syn包,等待客戶端確認
第三次握手:客戶端收到服務器傳來的ack+ayn包,向服務器發送ack包,連接建立成功
NIO:(New IO / Non-Block IO)是一種非阻塞同步的通信模式。客戶端和服務器之間通過Channel通信(避免TCP建立連接使用三次握手帶來的開銷)。NIO在Channel進行讀寫操作。這些Channel都會被註冊在Selector多路復用器上。Selector通過一個線程不停的輪詢這些Channel。找出已經準備就緒的Channel執行IO操作。
參考文檔
IO,BIO,AIO區別
TCP三次握手詳細介紹
Java堆和棧的區別
1)、堆和棧的共同點,
2)、堆和棧的區別,
3)、線程之間數據共享,
Java內存分兩類,一類是堆內存,一類是棧內存
堆:主要用於存儲實例化的對象,數組和方法區。由JVM動態分配內存空間。一個JVM只有一個堆內存,線程是可以共享數據的。
棧:主要用於存儲局部變量和對象的引用變量,每個線程都會有一個獨立的棧空間,所以線程之間是不共享數據的。
談談內存溢出
1)、先回答什麽是內存溢出,
2)、再談談內存溢出的原因,
3)、最後提出幾個內存溢出的解決方案,
內存溢出:程序運行實際使用的內存大於虛擬機設置的內存
溢出原因:
1)、虛擬機配置參數設置不合理
2)、代碼中出現死循環或者產生大量的重復對象實體
3)、數據流如果沒有閉關也容易導致
4)、內存中一次性加載的數據量過於龐大
5)、大量的垃圾不能被JVM回收
解決方案:
1)、最直接,最不負責的方案就是修改JVM啟動參數
2)、正確流程是通過檢查錯誤日誌,查找OutOfMemory錯誤原因,然後修改bug
JVM垃圾回收機制
1)、先回答什麽是JVM認為的垃圾,
2)、都有那些常用的垃圾回收算法,
3)、都有那些常用的垃圾回收器,
JVM認為那些不被使用的對象就是垃圾,需要從內存中除掉。
常用的垃圾回收算法有:引用計算法,標記清除法,標記壓縮法,復制算法,分代,分區思想
引用計算法:古老的算法,對象被引用時加一,引用斷開時減一,若為零則被當成垃圾回收。頻繁加減操作性能低。
標記清除法:先把垃圾"標記"(遍歷所有的GC Roots,然後將所有GC Roots可達的對象標記為存活的對象),後統一"清理"。清理後的內存空間不連續,性能不高。
標記壓縮法:在標記清除法的基礎上做一個壓縮功能。
復制算法:內存被分為兩個大小相同的A,B兩塊,使用A內存時,將把A內存中的活對象復制到B,然後清空內存A中的所有對象。使用B內存也是一樣的。缺點是內存變小了。
分代思想:新生代,老年代(新生代中的對象經過頻繁的GC中存活下來的對象)。新生代因為存活率低,需要復制的對象少,建議用復制算法。老年代存活率高,需要清理的對象少,建議用標記壓縮法。
分區思想:將整個內存分為多個獨立空間。在每個獨立空間進行垃圾回收,提高系統性能。
串行垃圾回收器:使用單線程進行垃圾回收
並行垃圾回收器:使用多線程進行垃圾回收,對性能要求比較高
CMS收回器:並發回收器,比並行更快,當占用的資源更多,可以盡可能減少系統停頓時間
G1回收器:JDK1.7之後提供的新的收集器,是基於標記壓縮的算法,特點是針對整個java堆進行
參考文檔:
JVM系列博客:https://blog.csdn.net/column/details/javavirtualmachine.html
lock和synchronized區別
1)、簡單介紹兩者的區別
2)、工作中建議使用synchronized的原因
3)、JDK1.6之後對synchronized的優化
synchronized:關鍵字,在jvm層面上,線程正常執行完後會釋放鎖,若線程發生異常則由jvm釋放鎖,jdk1.5之前沒有鎖競爭機制,容易出現線程一直阻塞的情況,只適合少並發量使用。
Lock:類,必須在finally中釋放鎖,因為添加了鎖競爭機制,不會出現線程一直等待的問題,適合高並發量使用。
工作中建議使用synchronized關鍵字,原因很簡單,jdk1.6之後對synchronized做了大量的優化。為了減少獲得鎖和釋放鎖所帶來的性能消耗,引入了“輕量級鎖”和“偏向鎖”來提高性能。
一、適應性自旋
降低了線程在等待鎖的過程中的開銷。因為線程從掛起到恢復是很耗時的,有些線程在掛起後很短的時間內就可以獲取鎖,通過漫無目的的循環讓線程暫不掛起。適應性自旋表現在自選的循環次數是根據實際情況來定。
二、鎖消除
刪除一些沒必要的加鎖操作。
三、鎖粗化
雖然減小鎖的粒度,可以提高性能。但有些代碼明明只需要加一把鎖,你非要加多個??鎖粗化可以把多次加鎖和解鎖合並成一次,用以提高效率。
四、輕量級鎖
輕量級鎖所適應的場景是線程交替執行同步塊的情況,如果存在同一時間訪問同一鎖的情況,就會導致輕量級鎖膨脹為重量級鎖。
五、偏向鎖
引入偏向鎖是為了在無多線程競爭的情況下盡量減少不必要的輕量級鎖執行路徑,因為輕量級鎖的獲取及釋放依賴多次CAS原子指令,而偏向鎖則是在只有一個線程執行同步塊時進一步提高性能。
參考文檔:
lock和synchronized區別:https://blog.csdn.net/wangtaomtk/article/details/52264043
lock和synchronized區別:https://blog.csdn.net/u012403290/article/details/64910926?locationNum=11&fps=1
HashMap底層實現
1)、簡單談談HashMap的底層實現
2)、HashMap和HashTable的區別
3)、工作中線程安全的HashMap使用
HashMap的底層是鏈表散列的數據結構,即數組和鏈表的結構。通過計算key的hash值確定數組的位置,若該位置已經有值,則往該元素後面添加,形成一個鏈表。每個Entity存儲hash,key,value,next四個值。在檢索中,通過hash找到數組的位置,然後在通過key遍歷鏈表,直到找到為止。在jdk1.8以後,若鏈表長度超過闕值後,會將該鏈表轉為紅黑樹,以提高檢索效率。紅黑樹是自平衡查找二叉樹,解決了二叉樹多次插入新節點導致的不平衡。當紅黑樹插入新節點時會通過[變色]和[選擇]來滿足自身規則,詳情可以參考文檔連接。
HashMap,HashTable,LinkedHashMap區別
1)、HashMap不是線程安全的,HashTable是線程安全的,內部通過synchronized修改加鎖,其性能較差
2)、HashMap允許一個key為null,HashTable不允許
3)、HashMap的初始容量是16,而HashTable的初始容量是11
4)、工作中HashMap的使用頻率較高,若希望值有序則使用LinkedHashMap,若考慮線程安全則使用ConcurrentHashMap,ConcurrentHashMap使用分段式鎖性能比HashTable好。
參考文檔:
ArrayList和LinkedList的區別,Java 常用List集合使用場景分析
HashMap的實現原理:https://blog.csdn.net/tuke_tuke/article/details/51588156
hashMap和hashTable的區別:https://www.cnblogs.com/aspirant/p/6856487.html
什麽是紅黑樹:http://www.sohu.com/a/201923614_466939
Java單例模式實現
1)、什麽是單例模式
2)、常見的單例模式有那些
3)、寫出其中的一種
單例模式:某個類只有一個實例,而且自行實例化並向整個系統提供這個實例。
常見的單例模式有:懶漢模式,餓漢模式,靜態類內部加載
// 線程安全的靜態類內部加載
public class SingletonDemo{
private static class SingletonHolder{
private static SingletonDemo instance = new SingletonDemo();
}
public static SingletonDemo getInstance() {
return SingletonHolder.instance;
}
}
參考文檔:
https://www.cnblogs.com/cielosun/p/6582333.html
談談MVC模式
聽到這個問題時,我是竊喜的,多麽簡單的問題,可是面試的時候,卻不知道該怎麽回答。
MVC:model,view,controller。
Model:模型層,負責實現業務邏輯,操作數據庫
View:視圖層,負責頁面展示
Controller:控制層,負責處理請求
我們通過實際的框架來了解,
SpringMVC,它實現了mvc設計模式的web框架。用戶發送的請求會通過前端控制器(DispatcherServlet),根據URL映射到對應的Handler中。而這個Handler可以是用註解@RequestMapping修飾的方法,而這個方法所在的類可以用註解Controller修飾表明該類是一個控制層。可以在方法裏面調用接口完成業務邏輯的操作和數據修改,將返回的結果放在ModelAndView變量中。DispatcherServlet會通過視圖解析器拼接返回頁面的路徑,並將數據放到作用域中,渲染給用戶。實現業務邏輯的接口可以理解為Model層,處理請求的類可以理解為Controller層,頁面就是View層。
談到SpringMVC,就不會少了Struts2,
Struts2也是一個基於MVC設計模式的Web應用框架,在web.xml文件中將符合要求的請求交給Servlet處理,這個 Servlet再參考struts-config.xml文件找到對應的action方法,執行完成後關聯到對應的頁面。SpringMVC比Struts2簡單了很多。
我們再簡單談談Hibernate,Mybatis,SpringData
我們還可以再談談Spring
其他問題
還有一些因為時間和精力問題,簡單整理的問題。
一、redis事務是怎麽做的?
redis的事務主要是通過multi(開啟事務),exec(提交事務),watch(監控版本號)幾個命令完成的。
二、如何實現搶購防超賣功能?
搶購,秒殺的場景下既要保證用戶體驗, 又要防超賣。其實很簡單,減少數據庫的調用,1000個商品限時搶購,就是1000個數字減一。通過加鎖保證線程安全。使用緩存提高效率。
三、如何設計數據查詢接口保證數據的安全和性能?
安全:服務器接口令牌驗證;查詢參數長度校驗;查詢參數格式校驗(避免sql註入);
性能:索引優化;Ehcache本地緩存;redis緩存預熱;
四、Nginx如何做權限攔截
Nginx和lua可以實現權限攔截
五、2*16如何最快計算結果
向左移動4位
六、架構如何用一個字段設置10個Boolean型權限
用0,1表示false和true
七、你對我們公司的了解麽?
先暫時到這裏,喜歡的朋友可以關註我,覺得這篇文章對你有幫助也可以點贊,如有問題,請盡快聯系我,會及時修改。
從深圳回武漢的面試感想以及一些面試題