兩年Java後端開發,面試了幾十家公司的面試分享
從今年5月份就開始面試了,前前後後也有4個多月了吧,面試了幾十家公司,其中有幾十個人的小型創業公司,也有幾百人的上市公司,踩了不少的坑,最後收到了寶能集團的offer,我也決定就去這家了。
看過很多別人的面試分享經驗,這裡我也做一些面試的分享吧。
前言
首先,提前要求自帶簡歷的一般都不太靠譜,特別是小公司要求自帶簡歷,一般都是hr不專業,不想提前把你的簡歷打印出來,或者說不想為了你浪費幾張A4紙,所以這種公司可以直接pass了,除非你特別缺offer,生存都成困難了。
其次,可以提前問一下hr面試流程是什麼樣的,現在很多公司都取消筆試了。眾所周知筆試沒有人監督你,所以可以掏出手機(雖然我沒做過,但是面試看見其他人這樣做過),所以我覺得筆試作用其實沒多少。如果有公司是明確要先筆試,筆試通過再進行面試,而你面試的不是應屆生崗位,就要小心了,先考慮一下那家公司過去面試距離遠不遠,提前去看準網看一下相關的評價,再考慮要不要去面試的事。我之前面過兩家都是需要筆試的,筆試沒通過是直接沒有後面的面試的(有的面試題非常腦殘,下面上圖),來回也比較遠,浪費了我一個上午的時間。
面試準備
面試的時候99.99%的公司都會讓你做一下自我介紹和最近做的一個專案,所以自我介紹和專案要提前打好草稿,特別是不太會說話的。
自我介紹
我覺得簡潔一點就行了,一般面試官都會趁著你自我介紹的時候看簡歷,也沒認真聽你做自我介紹。
下面是我自己打的草稿:
面試官你好,非常榮幸參加貴公司的本次面試。下面我簡單的介紹一下我的個人情況,我叫凌霄,xx年畢業於xxx學院xxx專業。目前在xxx公司工作,主要是從事xxx開發。 通過xxx招聘平臺關注到貴公司崗位的招聘資訊,這個職位比較符合我未來的職業發展,而且貴公司的業務對我都非常有吸引力,非常希望能夠進入貴公司發展。
我對技術有濃厚的興趣,專業知識面寬,技術也相對全面,責任心強,思路清晰,溝通能力好,熟悉JAVA體系, 對各種開發流程和主流架構模式,設計模式和UML,有較強的需求分析、架構設計、專案管理能力,並有豐富的實戰經驗; 出於對工程師文化的嚮往,我在研發團隊管理期間,嘗試了多種方法去建立良性的團隊氛圍,並有效的改善了研發效率; 技術是為產品支撐的,所以我現在也在熟悉產品設計過程,希望可以結合公司發展戰略,營銷策略,跟著團隊打造出一個好的產品。
上面的可以適當簡化一下,能說出來多少取決於你的記憶力。
專案介紹
這個是真的要提前準備好說辭,不然你面試的時候邊想邊說,說起來磕磕巴巴的,你給面試官的第一印象就不好了,至少說明你的表述能力不強。
介紹專案的話可以不用太緊張,面試官才拿到你的簡歷看多久,所以肯定是對你自己的專案是最熟悉的。需要注意的地方就是不要只講一些業務相關的,面試官不需要知道這些,他只關心你的技術能力是否足夠,通過你的描述知道你使用了什麼技術,再根據相關的技術進行提問。
貼一下我的草稿:
我在xx公司做的xx系統,客戶主要是xx,專案的功能主要是提供代理雨傘,代理快遞,代理訂餐,圖書借閱等服務,後臺用的是主體架構是使用Spring Cloud,微服務模組劃分為xxx,我主要負責其中xxx幾個模組的開發, orm用的是mybatis,資料庫是用的mysql,快取是用的redis,前臺用到了vue技術。共有xx個同事參與開發,整個專案持續了xx時間。
面試官會對他感興趣的點進行提問。
專案中遇到的難題
讓我想起小學時經常寫的作文:最難忘的一件事。這可真是太艹了,沒想到小學學的知識現在派上了用場。
專案中遇到的難題,解決了之後其實都不是什麼難題了。我列幾個點可以參考一下:
- 跨域
- 任務排程冪等性
- 使用mq遇到的問題
- 分散式系統中的事務問題
- 記憶體溢位問題
當然最後還是要自己的專業技能紮實,才能獲取源源不斷的offer。
面試經驗
接下來分享一些這段時間的面試公司
騰雲億想
騰訊雲全資子公司,其實就是騰訊雲的外包公司
- 資料庫有哪幾種索引
- springboot原理,如何實現的自動裝配
- springboot打包成jar之後,怎麼做到不重新打包修改他的properties配置檔案
- jvm調優做過嗎,有哪些引數可以調,具體怎麼調
第一次面試,尷尬的是我基本上沒打上來,只回答上了springboot原理,居然還叫我去hr面,要把這個崗位確定下來,我拒絕了。
壘知科技研究院
上市公司,原來叫做建研集團,做建築相關的工程。
- 你用過SpringBoot的哪些註解
- @component,@service,@controller,@controlleradvice,@Repository
- @Autowired,@Inject,@Resource,@Qualifier,一般@Resource單獨使用,@Qualifier會和@Autowired一起用
- @dependsOn
- @Configuration,@bean, @ComponentScan,
- @Aspect,@PointCut,
- @Scope,@PostConstruct,@PreDestory
- Spring的Bean預設是單例還是多例,我想改成多例的怎麼辦
- 專案中用到了rabbitmq,使用中遇到什麼問題
- rabbitmq重複消費怎麼解決,除了資料庫裡查記錄還有其他什麼方法
- 分散式鎖怎麼實現,redis實現方式死鎖怎麼解決
我:資料庫實現,redis實現,zookeeper實現。redis加上一個失效時間 - mysql索引怎麼實現的,btree索引有什麼特點
- 現在有一個聯合索引(A,B) 我有一個sql語句是
select xxx from xxx where A=xxx 會用到索引嗎
select xxx from xxx whereB=xxx 會用到索引嗎 為什麼會是最左匹配原則 - ArrayList實現了哪些介面
說了List、Cloneable、Serializable,我覺得他應該是想問RandomAccess介面,當時沒回答上這個 - 程式碼優化怎麼做的
- nginx怎麼配置負載均衡
- 閉鎖怎麼用,什麼原理
- 二分查詢法,時間複雜度
自我感覺回答得不是很好,但是第二天收到了複試邀請,還挺驚訝的。
複試先是做一套性格測試題,然後就是專案主管來面試我,問了一下畢業學校,為啥學校挺好還是科班出身,為啥畢業會進小公司。然後問了下我現在的職位級別,接下來就巴拉巴拉開始誇他們公司。
然後就是cto面試,也沒問技術,就問了問家裡的情況,未來職業規劃,然後說他是從華為出來的,公司實行狼性文化,加班是經常的。正題來了,他說待遇是不會高於我上家公司的,但是進他們公司未來的發展肯定會很好。我就有點不太舒服,就嘆氣嘛,然後他說我唉聲嘆息比較悲觀,進公司會影響其他人,他需要的是一個時刻保持樂觀的人,能給團隊帶來活力。
我整個人都傻了。
西南凱亞
中國民航的子公司,是一家國企。
先要提前一天做一套線上筆試題,不管有沒有通過,第二天都是要去面試的。
主要是專案相關的,業務上的東西問得多
程式碼優化
mysql優化
jvm記憶體模型
spring cloud用過哪些元件 講講熔斷機制
為什麼離開上家公司
不是很難但是沒有offer,心態崩了。
睿沿科技
做人臉識別相關的,和我上家公司做的產品差不多。
- Hashmap原理
- ConcurrentHashMap原理,為什麼多執行緒條件下效能這麼好
我從sync在1.6做的優化談的,他從鎖的粒度方面談的 - 專案相關
- 程式碼優化
- mysql優化
- spring的aop怎麼實現的
- 每天抓拍的資料量比較大,有做過分庫分表嗎
用的shardingjdbc 還有mycat,中小公司一般用shardingjdbc, - Rabbitmq實現原理
不知道
後面兩個沒有回答好吧,所以沒有後續了。
小海豚能源科技
這家應該是要找做全棧的吧,開頭就問我好幾個前端相關的,我直接懵了,理所當然的沒有後續了
- 用過jquery哪些框架
- es6語法熟悉嗎
- vue用過哪些元件
- spring用過哪些註解
- 使用@autowired注入的時候,如果這個介面有多個實現,怎麼指定注入哪一個的實現
- eureka搭過叢集嗎
- mysql優化,什麼時候不會用到索引
- select *,可能會導致不走索引
- where後面有函式運算,導致不走索引
- 索引不適用於隱式轉換的情況,比如你的SELECT * FROM T WHERE Y = 5 在Y上面有一個索引,但是Y列是VARCHAR2的,那麼Oracle會將上面的5進行一個隱式的轉換,SELECT * FROM T WHERE TO_NUMBER(Y) = 5,這個時候也是有可能用不到索引的。
- like查詢使用萬用字元開頭不會用到索引
但是這些好像不是他想要的答案,我也猜不透。。
- 接受長期出差嗎
開通金融
做網際網路金融的,公司總部在北京,我面試的時候是在成都的新網銀行公司,看這個模式應該就是駐場開發了,但是公司本身不是外包。
- springboot和spring的不同
- springboot特性,自動裝配怎麼實現的
- spring用到哪些元件,具體場景
- spring預設是單例還是多例,全域性變數會有什麼問題
- spring事務傳播行為、隔離級別
- aop實現方式,jdk動態代理和cglib動態代理區別
- jdk lambda表示式幾種使用方式,取最大和最小值,list轉map,list中有重複的怎麼辦
- 執行緒池 有哪些引數,各個引數的意義
- ioc容器有什麼優點
- jvm 堆疊,區別,執行緒共享還是執行緒私有的
- springcloud元件、用途,負載均衡的幾種演算法
- 分散式事務怎麼做的
- mybatis一對多,多對多怎麼做
- jpa和mybatis區別
- vmstat命令幹嘛的
- redis檢視記憶體佔用命令
- mysql匯入大量資料怎麼優化
- mysql有一條資料死鎖了,怎麼排查問題,mysql表死鎖,怎麼排查
- nginx反向代理是什麼,正向代理呢
這次面試回答得挺好的,hr也打了好幾次電話說面試官對我挺有意向的,就是一頓操作猛如虎,一問工資0.9。而且我當時還是在職,要求我一週到崗,我就沒去。
蘭亭集勢
做海外電商的公司,但是進去之後是做一些小系統的開發,問的問題有點像校招一樣,我是應屆畢業生說不定能答出來。
- 看過開源框架原始碼嗎,SpringBoot自動裝配原理
- 寫個冒泡,寫個單例模式
- mybatis和jdbc怎麼防止sql注入
- 單一職責原則是什麼,裡式替換原則是什麼
- 3NF是什麼
- 介面定義一個變數,這個變數的預設作用域
- 有沒有自己搭建過微服務
- linux怎麼看java程序,除了jps和top命令還有其他的嗎
- 最近看什麼書,我回答多執行緒併發相關的,他:沒用,要在專案裡用才有用
- 最近在學什麼技術?docker,他:沒用,很簡單不需要學習
- 有個部門表,怎麼設計他的欄位,獲取一個部門下的所有子部門,除了遞迴還有什麼方法?加個code欄位,通過部門字首like查詢
京東物流(自帶簡歷)
朋友內推的,聽他說是穩了,去面就能過,結果還是翻車了。
- java特點描述一下,繼承封裝多型分別是什麼意思
- synchronized和lock區別
- ConcurrentHashMap執行緒安全怎麼實現的
- 建立執行緒的幾種方式,建立執行緒池幾個引數的含義,執行緒飽和策略
- sleep和wait區別
- spring是單例還是多例,多執行緒併發會出現什麼問題
- SpringBoot如何解決跨域,具體怎麼配置
- 全域性異常捕獲怎麼做的
- SpringSecurity的前後端分離,登入怎麼做的
我:攔截登入的url,然後獲取到使用者名稱和密碼,把這個使用者名稱和密碼交給manager,manager會交給具體的provider處理,provider會呼叫UserDetailsService的方法完成驗證。
這裡是我失誤了,他說使用者名稱和密碼時通過getattribute 獲取到的嗎,我說是的。 - 怎麼設計一個安全的對外介面
- 單執行緒的redis為什麼這麼快
- redis持久化方式
- 什麼是聚簇索引,什麼是非聚簇索引
- mysql事務隔離級別
- 你覺得你能承擔獨立開發的任務嗎
其他問題回答得挺好的,自我感覺不錯,本來以為能收到offer的,但是朋友說那個面試官覺得我不行,不能承擔獨立開發系統的任務,估計是第8個問題回答失誤了吧,其他我覺得我回答沒有問題。
教育家網路科技
面試的人比較多,所以是群面,一個面試官對應多個面試者。雖然我回答得比另外一個面試者好很多,但是沒有收到offer,很迷,真的很迷。
- 介紹專案,然後基本上就圍繞著專案的業務說
- 對金額的計算用什麼型別,資料庫中用什麼型別儲存
- SpringBoot怎麼自定義註解
- mysql優化,like查詢的時候,資料量很大,如果like查詢以%開頭,不會走索引,怎麼優化。多表關聯查詢,怎麼優化
- 程式碼優化怎麼做的,平時重構從哪方面考慮
海康交通大資料
海康下面的一家分公司,主要做車輛交通相關大屏資料統計報表之類的,面試官和我一個學校的學長,開頭就問我是哪個老師教的,嚇我一跳哈哈哈哈,我以為給老師丟臉了。
- HashMap原理,底層結構,1.7和1.8區別,頭插法還是尾插法、執行緒安全嗎
- ConcurentHashMap在什麼地方加的鎖,1.7和1.8區別,1.7用的segment,1.8用的synchronized
- lock和synchronized這兩個區別,1.6之後對synchronized做了什麼優化
- 偏向鎖、輕量級鎖是怎麼做到的,我回答的是每個物件都有物件頭,物件頭裡做的標記,然後他問我物件頭裡有哪些資訊
- list和陣列區別,哪個會記憶體洩漏,查詢的話哪個快點。我覺得查詢是一樣快的,因為list本來底層就是陣列
- 執行緒池各個引數介紹一下,原理是什麼。你常用哪種執行緒池,為什麼?
- 有哪些佇列,你執行緒池一般用哪種佇列
- spring怎麼解決迴圈依賴
- jdk動態代理和cglib區別,哪個更快,有沒有看過他們生成的位元組碼檔案
- cloud相關的元件用過哪些,hystrix熔斷原理是什麼,除了執行緒池還有什麼。熔斷有個半開狀態,有什麼用
過程還是挺愉快的吧,就是薪資待遇沒有談到位,比較可惜。
咻電科技(自帶簡歷)
一家做共享充電寶的公司,面試官又是和我一個學校的學長,但是沒有給我放水,很生氣。
問題:
- spring生命週期
- 執行緒池有幾種建立方式
- 執行緒生命週期
- eureka原理
- lock和sync區別
- 有一個表有幾個億的資料,寫sql分頁查詢怎麼優化
- redis記憶體淘汰策略有幾種
- dubbo熟悉嗎
- 髒讀幻讀不可重複讀,怎麼解決
- jquery冒泡瞭解嗎
最後問了一些學習相關的建議,收穫挺多的。
武漢佰鈞成
外包公司,給平安做的一個專案,電話面試,外包都喜歡這種方式。
- 設計模式用過哪些
- 程式碼優化怎麼做的
- bio和nio區別
- springcloud用過哪些元件
- mysql優化,有做過sql從幾秒優化到幾十毫秒的嗎
- 專案併發量多大
- 裡式替換原則是什麼
- tpc/ip協議
- 效能優化怎麼做
外包不是很好進嗎,但是我沒有收到offer。
成都房聯雲碼
- 你怎麼看單例模式,寫一個雙重鎖檢測的單例模式
- string、stringbuilder、stringbuffer區別
- arraylist、linkedlist區別
- hashmap1.7 、1.8底層結構區別
- hashmap、hashtable區別
- 執行緒的生命週期
- spring事務傳播行為,底層實現原理
- 宣告bean的幾種方式
- spring預設是單例還是多例,怎麼實現多例
- springmvc流程
- jvm記憶體模型
- lock和synchronized區別,最大的區別是
- 程式碼優化和sql優化
- 分散式,session怎麼解決
- redis優點
- 對外介面怎麼保證安全,光是md5簽名加密不行,還有其他方法嗎
- 有一個功能模組,你會怎麼安排時間,如果有一個緊急任務完成不了怎麼辦
- 平時怎麼學習的
面完問了一下期望薪資,然後約了二面,二面就簡單問了一下專案相關的,平時怎麼學習的。三面就是hr面,給我發了offer。
翻車面試
如果各位以後有機會面試別人的話,希望對面試者多一些尊重吧。
- 根據簡歷提前準備好,針對不同的level提不同的問題
- 不要問一些偏門的怪題
- 問題都是和麵試職位相關的
以下是一些翻車面試,有些公司真的把我心態搞崩了,導致後面的面試都沒有發揮好。
協能共創(自帶簡歷)
公司很小,面試官架子不小,面試全程非常不愉快,經常在我說到一半打斷我,挺會嘲諷人的。面試的時候沒有空間了,然後在外面靠近電梯的走廊面試的。
- 因為我的專案是做人臉識別相機相關的,然後他問我圖片處理到演算法識別經歷了什麼過程,我是直接調演算法,最多把jpg格式的圖片轉成bgr格式,或者圖片有旋轉的,通過exif修正旋轉。但是我的回答好像不是他要的,然後就直接打斷我,說我不知道就直接說不知道
- rabbitmq用了哪些設計模式。釋出訂閱模式,還有其他的嗎,我不知道,有知道的朋友可以告訴我一下
- tcp/ip協議
- 讓你設計eureka,你怎麼設計
- 樂觀鎖,悲觀鎖介紹一下
我:樂觀鎖實際上沒有加鎖
然後他就直接打斷我了,發出一聲嘲笑,問我:那你覺得什麼是鎖。 - jvm引數調優怎麼做的
我回答的是用的微服務部署,有的微服務訪問很頻繁的,就多給他設定一些記憶體,比如閘道器,一些不怎麼用到的,可以設定稍微小一點。然後他說:你們這就是全憑感覺瞎設定唄
哎,面完之後心情低落了很多,難受了一下午,開始質疑我自己。
芯軟科技(自帶簡歷)
Boos直聘上標榜的上市公司,我去面試的時候頂多就看見5個人在公司,辦公區域很空曠很安靜。
- 專案介紹
- 挑出你在專案裡做的一個模組,談談這個模組的整個設計
這個我真不知道怎麼回答,你說整個專案怎麼設計的我還能畫個架構圖啥的給你瞅瞅,但是你這說到具體的模組設計,我不知道怎麼說,最多給你說說資料庫怎麼設計的 - 專案併發情況
你這公司規模還問我這個,不合適吧 - 聽你說對linux比較熟,環境搭建過嗎(tomcat之類的),有沒有遇到什麼問題
搭環境都成為一個技術點來問了嘛,反正我現在用docker了。 - nginx你們一般做什麼,正向代理一般用來幹啥
- 你會前端啊,說說vue用history打包之後,部署到伺服器,nginx需要配置什麼
- 說說你的優點
- 假如你最近加班很累(你已經很累了,要猝死了),但是專案比較急,你想請假怎麼跟領導溝通。
廣東世紀網通訊裝置股份有限公司(自帶簡歷)
第一次見到這樣問問題的兄弟,挺有新鮮感的,其他公司翻來覆去的就是那幾個問題。就是浪費了我的簡歷,列印一次一塊錢,你還在我的簡歷上塗塗改改,我都不好意思要回簡歷了。
- java的序列化和反序列化什麼含義 生成的serialVersionUID有什麼用
- yml檔案裡有一些屬性,怎麼獲取這些屬性
- 有一個列舉類,有很多value和code,然後yml中的一個屬性對應這個code的值,怎麼通過code的值獲取到這個對應value
我想說迴圈判斷,但是覺得沒這麼簡單,所以沉默了半天。。。。
然後他說列舉類裡面有一個方法valueOf
啊這,是他沒表達清楚還是我理解錯了? - final幹嘛的,如果有一個final Stirng a = "123",後面還可以改變嗎
- 一般io操作會捕獲異常,然後在catch中釋放資源,有更簡單的辦法嗎。
- 有一個list,給它按照類裡的一個屬性排序
- 有個string陣列,裡面有些空的值,我想去除空的,怎麼做
- 線上有個介面速度慢,但是本地測試環境和線上環境是一樣的,資料量也是一樣,介面速度卻很快。怎麼排查
不知道
中鐵西南研究院
面了這麼多家,他家是第一次把我問的說不上話的,是電話面試。
- java的繼承和多型講講,繼承在專案裡面是怎麼使用的
在專案裡怎麼用我不知道怎麼回答 - 說一下泛型
泛型提供了編譯時型別安全檢測機制,該機制可以在編譯時期就檢測到非法的型別,避免了執行時的型別轉換異常。可能不是他想要的答案?我不知道他想問什麼,他說算了下一個問題。 - 設計模式,說說簡單工廠模式和抽象工廠模式怎麼實現的,區別
我不知道怎麼描述他的實現,不知道各位能不能口述出來。我語言表達能力真不行 - java8新特性,講講用過stream裡的哪些東西吧
- mysql優化
說了一堆,然後說sql操作儘量使用預編譯語句的時候,
他說:不是mybatis已經解決了嘛。。。哎 - redis專案裡怎麼用
作用是支撐高效能高併發,然後在專案裡具體怎麼用的說了下。
他:一句話的事兒:不就是做快取的嘛
通甲優博(自帶簡歷)
坐車坐了兩個小時,然後去面試先hr面,瞭解了基本的情況,然後沒了。
我還是請假坐車2個小時過去的,hr沒有提前瞭解我的基本資訊就給我發麵試邀請了吧,然後過來面試才覺得我不合適,所以直接就沒有技術面試了。
返空匯
就是最開頭說的那家,招聘網站上常年掛著招聘崗位,起碼掛了快一年。過去先是做了一套筆試題,滿分100,60分及格,沒及格就沒後續。
慧友雲商科技
同樣是做了一套筆試題沒有後續了。因為我發現有一個題有問題,然後留空白。
國信傑雲科技
前一天電話面試,自我介紹之後,問了一些技術問題,然後就讓第二天到現場面試。
現場的話,整個公司人員不超過10個人,本來想走了的,想著來都來了,進去坐坐也無妨嘛。結果這是我做的最後悔的一個決定。
整個面試體驗非常差,面試官線是讓我自我介紹,我前一天已經在電話裡做過自我介紹了,不知道這是什麼意思,面試中途還接了幾個電話。然後就問登入怎麼設計的,前端密碼怎麼傳輸過去的,明文還是加密,我說前端加密沒有必要也沒意義,最多加上https,他說加上https沒用,就是要加密傳,我就在思考怎麼回答他的時候,他說這是面試,請你尊重這次面試(說話語氣帶了點怒火,感覺要罵人了),我也不能忍啊,直接起身就走了。
常問問題
jvm調優
我覺得這不是一箇中級開發工程師甚至高階開發工程師能做的出來的,但是面試就是要問。死記硬背考記憶力唄,只要記住其中幾個常用的配置就行了。
堆大小設定
- -Xms:初始堆大小
- -Xmx:最大堆大小
- -XX:NewSize=n:設定年輕代大小
- -XX:NewRatio=n:設定年輕代和年老代的比值。如:為3,表示年輕代與年老代比值為1:3,年輕代佔整個年輕代年老代和的1/4
- -XX:SurvivorRatio=n:年輕代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。如:3,表示Eden:Survivor=3:2,一個Survivor區佔整個年輕代的1/5
收集器設定
- -XX:+UseSerialGC:設定序列收集器
- -XX:+UseParallelGC:設定並行收集器
- -XX:+UseParalledlOldGC:設定並行年老代收集器
- -XX:+UseConcMarkSweepGC:設定併發收集器
調優總結
年輕代選擇
響應時間優先的應用:儘可能設大,直到接近系統的最低響應時間限制(根據實際情況選擇)。在此種情況下,年輕代收集發生的頻率也是最小的。同時,減少到達年老代的物件。 吞吐量優先的應用:儘可能的設定大,可能到達Gbit的程度。因為對響應時間沒有要求,垃圾收集可以並行進行,一般適合8CPU以上的應用。
年老代選擇
響應時間優先的應用:年老代使用併發收集器,所以其大小需要小心設定,一般要考慮併發會話率和會話持續時間等一些引數。如果堆設定小了,可以會造成記憶體碎片、高回收頻率以及應用暫停而使用傳統的標記清除方式;如果堆大了,則需要較長的收集時間。
程式碼優化
分為三個維度來談,可以稍微拓展一下:
- 整體框架的優化,根據模組(類)的職責做一些劃分,儘量做到每個模組的介面清晰。然後就是善用六大設計原則和24種設計模式。
- 功能邏輯的優化,把內聚的邏輯獨立成一個個函式,函式依賴的資料都通過引數傳遞,這樣做到函式可重用,當上層結構做出改變的時候,修改的程式碼量不會太多。
- 效能優化,如果效能不敏感,程式碼也不是那麼糟糕,那這個優化可以不用關注。
六大設計原則
- 單一職責原則
介面的單一職責,一個職責一個介面,我們對外公佈的是介面,而不是實現類,所以不需要過度關心實現類是否遵循單一職責,生搬硬套單一職責會引起類的劇增,給維護帶來非常多的麻煩 - 裡式替換原則
只要父類能出現的地方我子類就可以出現,而且呼叫子類還不產生任何的錯誤或異常,呼叫者可能根本就不需要知道是父類還是子類。但是反過來就不成了,有子類出現的地方,父類未必就能適應。裡式替換原則包含了四層意思:
- 子類必須完全的實現父類的方法。我們經常寫service會定義一個介面或者抽象類,然後編寫實現,呼叫類則直接傳入介面或抽象類,其實這裡已經使用了里氏替換法則。
- 子類可以有自己的個性。子類當然可以有自己的行為和外觀了,也就是方法和屬性,在子類出現的地方,父類未必就可以勝任。父類向下轉型可能會出現型別轉換異常
- 覆蓋或實現父類的方法時輸入引數可以被放大。
- 覆蓋或實現父類的方法是輸出結果可以被縮小。
- 依賴倒置原則
依賴倒置原則的本質就是通過抽象(介面或抽象類)使各個類或模組的實現彼此獨立,不互相影響,實現模組間的鬆耦合。我們在專案中使用這個原則要遵循下面的規則:
每個類儘量都有介面或者抽象類,或者抽象類和介面兩都具備
變數的表面型別儘量是介面或者抽象類
任何類都不應該從具體類派生
儘量不要覆寫基類的方法 - 介面隔離原則
客戶端不應該依賴它不需要的介面,客戶端需要什麼介面就提供什麼介面,把不需要的介面剔除掉,對介面進行細化,保證其純潔性。通俗的講就是:建立單一介面,不要建立臃腫龐大的介面。 - 迪米特法則
一個物件應該對其他物件有最少的瞭解,通俗的講,一個類對自己需要耦合/呼叫的類應該知道的最少,這個類內部是怎麼複雜、怎麼糾纏不清都和我沒關係。儘量不要對外公佈太多public方法和非靜態的public變數,儘量內斂,多使用private、package-private、protected等訪問許可權 - 開閉原則
類、方法對於擴充套件是開放的,對於修改是關閉的,在程式需要進行拓展的時候,不能去修改原來的程式碼。
24種設計模式
單例模式
工廠模式
建造者模式
觀察者模式
有觀察者和被觀察者,被觀察者介面:增加觀察者、刪除觀察者,通知觀察者更新 觀察者:被觀察者傳送訊息了,我自己也要做些什麼
責任鏈模式
介面卡模式
mysql的優化
十家公司有九家會問,這個必須要記住。基本上只要記住我寫的這些,面試基本上穩了:
- 資料庫表設計優化
- 所有表必須使用Innodb儲存引擎
- 字符集統一使用utf-8
- 欄位加註釋
- 控制單表資料量的大小,建議控制在500w內
- 冷熱資料分離,減小表寬度
- 禁止儲存圖片,檔案等二進位制資料
- 三大正規化
- 資料庫欄位設計優化
- 優先選擇符合儲存條件最小的資料型別,能用tinyint的就不用int,能用varchar的不用text
- 避免使用text,blob資料型別
- 儘可能把所有列定義為not null
- 索引設計優化
- 限制每張表的索引數量,單張表不超過5個
- 禁止給每一列都建立單獨索引
- 每個表必須有一個主鍵
- 頻繁查詢的欄位建立索引
- 編寫sql優化
- 建議預編譯語句進行資料庫操作
- 避免資料型別的隱式轉換
- 充分利用表上已經存在的索引
- 不要使用select * 查詢,要使用select <欄位列表> 查詢
- 避免使用子查詢,把子查詢優化成join操作
- 避免使用join關聯太多得表
- 對同一列進行or判斷時,使用in代替or
- where從句中禁止對列進行函式轉換和計算
- 在明顯不會有重複值時使用union all而不是union
- 拆分複雜的大SQL為多個小SQL
- 使用 group by 分組查詢是,預設分組後,還會排序,可能會降低速度,在 group by 後面增加 order by null 就可以防止排序.
jvm記憶體模型
必考題,抽時間看看深入理解jvm虛擬機器吧。
總結
面試和工作是兩回事,面試沒通過的人,工作能力不一定比你弱,面試通過的人,工作能力不一定比你強。所以面試沒通過也不要灰心,回去好好總結覆盤,不要因為失敗就喪失鬥志,加油
完整的Java初級,高階對應的學習路線和資料!專注於java開發。分享java基礎、原理性知識、JavaWeb實戰、spring全家桶、設計模式、分散式及面試資料、開源專案,助力開發者成長!
歡迎關注微信公眾號:碼邦主