1. 程式人生 > >記錄面試龍騰簡合-java開發工程師經歷

記錄面試龍騰簡合-java開發工程師經歷

/**
 * ############
 *  變強是會掉光頭髮的!現在的頭髮還是很茂盛,是該開心還是難過呢。。
 * ############
 * /

    總結下近期面試龍騰簡合-java開發崗的經歷。附上筆試、技術面試題以及相應的題解。有些題目記憶有點模糊了,這裡就大概描述下。

我先做個人說明, 學歷非雙福州普通二本計算機專業,畢業兩年多,近期因個人原因想換工作,體驗下其他IT公司的氛圍。

廢話多少,開始進入正題。

整個過程分三個步驟:

 ============================= 

  • 線上筆試
  • HR面試 -- 龍騰HR小姐姐很nice,HR面溝通的很愉快
  • 技術面試  -- 感覺是一個技術大佬面,感到緊張。╮(╯▽╰)╭

 ============================= 

一、線上筆試

    一開始是在boss直聘軟體上,龍騰簡合HR小姐姐主動溝通,加上自己本意有想去龍騰的想法,就簡單的聊了幾句,併發送個人簡歷給HR。HR看了後,就溝通安排線上筆試了。

線上筆記有視訊監考,作為誠實本分的孩子是不會作弊的!(′▽`〃)

一共有16道題,涉及js正則表達 、演算法、資料庫、linux命令、springboot、集合執行緒、前端react、promise原理、nodejs載入json方式、Mybatis。(技術渣渣表示想哭╥﹏╥...)

   1、有正則表示式:/^[a-zA-Z]+$/,判斷alert((/^[a-zA-Z]+$/.test(null))); 和 alert((/^[a-zA-Z]+$/.test())); 輸出的是什麼?

        解答:這道為選擇題,考察正則表示式基礎。該表示式為判斷字串是否全部為字母。用法(/^[a-zA-Z]+$/.test(element)),這裡 element 是可以為null或為空,所以輸出為true、true.

  小夥伴可自己編寫測試下,加深記憶。

   2、linux如何後臺重啟個jar程式包, 命名為test.jar

     解答:熟悉nohup命令的小朋友應該很容易上手。這題主要分兩步:

     第一步找到正在執行的test.jar程序,並kill掉該程序;第二步後臺重啟。

1 $ ps -ef | grep test
2 xxxx    1824  0 21:54 pts/0    00:00:00 xxx xxxx
3 & kill -9 1824
4 $nohup java -jar test.jar &
//nohup 意思是不掛斷執行命令,當賬戶退出或終端關閉時,程式仍然執行
//當然,後臺啟動jar還有其他方式,比如 java -jar shareniu.jar & , 其中 & 表示後臺啟動。

     3、有36輛賽車6條跑道,在沒有計時器的情況下,需要最少比賽多少輪才能選出最快的前3輛?

     解答:考察邏輯思維題。 總共需要8次。 參考:http://www.mamicode.com/info-detail-2267257.html

     這裡我說一次我的對這道題的理解:

  • 首先,36輛車分6組,進行比賽,每組取前3名,淘汰6x3=18輛

     

  •  每組第1名進行一輪比賽,選出前3名的組,並淘汰後3名的組,一共淘汰3x3=9輛。 這裡假設A\B\C這三組的車為前三名:

      

    到這一步可以確定第一名是哪一車,這裡假定第一名為車A1, 接下來要確定哪輛車是第二名和第三名。這裡只要簡單分析下,就能淘汰掉車C2、車C3和車B2。

    淘汰車C2和C3的理由:車A1 > 車B2>車C3>車C2>車C3;

     淘汰車B2的理由:車A1>車B1>車B2>車B3

     

  •    因為已經確定A1為最快的車,所以只需要將車A2\A3\B1\B2\C1 進行一輪比賽就能確定第二名和第三名了。

       因此,需要 6+ 1+ 1 =8 輪,才能選取最快的3輛。

     4、解釋下React state 和React props

        參考:https://baijiahao.baidu.com/s?id=1627980825860407519&wfr=spider&for=pc

        解答:工作兩三年未使用和學習過前端react,好奇龍騰使用的前端是Vue。為啥會考react方面的知識.雖然也沒用過vue,任職公司使用的Angular4..π__π

       react state: React 把元件看成是一個狀態機(State Machines)。通過與使用者的互動,實現不同狀態,然後渲染 UI,讓使用者介面和資料保持一致。React裡,只需更新元件的 state,然後根據新的 state 重新渲染使用者介面(不要操作 DOM)。

       參考:https://www.runoob.com/react/react-state.html

       react props:Props是Properties的簡寫。它們是隻讀元件,工作方式類似於HTML屬性。Prop是一種將資料從父元件傳遞給子元件的方法。

       具體深入的內容,我也不太瞭解,小夥伴們可自行google/百度。

     5、編寫js函式,有兩個引數一個時間字元,一個小時增減量,傳入時間如 2018-10-10 01:00:00,和小時節點增加量 3,函式輸出  2018-10-10 04:00:00

       解答:熟悉js時間與字串轉換、時間操作的小夥伴們,應該是很容易的。 作為一個 ctrl+c 和 ctrl+v 的程式設計師感動心累( -'`-; )

 1 /*
 2    對時間進行操作
 3 */ 
 4  function t(d, num) {
 5             var t = new Date(d.replace(/-/g, '/'));
 6             t.setTime(t.setHours(t.getHours() + num));
 7             var dataStr = (t.getFullYear()) + '-' + (fillZero(t.getMonth() + 1))
 8                 + '-' + (fillZero(t.getDate())) + ' ' + (fillZero(t.getHours())) + ':' + (fillZero(t.getMinutes())) + ':' + (fillZero(t.getSeconds()))
 9             alert(dataStr);
10         }
11   /*
12     時間欄位前補0
13    */
14         function fillZero(num) {
15             if (num < 10) {
16                 return '0' + num;
17             }
18             return num;
19         }
t("2018-10-10 01:00:00", -3);

        6、解釋下什麼是primose,並寫一個primise

                解答:屬於ES6範圍,primose作用:

      1、主要用於非同步計算;
      2、可以將非同步操作佇列化,按照期望的順序執行,返回符合預期的結果;
      3、可以在物件之間傳遞和操作promise,幫助我們處理佇列。

Promise最大的好處是在非同步執行的流程中,把執行程式碼和處理結果的程式碼清晰地分離了,Promise還可以做更多的事情,比如,有若干個非同步任務,需要先做任務1,如果成功後再做任務2,任何任務失敗則不再繼續並執行錯誤處理函式。要序列執行這樣的非同步任務,不用Promise需要寫一層一層的巢狀程式碼。有了Promise,我們只需要簡單地寫:

job1.then(job2).then(job3).catch(handleError); // job1 job2 job3 為Promise物件。

// 一個簡單的例項 new Promise(resolve => { setTimeout(() => { resolve('hello') }, 2000) }).then(res => { console.log(res) }) 

         參考:https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544,https://www.jianshu.com/p/1b63a13c2701

       7、springboot自動配置原理,如果載入配置檔案

        解答:涉及springboot原理。參考:https://jingyan.baidu.com/article/fdbd4277a277edb89e3f48fa.html

    Spring Boot啟動的時候會通過@EnableAutoConfiguration註解找到META-INF/spring.factories配置檔案中的所有自動配置類,並對其進行載入,而這些自動配置類都是以AutoConfiguration結尾來命名的,它實際上就是一個JavaConfig形式的Spring容器配置類,它能通過以Properties結尾命名的類中取得在全域性配置檔案中配置的屬性如:server.port,而XxxxProperties類是通過@ConfigurationProperties註解與全域性配置檔案中對應的屬性進行繫結的。

 從啟動類的@SpringBootApplication進入,在裡面找到了@EnableAutoConfiguration:

                

            8、nodejs讀取json檔案的幾種方式

     解答:我對nodejs 不熟,有知道的小夥伴能否留言解答下 (#`-_ゝ-)

1 var fs=require('fs')
2 fs.readFile('file.json','utf8',function (err, data) {
3 if(err) console.log(err);
4 var test1=JSON.parse(data);
5 });

            9、ConcurrentHashMap與HashTable的區別,是怎麼實現執行緒安全的?      

ConcurrentHashMap底層採用分段的陣列+連結串列實現,執行緒安全。通過把整個Map分為N個Segment,可以提供相同的執行緒安全,但是效率提升N倍,預設提升16倍。(讀操作不加鎖,由於HashEntry的value變數是 volatile的,也能保證讀取到最新的值。)Hashtable的synchronized是針對整張Hash表的,即每次鎖住整張表讓執行緒獨佔,ConcurrentHashMap允許多個修改操作併發進行,其關鍵在於使用了鎖分離技術。鎖分段技術:首先將資料分成一段一段的儲存,然後給每一段資料配一把鎖,當一個執行緒佔用鎖訪問其中一個段資料的時候,其他段的資料也能被其他執行緒訪問。 

HashTable底層陣列+連結串列實現,無論key還是value都不能為null,執行緒安全,實現執行緒安全的方式是在修改資料時鎖住整個HashTable,效率低,ConcurrentHashMap做了相關優化初始size為11,擴容:newsize = olesize*2+1. 

            10、mysql單表資料量很大,導致增刪改查都很慢,有什麼優化的意見?

 方案一:優化現有資料庫:

   1.資料庫設計和表建立時就要考慮效能;

   2.sql的編寫需要注意優化;

   4.分割槽;

   5.分表;

   6.分庫;

   7.移除冗餘資料;

   8.建立適合的索引:

  • 索引並不是越多越好,要根據查詢有針對性的建立,考慮在WHERE和ORDER BY命令上涉及的列建立索引,可根據EXPLAIN來檢視是否用了索引還是全表掃描;
  • 應儘量避免在WHERE子句中對欄位進行NULL值判斷,否則將導致引擎放棄使用索引而進行全表掃描;
  • 值分佈很稀少的欄位不適合建索引,例如"性別"這種只有兩三個值的欄位;
  • 字元欄位只建字首索引;
  • 字元欄位最好不要做主鍵;
  • 不用外來鍵,由程式保證約束;
  • 儘量不用UNIQUE,由程式保證約束;
  • 使用多列索引時主意順序和查詢條件保持一致,同時刪除不必要的單列索引

           方案二:升級資料庫型別,換一種100%相容mysql的資料庫。

       方案三:去掉mysql,換大資料引擎處理資料。

      參考:https://blog.csdn.net/afsvsv/article/details/84998119

      11、考察sql編寫功底, 提供交易表,寫出去重、分組統計的語句。

       解答:具體的欄位名稱有點忘了,大體說一下解題思路:

        1、去重,可以用 distinct 或group by

        2、 分組統計,不用多少了,使用group by ,對於統計不同型別的交易數量 可以使用 sum(case when type =1 then 1 else 0 end)sum_type1

     12、mybatis操作資料庫的幾種方式?

        這裡我對mybatis 不熟, 大體知道有種,一種基於全註解的方式,一種配置xml的方式。

 =============================

  線上筆試小結: 還有4道題記憶模糊了,考試時間為2個小時,技術渣渣表示大半不會,,後面放棄掙扎,唱起一首涼涼。。╥﹏╥...

 ==============================

二、HR面試

  •  個人基本情況、興趣愛好等;
  •  任職公司基本情況、工作內容、有沒有印象深刻的問題等、怎麼看待加班、用的什麼技術等;

 =============================

   HR面試小結:基本操作,沒有技術面的壓力,問一些基本情況。

 ==============================

三、技術面試

    技術面問的大都以簡歷專案、技術為基礎,進行擴充套件。所有!想去龍騰面試的小夥伴一定要熟悉簡歷上的技術!做足準備!

     1、ngnix應用的場景?

    Nginx一是一款輕量級的、高效能的HTTP、反向代理伺服器,具有很高的穩定性、支援熱部署、模組擴充套件也非常容易。Nginx採取了分階段資源分配技術,處理靜態檔案和無快取的反向代理加速,實現了負載均衡和容錯,在這樣高併發的訪問情況下,能經受起高併發的處理。可以做web伺服器、反向代理伺服器、電子郵件伺服器限制正常使用者的請求範圍(下載速度、訪問頻率)過濾非正常使用者的http請求。

    參考:https://www.cnblogs.com/chenliangcl/p/7417602.html

         2、Oauth2.0協議流程

         

             參考:https://jinnianshilongnian.iteye.com/blog/2038646

       3、資料表資料原則?

         3.1 資料庫三大正規化

              第一正規化:列不可再分 

              第二正規化:行可以唯一區分,主鍵約束 

              第三正規化:表的非主屬性不能依賴與其他表的非主屬性 外來鍵約束 且三大正規化是一級一級依賴的,第二正規化建立在第一正規化上,第三正規化建立第一第二正規化上。    

          3.2 欄位設計需合理,欄位數量不超過20個,若有業務需要很多欄位的,可考慮分表,用主鍵、外來鍵進行關聯。

          3.3 索引的建立。索引引並不是越多越好,要根據查詢有針對性的建立,考慮在WHERE和ORDER BY命令上涉及的列建立索引,可根據EXPLAIN來檢視是否用了索引還是全表掃描;應儘量避免在WHERE子句中對欄位進行NULL值判斷,否則將導致引擎放棄使用索引而進行全表掃描。

          3.4 儘量用整型表示字串,用0表示null;儘可能使用not null定義欄位

          3.5 使用合理的欄位屬性長度,固定長度的表會更快。使用enum、char而不是varchar。

       4、讓你設計一個下拉框元件你會怎麼設計?

         我的知識盲區。。 參考:http://blog.xuxiangbo.com/im-46.html

                面試時我回答的幾個點: 需要考慮層級關係,要有個欄位表示父類、子類的關聯;滑鼠點選事件。

       5、tomcat調優?

      參考:https://blog.csdn.net/ljj_9/article/details/79145324

       5.1、為提高安全性,關閉自動部署,防止被植入木馬惡意攻擊;

           5.2、如果沒有使用Apache,禁用AJP。預設開啟狀態;

           5.3、HTTP1.1 Connector引數設定,tomcat 8.5預設使用nio,請改為使用nio2;

        5.4、沒有用到DNS時,禁用DNS;

       5.5、設定GET請求的Encoding,Tomcat8.5預設即為UTF-8,如使用UTF-8則下面語句無需設定;如使用其他Encoding,請參考下面語句來設定;

        5.6、如需通過壓縮來減少網路頻寬佔用,請採用反向代理+Tomcat的方式,壓縮交由反向代理,因為壓縮會增加Tomcat的負擔。

       5.7、配置執行緒池、執行緒數;

       5.8、jvm調優,例如以下:,更多請檢視參考連結

  Linux下修改TOMCAT_HOME/bin/catalina.sh

       JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m

     windows下修改TOMCAT_HOME/bin/catalina.bat

       set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m

      6、前端往後端傳遞資料的方式?比如提交表單資料?

         form表單提交、ajax提交、通過url字串拼接向後臺提交資料、通過a標籤提交資料,通過a標籤的href屬性提交資料,和js提交資料類似。

       7、平時自己空閒時間有學習什麼知識?有去下載什麼開源專案?有沒有應用到專案裡?

        自由發揮。

      8、實現web站內信,使用到了rabbitmq,訊息是怎麼展示在前端的進行提示?

        rabbitmq 做為訊息快取的中介軟體,生產者將訊息釋出在mq裡,消費者進行消費,將站內信資料存在資料庫中,前端使用ajax 查詢未讀站內資訊,資料庫表中有欄位表示已讀或未讀,使用者點選了未讀的站內信則將狀態設定為已讀。

 

 =============================

   技術面試小結:技術面問的大都以簡歷專案、技術為基礎,進行擴充套件。所有!想去龍騰面試的小夥伴一定要熟悉簡歷上的技術!做足準備!

 面試結果:未通過。 原因諮詢,大體上也知道為啥沒通過。。 個人技術層面還有很大的提升層面、不夠自信、技術面時緊張。

 希望這篇部落格能幫助到想進龍騰簡合工作的小夥伴~ 若有小夥伴看過了這篇部落格,並順利面試進入龍騰簡合,記得來這留言說一聲呦~

 ==============================