從傳統企業到字節、美團、京東,再到拿下華爲Offer,程序員的逆襲之路。 前言 背景 京東 字節 華爲 美團(涼經) 寫在最後

前言

在六月份的時候,水友就跟我說想跳槽了,一直待在傳統公司不是辦法,當時準備了兩個月終於拿到了華爲的Offer,一起感受下大佬的面試經歷吧!

背景

211本,985渣碩,畢業之後一直在傳統企業。從6月底開始硬着頭皮看題 ,然後從8月底開始準備秋招,到目前收穫了幾個offer,準備就籤華爲了。

京東

京東是第一個面試的公司,雖然過了,但是京東那成海了,估計撈不起來了。

一面(電話面試40min)

  1. 問本科做的什麼,有沒有學過計算機相關課程

  2. Spring是怎麼識別http請求找到對應的controller的

  3. 對象在堆內存裏面會不會有移動

  4. Integer能不能用==判斷相等(-128到127有緩存)

  5. 重寫equels爲什麼要重寫hashcode(回答因爲有一些需要用到hashcode的場景,比如set,會先判斷hashcode是否相同,再通過equals來判斷)

  6. JVM常見的垃圾回收算法以及都有什麼缺點

  7. new一個object對象,然後再賦值給一個靜態變量,然後問這個過程在JVM內存是什麼個過程(回答會把創建的實例對象放到堆內存區域,然後再把指向對象的內存地址賦值給符號引用,讓這個符號引用指向對應的堆內存區域)

  8. 這個對象的堆內存地址會不會發生改變(會,因爲垃圾回收會對對象進行轉移,比如複製法和標記整理)

  9. 輸入URL到瀏覽器,整個過程是怎麼樣的

    • Spring是怎麼處理HTTP請求的

      前置分發器 DispatcherServlet 接收到 HTTP 請求之後,將查找適當的控制器 Controller 來處理請求,它通過解析 HTTP 請求的 URL 獲得 URI,再根據該 URI 從處理器映射 HandlerMapping 當中獲得該請求對應的處理器 Handler 和處理器攔截器 HandlerInterceptor,最後以 HandlerExecutionChain 形式返回。

      前置分發器 DispatcherServlet 根據獲得的處理器 Handler 選擇合適的適配器 HandlerAdapter。如果成功獲得適配器 HandlerAdapter,在調用處理器 Handler 之前其攔截器的方法 preHandler() 優先執行。

      方法 preHandler() 提取 HTTP 請求中的數據填充到處理器 Handler 的入參當中,然後開始調用處理器 Handler(即控制器 Controller)相關方法。

      控制器 Controller 執行完成之後,向前置分發器 DispatcherServlet 返回一個模型與視圖名對象 ModelAndView 。

      前置分發器 DispatchServlet 根據模型與視圖名對象 ModelAndView 選擇適合的視圖解析器 ViewResolver,前提該視圖解析器必須已經註冊至 Spring IOC 容器當中。

      視圖解析器 ViewResolver 將根據 ModelAndView 裏面指定的視圖名稱獲得特定的視圖 View。

      前置分發器 DispatchServlet 將模型數據填充進視圖當中,然後將渲染結果返回給客戶端。

  10. HTTP報文的格式是怎麼樣的(請求行,請求頭,空行,請求體)

  11. cookie存在http哪兒

  12. cookie和session的區別

  13. mysql裏面的索引類型以及聯合索引的最左原則

  14. 瞭解過覆蓋索引嗎(沒有了解)

> 如果一個索引包含(或覆蓋)所有需要查詢的字段的值,稱爲‘覆蓋索引’。即只需掃描索引而無須回表。 只掃描索引而無需回表的優點: 1.索引條目通常遠小於數據行大小,只需要讀取索引,則mysql會極大地減少數據訪問量。 2.因爲索引是按照列值順序存儲的,所以對於IO密集的範圍查找會比隨機從磁盤讀取每一行數據的IO少很多。 3.一些存儲引擎如myisam在內存中只緩存索引,數據則依賴於操作系統來緩存,因此要訪問數據需要一次系統調用 4.innodb的聚簇索引,覆蓋索引對innodb表特別有用。(innodb的二級索引在葉子節點中保存了行的主鍵值,所以如果二級主鍵能夠覆蓋查詢,則可以避免對主鍵索引的二次查詢)
> 
> 覆蓋索引必須要存儲索引列的值,而哈希索引、空間索引和全文索引不存儲索引列的值,所以mysql只能用B-tree索引做覆蓋索引。
  1. 事務是怎麼實現的。

  2. MVCC知道嗎

  3. 事務隔離級別,分別能解決什麼問題

  4. 說一下什麼是線程安全問題

  5. sychronized和Lock的區別

  6. synchronized使用的方法以及底層原理

> 同步方法是隱式的。一個同步方***在運行時常量池中的method_info結構體中存放ACC_SYNCHRONIZED標識符。當一個線程訪問方法時,會去檢查是否存在ACC_SYNCHRONIZED標識,如果存在,則先要獲得對應的monitor鎖,然後執行方法。當方法執行結束(不管是正常return還是拋出異常)都會釋放對應的monitor鎖。如果此時有其他線程也想要訪問這個方法時,會因得不到monitor鎖而阻塞。當同步方法中拋出異常且方法內沒有捕獲,則在向外拋出時會先釋放已獲得的monitor鎖
  1. lock的實現方法以及底層原理(CAS volatile然後AQS,然後獨佔鎖和共享鎖)

  2. 線程池參數

  3. 場景題,核心線程數6,最大線程數10,隊列無界,然後說一下過程。(由於無界隊列,所以線程池中的線程數不會超過6,等待隊列裏的任務只能等待線程處理完任務後再來執行,從頭說到飽和策略)

  4. 雙親委派模型瞭解嗎(巴拉巴拉)

  5. 怎麼破壞(自己實現classloader,然後重寫classload方法,然後扯到Tomcat,然後問Tomcat爲什麼要這樣做,真想給自己一巴掌,話真多)

  6. 反問,問面試官是哪個部門的,都是做什麼的。

  7. 問有offer嗎(沒有)

二面 35min

  1. 自我介紹
  2. 項目介紹,架構
  3. 線程池,有用到多線程嗎,線程怎麼同步的
  4. mysql怎麼建立索引
  5. 應用是單機部署還是多機部署
  6. redis部署模式(主從和哨兵)
  7. 目前的研究課題是什麼
  8. 深度學習模型,CRNN CTPN是什麼,整個框架
  9. 分佈式有接觸過嗎
  10. 反問

電話突擊面 30min

1.問項目

2.問java基礎

3.問redis

4.sql刪除重複數據,保留一個

delete from table where sex = (select sex from table group by sex having count(*) > 1)這是刪除所有

Delete from table where id not in (select min(id) as id from table group by sex)

5.hashmap的原理

6.線程安全的本質,怎麼保證線程安全

7.是什麼時候學的java

8.反問

HR面

  1. 自我介紹
  2. 問學習,遇到未知領域怎麼做,怎麼學習的
  3. 有沒有對象
  4. 有什麼offer,怎麼選擇
  5. 職業規劃
  6. 反問

字節

一面(70min)

  1. 自我介紹
  2. select和epoll的區別,水平觸發和垂直觸發
  3. so文件存在內存的哪個地方
  4. 頁面置換算法
  5. 虛擬內存,爲什麼虛擬內存會遠大於物理內存
  6. 進程的內存結構
  7. CPU超頻和超線程的區別,超頻有什麼優勢,超線程呢(不知道)
  8. TCP中syn-flood怎麼避免
  9. HTTP中協商壓縮
  10. websocket是怎麼握手的
  11. ==和equals的區別
  12. hashmap和hashtable的區別,抽象類和接口的區別
  13. 常見的HASH算法有哪些,一致性hash瞭解過嗎,爲什麼有虛節點,一致性hash的應用場景(分佈式緩存)
  14. 解決hash碰撞的方法,開放地址法和拉鍊法外還有嗎
  15. 垃圾回收,回收算法,選一個回收器介紹
  16. 常見的排序都有哪些,歸併排序和堆排序的過程
  17. kafka都用來做什麼,怎麼保證系統的高可用性,怎麼保證消息不會丟失
  18. linux刪除空行的命令
  19. linux如何查看cpu的核數,lscpu cat /proc/cpuinfo top
  20. redis常見數據結構
  21. redis的哨兵模式
  22. redis的過期數據刪除,內存滿了怎麼辦,默認是哪個策略(noeviction,滿了就報錯,禁止淘汰數據)
  23. 計算機網絡中的擁塞控制
  24. 算法題,根節點到葉子節點組成的數的和。
  25. 1G大小的文件,內存1M,每行由單詞組成,找出頻數最高的100個。(歸併)最小堆

二面(80min)

  1. 自我介紹

  2. epoll沒處理完數據會怎麼樣

  3. connect和accept對應的TCP狀態

  4. 容器的文件系統

  5. 容器怎麼實現CPU資源隔離的

  6. ConcurrenHashMap怎麼擴容,實現機制

  7. hash衝突的解決辦法

  8. 死鎖產生的條件

  9. 互斥條件(不可剝奪條件,請求和保持條件,循環等待條件)

  10. mysql事務的特性,隔離級別,能解決什麼問題,頁鎖(頭會聽說)

  11. 算法題:

-有序的二維數組查找 -LRU+TTL

三面(40 min)

  1. 自我介紹,項目問題
  2. redus在項目中用在哪些方面,常用數據結構,zset怎麼實現的,zset應用場景
  3. udp怎麼實現可靠傳輸,怎麼保證大文件傳輸可靠,怎麼實現斷點傳輸。
  4. nginx負載均衡算法,一致性hash算法,一致性hash帶權重怎麼實現
  5. TCP中首部中的序號佔多少個字節,爲什麼要這樣用。
  6. 怎麼學習技術的,都學過什麼。
  7. 容器(docker)的網絡模型
  8. 研究課題相關
  9. 反問

** HR面(30min)**

 主要就問了有哪些offer,打算去哪,有沒有女朋啊和一些技術問題的概念解釋。

華爲

一面(30min)

  1. 自我介紹
  2. .問項目,自我介紹裏面的
  3. 3.算法題:給定一個數組,找出裏面能構成三角形的最大周長構不成就返回0
  4. 4.java設計模式(模板模式,代理模式,工廠模式,單例模式)
  5. 5.快排和歸併排序的區別(都是基於分治的思想,歸併排序是穩定的排序,O(nlogn),最壞情況也不變,快排是不穩定的排序時間複雜度O(nlogn),最壞情況是O(n2))
  6. 6.final用法都有什麼作用(修飾變量,類,方法)
  7. 7.不可變對象
  8. 8.根據前序中序求後序

二面 (40min)

1.自我介紹

2.面向對象的設計原則,單一職責原則,開閉原則(怎麼實現)

3.設計模式,你熟悉的(模板模式,代理模式,工廠模式,單例模式)

4.中間件(redis,kafka)

5.mysql語句,查詢一個字段,用某個字段排序,顯示某一頁多少個內容

6.算法題:拼單詞,字符可以能拼出哪些單詞。

三面(45min)

1.自我介紹

2.深挖項目(微衆銀行的比賽,選擇標準,取得成績的標準,你是負責幹什麼的,團隊分工,團隊是否有分歧,怎麼解決的,項目有沒有遇到什麼問題,怎麼解決的,如果你這個東西要商用的話,還需要怎麼改進,有沒有考慮過安全問題,怎麼判斷惡意訪問)

3.問了科研項目,有沒有遇到什麼問題,遇到最困難的問題是什麼,怎麼解決的,有沒有看過源碼。

4.反問(問了部門組成,以及連接與協同是做什麼的(物聯網))

當時在字節和京東直接猶豫了很久,最後還是選擇了華爲


美團(涼經)

一面

 1.自我介紹

 2.聊項目

 3.手撕mysql,查詢點播量最高的視頻

select viod_name from table order by times desc limit 0,1

 4.mysql,查詢點播最高的用戶

select userid,count(*) as times from table group by userid order by times desc limit 0,1

5.redis的數據結構,redis的性能爲什麼好

6.redis的過期機制和內存淘汰策略

7.redis持久化的方式(沒答出來)

8.redis併發問題(沒答出來,兩個用戶同時修改一個key)

9.redis lru是怎麼實現的。(通過鏈表實現的)

10.java的集合,concurrenthashmap怎麼解決併發問題的,Hashtable怎麼解決的。

11.常用的垃圾回收算法(parralell)

12.cms怎麼解決內存碎片的問題(full gc)

  • 增大Xmx或者減少Xmn
  • 在應用訪問量最低的時候,在程序中主動調用System.gc(),比如每天凌晨。
  • 在應用啓動並完成所有初始化工作後,主動調用System.gc(),它可以將初始化的數據壓縮到一個單獨的chunk中,以騰出更多的連續內存空間給新生代晉升使用。
  • 降低-XX:CMSInitiatingOccupancyFraction參數以提早執行CMSGC動作,雖然CMSGC不會進行內存碎片的壓縮整理,但它會合並老生代中相鄰的free空間。這樣就可以容納更多的新生代晉升行爲。

13.mysql建立索引的原則

14.四次揮手的過程和狀態

15.算法題:求兩個String類型的整形加法String num1 = "123";String num1 = "456";相加然後反轉

二面(80min)

1.自我介紹

2.說一下項目裏面的具體做什麼的,怎麼保存在線觀看的人數

3.mysql大表優化

4.有用過哪些redis命令嗎(沒有)

5.數據庫裏面都有什麼表

6.項目裏面實現最難的功能是什麼

7.進程和線程的區別

8.爲什麼進程切換慢,線程切換快

9.怎麼實現多線程

10.線程池都有什麼,怎麼創建,線程池參數,有用過線程池嗎(沒有)

11.線程都有哪些狀態,怎麼讓線程進入阻塞狀態,阻塞,非阻塞,同步和異步的區別

12.JVM內存模型

13.算法題
兩個鏈表相加,1-2-3-4-5,1-2-3-4結果就是1-3-5-7-9 兩個線程交替打印奇數和偶數(說了想法,沒有寫)
14.最近在看什麼書嗎,有沒有接觸過什麼新技術

15.有offer嗎

後面沒收到任何通知,涼涼。這麼簡單的算法題,當時那面試官一臉看弱雞的表情,給我整怕了,沒寫好,雖然寫出來了。


寫在最後

 天道酬勤,雖然準備晚了,但是努力就會有好結果,中間也有迷茫,也有失落,但是硬着頭皮在2個月不到的時間刷了400道左右的題目。

當然最重要的一點就是堅持,不要放棄。船到橋頭自然直。柳暗花明又一村。offer總會有的,不要妄自菲薄。堅持纔會勝利,衝鴨!!!

** 最後把面試資料100%免費分享給大家,也幫大家都能升職加薪!**

資料領取:戳這裏免費領取,暗號:簡書

愛編程,愛分享,聽說點贊+關注的都進大廠了哦!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章