兩年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時間。

面試官會對他感興趣的點進行提問。

 

項目中遇到的難題

讓我想起小學時經常寫的作文:最難忘的一件事。這可真是太艹了,沒想到小學學的知識現在派上了用場。

項目中遇到的難題,解決了之后其實都不是什么難題了。我列幾個點可以參考一下:

  1. 跨域
  2. 任務調度冪等性
  3. 使用mq遇到的問題
  4. 分布式系統中的事務問題
  5. 內存溢出問題

當然最后還是要自己的專業技能扎實,才能獲取源源不斷的offer。

 

面試經驗

接下來分享一些這段時間的面試公司

 

騰雲億想

騰訊雲全資子公司,其實就是騰訊雲的外包公司

  1. 數據庫有哪幾種索引
  2. springboot原理,如何實現的自動裝配
  3. springboot打包成jar之后,怎么做到不重新打包修改他的properties配置文件
  4. jvm調優做過嗎,有哪些參數可以調,具體怎么調

第一次面試,尷尬的是我基本上沒打上來,只回答上了springboot原理,居然還叫我去hr面,要把這個崗位確定下來,我拒絕了。

 

壘知科技研究院

上市公司,原來叫做建研集團,做建築相關的工程。

  1. 你用過SpringBoot的哪些注解
    1. @component,@service,@controller,@controlleradvice,@Repository
    2. @Autowired,@Inject,@Resource,@Qualifier,一般@Resource單獨使用,@Qualifier會和@Autowired一起用
    3. @dependsOn
    4. @Configuration,@bean, @ComponentScan,
    5. @Aspect,@PointCut,
    6. @Scope,@PostConstruct,@PreDestory

 

  1. Spring的Bean默認是單例還是多例,我想改成多例的怎么辦
  2. 項目中用到了rabbitmq,使用中遇到什么問題
  3. rabbitmq重復消費怎么解決,除了數據庫里查記錄還有其他什么方法
  4. 分布式鎖怎么實現,redis實現方式死鎖怎么解決
    我:數據庫實現,redis實現,zookeeper實現。redis加上一個失效時間
  5. mysql索引怎么實現的,btree索引有什么特點
  6. 現在有一個聯合索引(A,B) 我有一個sql語句是
    select xxx from xxx where A=xxx 會用到索引嗎
    select xxx from xxx whereB=xxx 會用到索引嗎 為什么會是最左匹配原則
  7. ArrayList實現了哪些接口
    說了List、Cloneable、Serializable,我覺得他應該是想問RandomAccess接口,當時沒回答上這個
  8. 代碼優化怎么做的
  9. nginx怎么配置負載均衡
  10. 閉鎖怎么用,什么原理
  11. 二分查找法,時間復雜度

自我感覺回答得不是很好,但是第二天收到了復試邀請,還挺驚訝的。

復試先是做一套性格測試題,然后就是項目主管來面試我,問了一下畢業學校,為啥學校挺好還是科班出身,為啥畢業會進小公司。然后問了下我現在的職位級別,接下來就巴拉巴拉開始誇他們公司。

然后就是cto面試,也沒問技術,就問了問家里的情況,未來職業規划,然后說他是從華為出來的,公司實行狼性文化,加班是經常的。正題來了,他說待遇是不會高於我上家公司的,但是進他們公司未來的發展肯定會很好。我就有點不太舒服,就嘆氣嘛,然后他說我唉聲嘆息比較悲觀,進公司會影響其他人,他需要的是一個時刻保持樂觀的人,能給團隊帶來活力。

 

我整個人都傻了。

 

西南凱亞

中國民航的子公司,是一家國企。

先要提前一天做一套線上筆試題,不管有沒有通過,第二天都是要去面試的。

主要是項目相關的,業務上的東西問得多

代碼優化

mysql優化

jvm內存模型

spring cloud用過哪些組件 講講熔斷機制

為什么離開上家公司

不是很難但是沒有offer,心態崩了。

 

 

睿沿科技

做人臉識別相關的,和我上家公司做的產品差不多。

  1. Hashmap原理
  2. ConcurrentHashMap原理,為什么多線程條件下性能這么好
    我從sync在1.6做的優化談的,他從鎖的粒度方面談的
  3. 項目相關
  4. 代碼優化
  5. mysql優化
  6. spring的aop怎么實現的
  7. 每天抓拍的數據量比較大,有做過分庫分表嗎
    用的shardingjdbc 還有mycat,中小公司一般用shardingjdbc,
  8. Rabbitmq實現原理
    不知道

后面兩個沒有回答好吧,所以沒有后續了。

 

小海豚能源科技

這家應該是要找做全棧的吧,開頭就問我好幾個前端相關的,我直接懵了,理所當然的沒有后續了

  1. 用過jquery哪些框架
  2. es6語法熟悉嗎
  3. vue用過哪些組件
  4. spring用過哪些注解
  5. 使用@autowired注入的時候,如果這個接口有多個實現,怎么指定注入哪一個的實現
  6. eureka搭過集群嗎
  7. mysql優化,什么時候不會用到索引
    1. select *,可能會導致不走索引
    2. where后面有函數運算,導致不走索引
    3. 索引不適用於隱式轉換的情況,比如你的SELECT * FROM T WHERE Y = 5 在Y上面有一個索引,但是Y列是VARCHAR2的,那么Oracle會將上面的5進行一個隱式的轉換,SELECT * FROM T WHERE TO_NUMBER(Y) = 5,這個時候也是有可能用不到索引的。
    4. like查詢使用通配符開頭不會用到索引

但是這些好像不是他想要的答案,我也猜不透。。

  1. 接受長期出差嗎

 

開通金融

做互聯網金融的,公司總部在北京,我面試的時候是在成都的新網銀行公司,看這個模式應該就是駐場開發了,但是公司本身不是外包。

  1. springboot和spring的不同
  2. springboot特性,自動裝配怎么實現的
  3. spring用到哪些組件,具體場景
  4. spring默認是單例還是多例,全局變量會有什么問題
  5. spring事務傳播行為、隔離級別
  6. aop實現方式,jdk動態代理和cglib動態代理區別
  7. jdk lambda表達式幾種使用方式,取最大和最小值,list轉map,list中有重復的怎么辦
  8. 線程池 有哪些參數,各個參數的意義
  9. ioc容器有什么優點
  10. jvm 堆棧,區別,線程共享還是線程私有的
  11. springcloud組件、用途,負載均衡的幾種算法
  12. 分布式事務怎么做的
  13. mybatis一對多,多對多怎么做
  14. jpa和mybatis區別
  15. vmstat命令干嘛的
  16. redis查看內存占用命令
  17. mysql導入大量數據怎么優化
  18. mysql有一條數據死鎖了,怎么排查問題,mysql表死鎖,怎么排查
  19. nginx反向代理是什么,正向代理呢

這次面試回答得挺好的,hr也打了好幾次電話說面試官對我挺有意向的,就是一頓操作猛如虎,一問工資0.9。而且我當時還是在職,要求我一周到崗,我就沒去。

 

蘭亭集勢

做海外電商的公司,但是進去之后是做一些小系統的開發,問的問題有點像校招一樣,我是應屆畢業生說不定能答出來。

  1. 看過開源框架源碼嗎,SpringBoot自動裝配原理
  2. 寫個冒泡,寫個單例模式
  3. mybatis和jdbc怎么防止sql注入
  4. 單一職責原則是什么,里式替換原則是什么
  5. 3NF是什么
  6. 接口定義一個變量,這個變量的默認作用域
  7. 有沒有自己搭建過微服務
  8. linux怎么看java進程,除了jps和top命令還有其他的嗎
  9. 最近看什么書,我回答多線程並發相關的,他:沒用,要在項目里用才有用
  10. 最近在學什么技術?docker,他:沒用,很簡單不需要學習
  11. 有個部門表,怎么設計他的字段,獲取一個部門下的所有子部門,除了遞歸還有什么方法?加個code字段,通過部門前綴like查詢

 

京東物流(自帶簡歷)

朋友內推的,聽他說是穩了,去面就能過,結果還是翻車了。

  1. java特點描述一下,繼承封裝多態分別是什么意思
  2. synchronized和lock區別
  3. ConcurrentHashMap線程安全怎么實現的
  4. 創建線程的幾種方式,創建線程池幾個參數的含義,線程飽和策略
  5. sleep和wait區別
  6. spring是單例還是多例,多線程並發會出現什么問題
  7. SpringBoot如何解決跨域,具體怎么配置
  8. 全局異常捕獲怎么做的
  9. SpringSecurity的前后端分離,登錄怎么做的
    我:攔截登錄的url,然后獲取到用戶名和密碼,把這個用戶名和密碼交給manager,manager會交給具體的provider處理,provider會調用UserDetailsService的方法完成驗證。
    這里是我失誤了,他說用戶名和密碼時通過getattribute 獲取到的嗎,我說是的。
  10. 怎么設計一個安全的對外接口
  11. 單線程的redis為什么這么快
  12. redis持久化方式
  13. 什么是聚簇索引,什么是非聚簇索引
  14. mysql事務隔離級別
  15. 你覺得你能承擔獨立開發的任務嗎

其他問題回答得挺好的,自我感覺不錯,本來以為能收到offer的,但是朋友說那個面試官覺得我不行,不能承擔獨立開發系統的任務,估計是第8個問題回答失誤了吧,其他我覺得我回答沒有問題。

 

教育家網絡科技

面試的人比較多,所以是群面,一個面試官對應多個面試者。雖然我回答得比另外一個面試者好很多,但是沒有收到offer,很迷,真的很迷。

  1. 介紹項目,然后基本上就圍繞着項目的業務說
  2. 對金額的計算用什么類型,數據庫中用什么類型存儲
  3. SpringBoot怎么自定義注解
  4. mysql優化,like查詢的時候,數據量很大,如果like查詢以%開頭,不會走索引,怎么優化。多表關聯查詢,怎么優化
  5. 代碼優化怎么做的,平時重構從哪方面考慮

 

海康交通大數據

海康下面的一家分公司,主要做車輛交通相關大屏數據統計報表之類的,面試官和我一個學校的學長,開頭就問我是哪個老師教的,嚇我一跳哈哈哈哈,我以為給老師丟臉了。

  1. HashMap原理,底層結構,1.7和1.8區別,頭插法還是尾插法、線程安全嗎
  2. ConcurentHashMap在什么地方加的鎖,1.7和1.8區別,1.7用的segment,1.8用的synchronized
  3. lock和synchronized這兩個區別,1.6之后對synchronized做了什么優化
  4. 偏向鎖、輕量級鎖是怎么做到的,我回答的是每個對象都有對象頭,對象頭里做的標記,然后他問我對象頭里有哪些信息
  5. list和數組區別,哪個會內存泄漏,查詢的話哪個快點。我覺得查詢是一樣快的,因為list本來底層就是數組
  6. 線程池各個參數介紹一下,原理是什么。你常用哪種線程池,為什么?
  7. 有哪些隊列,你線程池一般用哪種隊列
  8. spring怎么解決循環依賴
  9. jdk動態代理和cglib區別,哪個更快,有沒有看過他們生成的字節碼文件
  10. cloud相關的組件用過哪些,hystrix熔斷原理是什么,除了線程池還有什么。熔斷有個半開狀態,有什么用

過程還是挺愉快的吧,就是薪資待遇沒有談到位,比較可惜。

 

咻電科技(自帶簡歷)

一家做共享充電寶的公司,面試官又是和我一個學校的學長,但是沒有給我放水,很生氣。

 

問題:

  1. spring生命周期
  2. 線程池有幾種創建方式
  3. 線程生命周期
  4. eureka原理
  5. lock和sync區別
  6. 有一個表有幾個億的數據,寫sql分頁查詢怎么優化
  7. redis內存淘汰策略有幾種
  8. dubbo熟悉嗎
  9. 臟讀幻讀不可重復讀,怎么解決
  10. jquery冒泡了解嗎

最后問了一些學習相關的建議,收獲挺多的。

 

武漢佰鈞成

外包公司,給平安做的一個項目,電話面試,外包都喜歡這種方式。

  1. 設計模式用過哪些
  2. 代碼優化怎么做的
  3. bio和nio區別
  4. springcloud用過哪些組件
  5. mysql優化,有做過sql從幾秒優化到幾十毫秒的嗎
  6. 項目並發量多大
  7. 里式替換原則是什么
  8. tpc/ip協議
  9. 性能優化怎么做

外包不是很好進嗎,但是我沒有收到offer。

 

成都房聯雲碼

  1. 你怎么看單例模式,寫一個雙重鎖檢測的單例模式
  2. string、stringbuilder、stringbuffer區別
  3. arraylist、linkedlist區別
  4. hashmap1.7 、1.8底層結構區別
  5. hashmap、hashtable區別
  6. 線程的生命周期
  7. spring事務傳播行為,底層實現原理
  8. 聲明bean的幾種方式
  9. spring默認是單例還是多例,怎么實現多例
  10. springmvc流程
  11. jvm內存模型
  12. lock和synchronized區別,最大的區別是
  13. 代碼優化和sql優化
  14. 分布式,session怎么解決
  15. redis優點
  16. 對外接口怎么保證安全,光是md5簽名加密不行,還有其他方法嗎
  17. 有一個功能模塊,你會怎么安排時間,如果有一個緊急任務完成不了怎么辦
  18. 平時怎么學習的

面完問了一下期望薪資,然后約了二面,二面就簡單問了一下項目相關的,平時怎么學習的。三面就是hr面,給我發了offer。

 

翻車面試

如果各位以后有機會面試別人的話,希望對面試者多一些尊重吧。

  1. 根據簡歷提前准備好,針對不同的level提不同的問題
  2. 不要問一些偏門的怪題
  3. 問題都是和面試職位相關的

以下是一些翻車面試,有些公司真的把我心態搞崩了,導致后面的面試都沒有發揮好。

協能共創(自帶簡歷)

公司很小,面試官架子不小,面試全程非常不愉快,經常在我說到一半打斷我,挺會嘲諷人的。面試的時候沒有空間了,然后在外面靠近電梯的走廊面試的。

  1. 因為我的項目是做人臉識別相機相關的,然后他問我圖片處理到算法識別經歷了什么過程,我是直接調算法,最多把jpg格式的圖片轉成bgr格式,或者圖片有旋轉的,通過exif修正旋轉。但是我的回答好像不是他要的,然后就直接打斷我,說我不知道就直接說不知道
  2. rabbitmq用了哪些設計模式。發布訂閱模式,還有其他的嗎,我不知道,有知道的朋友可以告訴我一下
  3. tcp/ip協議
  4. 讓你設計eureka,你怎么設計
  5. 樂觀鎖,悲觀鎖介紹一下
    我:樂觀鎖實際上沒有加鎖
    然后他就直接打斷我了,發出一聲嘲笑,問我:那你覺得什么是鎖。
  6. jvm參數調優怎么做的
    我回答的是用的微服務部署,有的微服務訪問很頻繁的,就多給他設置一些內存,比如網關,一些不怎么用到的,可以設置稍微小一點。然后他說:你們這就是全憑感覺瞎設置唄

哎,面完之后心情低落了很多,難受了一下午,開始質疑我自己。

 

芯軟科技(自帶簡歷)

Boos直聘上標榜的上市公司,我去面試的時候頂多就看見5個人在公司,辦公區域很空曠很安靜。

  1. 項目介紹
  2. 挑出你在項目里做的一個模塊,談談這個模塊的整個設計
    這個我真不知道怎么回答,你說整個項目怎么設計的我還能畫個架構圖啥的給你瞅瞅,但是你這說到具體的模塊設計,我不知道怎么說,最多給你說說數據庫怎么設計的
  3. 項目並發情況
    你這公司規模還問我這個,不合適吧
  4. 聽你說對linux比較熟,環境搭建過嗎(tomcat之類的),有沒有遇到什么問題
    搭環境都成為一個技術點來問了嘛,反正我現在用docker了。
  5. nginx你們一般做什么,正向代理一般用來干啥
  6. 你會前端啊,說說vue用history打包之后,部署到服務器,nginx需要配置什么
  7. 說說你的優點
  8. 假如你最近加班很累(你已經很累了,要猝死了),但是項目比較急,你想請假怎么跟領導溝通。

 

廣東世紀網通信設備股份有限公司(自帶簡歷)

第一次見到這樣問問題的兄弟,挺有新鮮感的,其他公司翻來覆去的就是那幾個問題。就是浪費了我的簡歷,打印一次一塊錢,你還在我的簡歷上塗塗改改,我都不好意思要回簡歷了。

  1. java的序列化和反序列化什么含義 生成的serialVersionUID有什么用
  2. yml文件里有一些屬性,怎么獲取這些屬性
  3. 有一個枚舉類,有很多value和code,然后yml中的一個屬性對應這個code的值,怎么通過code的值獲取到這個對應value
    我想說循環判斷,但是覺得沒這么簡單,所以沉默了半天。。。。
    然后他說枚舉類里面有一個方法valueOf
    啊這,是他沒表達清楚還是我理解錯了?
  4. final干嘛的,如果有一個final Stirng a = "123",后面還可以改變嗎
  5. 一般io操作會捕獲異常,然后在catch中釋放資源,有更簡單的辦法嗎。
  6. 有一個list,給它按照類里的一個屬性排序
  7. 有個string數組,里面有些空的值,我想去除空的,怎么做
  8. 線上有個接口速度慢,但是本地測試環境和線上環境是一樣的,數據量也是一樣,接口速度卻很快。怎么排查
    不知道

中鐵西南研究院

面了這么多家,他家是第一次把我問的說不上話的,是電話面試。

  1. java的繼承和多態講講,繼承在項目里面是怎么使用的
    在項目里怎么用我不知道怎么回答
  2. 說一下泛型
    泛型提供了編譯時類型安全檢測機制,該機制可以在編譯時期就檢測到非法的類型,避免了運行時的類型轉換異常。可能不是他想要的答案?我不知道他想問什么,他說算了下一個問題。
  3. 設計模式,說說簡單工廠模式和抽象工廠模式怎么實現的,區別
    我不知道怎么描述他的實現,不知道各位能不能口述出來。我語言表達能力真不行
  4. java8新特性,講講用過stream里的哪些東西吧
  5. mysql優化
    說了一堆,然后說sql操作盡量使用預編譯語句的時候,
    他說:不是mybatis已經解決了嘛。。。哎
  6. redis項目里怎么用
    作用是支撐高性能高並發,然后在項目里具體怎么用的說了下。
    他:一句話的事兒:不就是做緩存的嘛

 

通甲優博(自帶簡歷)

坐車坐了兩個小時,然后去面試先hr面,了解了基本的情況,然后沒了。

我還是請假坐車2個小時過去的,hr沒有提前了解我的基本信息就給我發面試邀請了吧,然后過來面試才覺得我不合適,所以直接就沒有技術面試了。

 

返空匯

就是最開頭說的那家,招聘網站上常年掛着招聘崗位,起碼掛了快一年。過去先是做了一套筆試題,滿分100,60分及格,沒及格就沒后續。

 

慧友雲商科技

同樣是做了一套筆試題沒有后續了。因為我發現有一個題有問題,然后留空白。

 

國信傑雲科技

前一天電話面試,自我介紹之后,問了一些技術問題,然后就讓第二天到現場面試。

現場的話,整個公司人員不超過10個人,本來想走了的,想着來都來了,進去坐坐也無妨嘛。結果這是我做的最后悔的一個決定。

整個面試體驗非常差,面試官線是讓我自我介紹,我前一天已經在電話里做過自我介紹了,不知道這是什么意思,面試中途還接了幾個電話。然后就問登錄怎么設計的,前端密碼怎么傳輸過去的,明文還是加密,我說前端加密沒有必要也沒意義,最多加上https,他說加上https沒用,就是要加密傳,我就在思考怎么回答他的時候,他說這是面試,請你尊重這次面試(說話語氣帶了點怒火,感覺要罵人了),我也不能忍啊,直接起身就走了。

 

常問問題

jvm調優

我覺得這不是一個中級開發工程師甚至高級開發工程師能做的出來的,但是面試就是要問。死記硬背考記憶力唄,只要記住其中幾個常用的配置就行了。

堆大小設置

  1. -Xms:初始堆大小
  2. -Xmx:最大堆大小
  3. -XX:NewSize=n:設置年輕代大小
  4. -XX:NewRatio=n:設置年輕代和年老代的比值。如:為3,表示年輕代與年老代比值為1:3,年輕代占整個年輕代年老代和的1/4
  5. -XX:SurvivorRatio=n:年輕代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。如:3,表示Eden:Survivor=3:2,一個Survivor區占整個年輕代的1/5

收集器設置

  1. -XX:+UseSerialGC:設置串行收集器
  2. -XX:+UseParallelGC:設置並行收集器
  3. -XX:+UseParalledlOldGC:設置並行年老代收集器
  4. -XX:+UseConcMarkSweepGC:設置並發收集器

調優總結

年輕代選擇

響應時間優先的應用:盡可能設大,直到接近系統的最低響應時間限制(根據實際情況選擇)。在此種情況下,年輕代收集發生的頻率也是最小的。同時,減少到達年老代的對象。 吞吐量優先的應用:盡可能的設置大,可能到達Gbit的程度。因為對響應時間沒有要求,垃圾收集可以並行進行,一般適合8CPU以上的應用。

年老代選擇

響應時間優先的應用:年老代使用並發收集器,所以其大小需要小心設置,一般要考慮並發會話率和會話持續時間等一些參數。如果堆設置小了,可以會造成內存碎片、高回收頻率以及應用暫停而使用傳統的標記清除方式;如果堆大了,則需要較長的收集時間。

 

代碼優化

分為三個維度來談,可以稍微拓展一下:

  1. 整體框架的優化,根據模塊(類)的職責做一些划分,盡量做到每個模塊的接口清晰。然后就是善用六大設計原則和24種設計模式。
  2. 功能邏輯的優化,把內聚的邏輯獨立成一個個函數,函數依賴的數據都通過參數傳遞,這樣做到函數可重用,當上層結構做出改變的時候,修改的代碼量不會太多。
  3. 性能優化,如果性能不敏感,代碼也不是那么糟糕,那這個優化可以不用關注。

六大設計原則

  • 單一職責原則
    接口的單一職責,一個職責一個接口,我們對外公布的是接口,而不是實現類,所以不需要過度關心實現類是否遵循單一職責,生搬硬套單一職責會引起類的劇增,給維護帶來非常多的麻煩
  • 里式替換原則
    只要父類能出現的地方我子類就可以出現,而且調用子類還不產生任何的錯誤或異常,調用者可能根本就不需要知道是父類還是子類。但是反過來就不成了,有子類出現的地方,父類未必就能適應。里式替換原則包含了四層意思:
  1. 子類必須完全的實現父類的方法。我們經常寫service會定義一個接口或者抽象類,然后編寫實現,調用類則直接傳入接口或抽象類,其實這里已經使用了里氏替換法則。
  2. 子類可以有自己的個性。子類當然可以有自己的行為和外觀了,也就是方法和屬性,在子類出現的地方,父類未必就可以勝任。父類向下轉型可能會出現類型轉換異常
  3. 覆蓋或實現父類的方法時輸入參數可以被放大。
  4. 覆蓋或實現父類的方法是輸出結果可以被縮小。

 

  • 依賴倒置原則
    依賴倒置原則的本質就是通過抽象(接口或抽象類)使各個類或模塊的實現彼此獨立,不互相影響,實現模塊間的松耦合。我們在項目中使用這個原則要遵循下面的規則:
    每個類盡量都有接口或者抽象類,或者抽象類和接口兩都具備
    變量的表面類型盡量是接口或者抽象類
    任何類都不應該從具體類派生
    盡量不要覆寫基類的方法
  • 接口隔離原則
    客戶端不應該依賴它不需要的接口,客戶端需要什么接口就提供什么接口,把不需要的接口剔除掉,對接口進行細化,保證其純潔性。通俗的講就是:建立單一接口,不要建立臃腫龐大的接口。
  • 迪米特法則
    一個對象應該對其他對象有最少的了解,通俗的講,一個類對自己需要耦合/調用的類應該知道的最少,這個類內部是怎么復雜、怎么糾纏不清都和我沒關系。盡量不要對外公布太多public方法和非靜態的public變量,盡量內斂,多使用private、package-private、protected等訪問權限
  • 開閉原則
    類、方法對於擴展是開放的,對於修改是關閉的,在程序需要進行拓展的時候,不能去修改原來的代碼。

24種設計模式

單例模式

工廠模式

建造者模式

觀察者模式

有觀察者和被觀察者,被觀察者接口:增加觀察者、刪除觀察者,通知觀察者更新 觀察者:被觀察者發送消息了,我自己也要做些什么

責任鏈模式

適配器模式

 

mysql的優化

十家公司有九家會問,這個必須要記住。基本上只要記住我寫的這些,面試基本上穩了:

  1. 數據庫表設計優化
    1. 所有表必須使用Innodb存儲引擎
    2. 字符集統一使用utf-8
    3. 字段加注釋
    4. 控制單表數據量的大小,建議控制在500w內
    5. 冷熱數據分離,減小表寬度
    6. 禁止存儲圖片,文件等二進制數據
    7. 三大范式

 

  1. 數據庫字段設計優化
    1. 優先選擇符合存儲條件最小的數據類型,能用tinyint的就不用int,能用varchar的不用text
    2. 避免使用text,blob數據類型
    3. 盡可能把所有列定義為not null

 

  1. 索引設計優化
    1. 限制每張表的索引數量,單張表不超過5個
    2. 禁止給每一列都建立單獨索引
    3. 每個表必須有一個主鍵
    4. 頻繁查詢的字段建立索引

 

  1. 編寫sql優化
    1. 建議預編譯語句進行數據庫操作
    2. 避免數據類型的隱式轉換
    3. 充分利用表上已經存在的索引
    4. 不要使用select * 查詢,要使用select <字段列表> 查詢
    5. 避免使用子查詢,把子查詢優化成join操作
    6. 避免使用join關聯太多得表
    7. 對同一列進行or判斷時,使用in代替or
    8. where從句中禁止對列進行函數轉換和計算
    9. 在明顯不會有重復值時使用union all而不是union
    10. 拆分復雜的大SQL為多個小SQL
    11. 使用 group by 分組查詢是,默認分組后,還會排序,可能會降低速度,在 group by 后面增加 order by null 就可以防止排序.

 

jvm內存模型

必考題,抽時間看看深入理解jvm虛擬機吧。

 

總結

面試和工作是兩回事,面試沒通過的人,工作能力不一定比你弱,面試通過的人,工作能力不一定比你強。所以面試沒通過也不要灰心,回去好好總結復盤,不要因為失敗就喪失斗志,加油

 

完整的Java初級,高級對應的學習路線和資料!專注於java開發。分享java基礎、原理性知識、JavaWeb實戰、spring全家桶、設計模式、分布式及面試資料、開源項目,助力開發者成長!


歡迎關注微信公眾號:碼邦主


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM