背景:人生不可以後悔,但它卻可以轉彎。不知不覺到新的公司上班已經一個多星期了,然而之前面試了好幾家公司都沒有好好總結下;新公司給我的總體印象還不錯,是一家非外包的創業型企業,就是公司是做大數據項目的,之前我是搞Java開發的,然後現在自己hadoop不瞭解、Linux不熟悉、測試用例也沒寫過等,搞得 ...
背景:人生不可以後悔,但它卻可以轉彎。不知不覺到新的公司上班已經一個多星期了,然而之前面試了好幾家公司都沒有好好總結下;新公司給我的總體印象還不錯,是一家非外包的創業型企業,就是公司是做大數據項目的,之前我是搞Java開發的,然後現在自己hadoop不瞭解、Linux不熟悉、測試用例也沒寫過等,搞得一臉被嫌棄的樣子,心疼自己兩秒;但是我每天上班也是堅持硬著頭皮搞,邊搞邊學,希望自己不要成長太慢,被公司開了就尷尬了;總之,2019乾就完了。
Java面試總結:
本人2017年畢業的,面試的是Java初級開發,拿到的offer有9k、10k、11k和12k,多面試幾家,總有一家眼瞎,儘管都是低開,但面試總結對我此等初級開發段位還是管用的。
1、為什麼辭職?
這個問題幾乎每次面試都被問到了,蛋疼,感覺對企業忠誠度太低不怎麼OK,然後論人是非者必是非之人;於是我就說想換個更niubility的公司,同時工資也要往上漲,所以辭職了。
2、最近做了什麼項目,主要負責哪些模塊?
簡單講了最近做的一個智慧園區的項目:我們這個智慧園區項目主要服務於政府、教育、地產和化工廠行業,她重新定義了園區,幫助客戶更高效、更敏捷地解決傳統技術手段很難甚至無法解決的業務問題,使智能、安全、便捷、高效以及低能耗真正落地園區;其內部還有一個響亮的口號“平行移動 批量複製 有競爭力”;主要模塊有綜合態勢、事件中心、安防管理、設備管理、人員通行、車輛通行、設備主數據和配置中心;用的是SpringCloud微服務架構開發的,我主要負責人員通行和車輛通行模塊;車輛通行的主要業務邏輯如:一輛車到距離攝像頭5米左右的距離,攝像頭就會對該範圍內對移動車輛抓拍,然後把拍到的視頻流發送到EI,EI快速分析視頻流,然後再通過kafka消息隊列把成功識別之後到車輛信息(包括車輛圖片url、車牌號、車輛進車時間等)發送到IOC平臺進行處理,IOC監聽到消息後,首先通過Redis對消息進行去重,然後根據車牌號判斷該車輛是否有許可權進出,鑒權結束後一方面把車輛圖片上傳到文件存儲伺服器,另一方面通過Websocket時時推送把當前的車輛信息發送給前端頁面展示。
3、為什麼平常用String拼接字元串,而不用StringBuffer/StringBuilder?如:String gateKey = "font110"+"_520"
沒答上,回來面試官說String是不可變對象,在後面拼接字元串不好重新創建對象;而用StringBuffer的話,太多就會占用過多的記憶體,特別是迴圈添加時,主要是考慮JVM記憶體才用的String。
4、工作之外下班後喜歡做些什麼?
學習英語、打球、寫博客、看博客和研究新技術。
5、對未來的職業有什麼規劃?
3-5年內進BAT,不過公司平臺和福利都足夠好也沒誰想進BAT。
6、你認為進入BAT的要求有哪些?
1)基礎部分:Java語言基礎部分、Java運行時環境、併發知識於Concurrent包、設計模式和反射、文件IO/NIO、網路IO及網路協議;
2)加薪部分:SpringCloud、Spring、Mybatis等主流框架、Linux伺服器、資料庫優化、緩存服務、負載均衡;
3)加分部分:數據結構與演算法、電腦操作系統、電腦網路、熟練使用一種腳本語言如python、JS等、Github和博客。
7、有研究什麼新的技術?
Apache Camel。
8、項目中對你最具有挑戰的事情或問題?
我認為在項目中溝通和扯皮時最重要的,諸如智慧園區這個項目我們有上游合作伙伴,他們消息隊列時以GBK格式給我們發送消息的,然後我們這邊是以UTF-8接收消息的,造成了車牌號亂碼等問題,還有我們需要調用上游合作伙伴的介面,他們有隨意改動介面的出參格式或是改IP等,此類問題影響惡劣。
9、手寫單例模式?
10、Mysql有哪些引用函數?
When、Then、If、Concat、Field、Format、Lower、ABS等。
11、讀取一個有100萬條數據的文件,並且把著100萬條數據插入資料庫需要註意些什麼?
1)JVM是否可以承受住這麼大的數據量;
2)每當放入1000條數據就提交一次,然後重新new一個Table,賦值給原來的變數、再繼續放入下一個1000條記錄;
3)先取消資料庫表的索引、外鍵和觸發器等會加大寫入的速度。
12、Python基本數據類型?
Stiring、Digit(數字)、List、Tuple(元組)、Sets(集合)、Dictionary、date。
13、說說你對Socket通信的理解?
服務端先初始化Socket,然後與埠綁定,對埠進行監聽,調用accept阻塞,等待客戶端連接;在這時如果有個客戶端初使化了一個Servlet,然後連接伺服器(connect),如果連接成功,這時客戶端與服務的的連接就建立了;客戶端發送數據請求,伺服器端接收請求並處理,然後把回應數據發送給客戶端,客戶端讀取數據,最後關閉連接,一次交互結束。
14、Websocket怎麼建立連接並保證長鏈接?
Websocket進行全雙工的通信,只需要建立一次連接(長連接);其不像xml(AJAX)請求實現長輪詢,因為不停的連接,HTTP連接始終打開,效率低且浪費資源。
15、介面interface和程抽象類Abstract?
1)抽象類是對一種事物的抽象即對類抽象,而介面是對行為的抽象;
2)抽象類和介面都不能直接實例化,若要實例化,抽象類變數必須指向實現所有抽象方法的自類對象,介面變數則必須指向實現所有介面方法的類對象;
3)抽象類要被子類繼承,介面要被類實現;
4)介面中定義的變數只能是公共的靜態的常量,抽象類中的變數則是普通變數;
5)介面可以繼承介面,並支持多繼承,但類只能當根繼承;
6)當關註一個事物的本質時,用抽象類,而當關註一個操作時,用介面。
16、Mysql什麼情況下會造成表鎖死?
1)alter table 大表操作會死鎖;
2)高併發插入可能會死鎖;
3)多個事務同時鎖定一個資源時也會造成死鎖。
17、用Redis怎麼做一個排名?
用Redis的排序集合類型Sortset()實現排行榜。
18、資料庫表主鍵又何作用?
主鍵可以保證數據不會重覆。
19、REST是什麼?
REST描述的是一種網路中Client與Server的一種交互形式;REST本身不實用,實用的是如何設計RESRful API(REST風格的網路介面)。
20、什麼是微服務?
微服務Microservice的核心就是將傳統的一站式應用,根據業務拆分成一個一個的服務,徹底的去耦合,每一個微服務提供單個業務功能的服務,一個服務做一件事情;從技術角度看就是一種小而獨立的處理過程,類似進程的概念,能夠獨立啟動或銷毀,擁有自己獨立的資料庫。(業務拆分、單獨進程、獨立資料庫)
21、什麼是SpringCloud?
SpringCloud是一個基於SpringBoot的快速構建分散式系統的工具集;其基於SpringBoot提供類一套微服務一站式解決方案,包括服務註冊與發現Eureka、配置中心Config、全鏈路監控、服務網關Zuul、負載均衡Ribbon、熔斷器Hystrix等組件的微服務協調治理框架。
22、微服務優缺點?
優點:
1)每個服務足夠內聚,足夠小,代碼容易理解,這樣能聚焦一個置頂的業務功能或業務需求;
2)開發簡單、效率高,一個服務可能就是專門做一件事;
3)微服務能夠被小團隊開發,這個小團隊可由2-5個開發人員組成;
4)微服務是松耦合的,是具有功能意義的服務,無論在開發還會是部署階段都是獨立的;
5)微服務可以使用不同的語言開發;
6)易於和第三方集成,微服務允許容易且靈活的方式集成自動部署,通過持續集成工具如Jenkins、Hudson等;
7)微服務只是業務代碼的邏輯,不會與HTML、CSS或其他界面組件混合;
8)每個微服務都有自己獨立的存儲,可以有獨立的資料庫,也可以有統一的資料庫;
缺點:
1)開發人員要處理分散式系統的複雜性;
2)多服務運維難度大,隨著服務的增加,運維的壓力也在增大;
3)系統部署依賴;
4)服務間通信成本;
5)數據一致性。
23、Listen & Filter兩者的作用和區別?
首先知道web.xml的載入順序是:Context-Param --> Listener --> Filter --> Servlet
1)Listner是一種觀察者模式的實現,我們在web.xml中配置Listner時就是把一個被觀察者放入觀察者的觀察對象隊列中,當被觀察者觸發了對象事件時,觀察者做出相應的相應Response;具體的實現(在jsp/Servlet中)是在web.xml中註冊Listener,由Container在特定事件發生時呼叫特定的實現Listener類;應用場景:統計網站線上人數、清除過期session。
2)Filter過濾器的使用可以改變一個Request或改一個Response,Filter不是一個Servlet,它不能產生一個Response,但是能夠在一個Reqeust到達Servlet之前預先處理Request,也可以在一個相應Response離開Servlet時處理一個Response;應用場景:設置字元編碼、過濾敏感辭彙、URL級別的許可權訪問控制、壓縮相應信息。
24、悲觀鎖 & 樂觀鎖?
悲觀鎖:總是假設最壞的情況,每次去拿數據的時候都認為somebody會修改,所以每次在拿數據的時候都會上鎖;傳統的關係型資料庫里就用到了很多的這種鎖機制,如行鎖、表鎖、讀鎖和寫鎖等,都是在操作之前先上鎖;Java中Synchronized和ReetranLock等獨占鎖就是悲觀鎖實現的;
樂觀鎖:總是假設最好的situation,每次去拿數據時都believe別人不會修改,所以不會上鎖,但是更新的時候會判斷一下在此期間別人有沒有去更新了這個數據(用版本號機制和CAS演算法實現);樂觀鎖適用於多讀的應用類型,這樣可以提高吞吐量,像資料庫提供的類似於write-condition機制,其實都是提供的樂觀鎖。
25、抗住千萬級流量系統的架構思路?
1)實現高併發
服務拆分:將整個項目拆分成多個子項目或模塊,將項目平行擴展;
服務化:使用服務註冊與發現;
消息隊列:解耦、非同步處理;
緩存:各種緩存帶來的併發;
2)實現高可用
集群、限流、降級、資料庫(讀寫分離、主從分離);
3)業務設計
Nginx代理等。
26、Spring最主要的兩大特性?
AOP & IOC
IOC(控制反轉)是Spring的一個容器,他不是一種技術,而是一種思想,是基於面向對象編程的,可以設計出松耦合、更優秀的程式;簡而言之,如A類要引用B類中某個方法,傳統編程是在A類中實例化一個B類,也就是通過new,然後打點調方法,而代碼的高度耦合最大的原因就是用了new;But利用Spring框架就可以將實例化的過程交給IOC容器,通過配置文件中的設置Bean或者B類中添加註解,A類可不通過new而通過ApplicationContext的getBean方法得到實例,然後打點調用方法,如此就減少了兩個類的耦合;IOC三種註入方式:介面註入、構造方法註入、賦值方法註入(Setter)。
AOP(面向切麵/介面編程),同樣是一種思想非技術;和OOP(面向對象編程)相比,AOP是對OOP的補充;OOP是靜態的抽象,AOP是動態的抽象;簡而言之,就是將一個工程中與源代碼無關,但是很多地方都需要用到,抽出來也不影響源代碼上下文的那一部分代碼抽出來,然後要用的時候就織入,進行使用;就比如我們打算結婚,婚禮的整個流程我們可以自己負責,但是會spend我們的時間和精力,這是我們可以選擇將婚禮交給婚慶公司,而自己不再負責婚禮的籌備過程,只需要在婚禮當天使用婚慶公司給我們的成果,So也說AOP是基於代理模式下進行的。
27、一些Spring常用的註解的含義?
@RequstParam:參數拼接在URL後面才可以接收;
@ReqeustBody:請求正文里的Json字元串;
@RequestPart:上傳文件接收用的;
@RequestBody是把返回的實體轉為字元串;
@RestController包含了@ResponseBody和@Controller。
28、動態代理 & 靜態代理?
動態代理是在程式運行期間,由Java反射等機制動態生成,也就是在將class文件載入到JVM時期完成的工作,此方式不會修改位元組碼;
靜態代理是在程式運行前已經存在代理的位元組碼文件,也就是編譯時期已經完成代理工作了。
29、SpringMVC運行原理?
①用戶向伺服器發送請求,請求被Spring前端控制Servlet DispatchServlet捕獲;
②DispatcherServlet對請求URL進行解析,得到請求資源標識符(URI),然後根據該URI調用HandlerMaping活的Handler配置相關的對象,以HandlerExecutionChain對象的形式返回;
③DispatherServlet根據獲得的Handler,選擇一個 合適的HandlerAdapter;
④提取Request中的模型參數,填充Handler入參,開始執行Handler(Controller),在填充Handler的過程中,Spring會做一些額外的工作如:數據格式化、數據轉換和驗證等;
⑤Handler填充完畢後,向DispatherServelt返回一個ModelAndView對象;
⑥根據返回的ModelAndView,選擇一個合適的ViewResolver視圖解析器,並返回給DispatherServlet;
⑦ViewResovler結合Model和View來渲染視圖;
⑧將渲染的結果返回給客戶端。
30、SpringAOP動態代理實現步驟?
動態代理:https://www.cnblogs.com/taojietaoge/p/10463649.html
①實現InvocationHandler介面,重寫invoke方法,創建自己的調用處理器;
②通過Proxy類指定ClassLoader對象和一組interface來創建動態代理類;
③通過反射機制獲得動態代理的構造函數,其唯一參數類型是調用處理器介面類型;
④通過構造函數創建動態代理類實例,構造時調用處理器對象作為參數傳入。
31、談談對HashTable和HashMap理解?
HashMap + HashTable:https://www.cnblogs.com/taojietaoge/p/10301711.html
32、談談對Java記憶體的理解?
Java記憶體:https://www.cnblogs.com/taojietaoge/p/10264416.html
33、@Autowire和@inject有什麼區別?
相同點:二者同樣可以註入對象,在屬性域上面註入、在set方法或者其他需要註入點方法上註入、在構造器上面註入;
不同點:@Autowire有@required標簽,允許對象為空;@inject沒有@required標簽,強制要求對象不能為空。
34、BeanFactory和ApplicationContext的區別?
1)BeanFactory是Spring的心臟,Spring使用BeanFactory來實例化、配置和管理bean,BeanFactory是IOC容器的核心介面;
2)ApplicationContext是IOC容器的另外一個重要介面,他繼承了BeanFactory的基本功能,同時也繼承了容器的高級功能,如MessageSource國際化資源介面、ResourceLoad等;
3)BeanFactory採用的是延遲載入形式來註入Bean等,只有在使用到某個Bean時才會調用getBean方法對該Bean進行載入實例化,這樣就不能發現一些存在的Spring配置問題;
4)ApplicationContext則會在容器啟動時,一次性創建所有的Bean,這樣在容器啟動的時就可以發現Spring中存在的錯誤配置,但ApplicationContext占用記憶體空間,且程式配置Bean較多時啟動緩慢。