記錄面試龍騰簡合-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 查詢未讀站內資訊,資料庫表中有欄位表示已讀或未讀,使用者點選了未讀的站內信則將狀態設定為已讀。
=============================
技術面試小結:技術面問的大都以簡歷專案、技術為基礎,進行擴充套件。所有!想去龍騰面試的小夥伴一定要熟悉簡歷上的技術!做足準備!
面試結果:未通過。 原因諮詢,大體上也知道為啥沒通過。。 個人技術層面還有很大的提升層面、不夠自信、技術面時緊張。
希望這篇部落格能幫助到想進龍騰簡合工作的小夥伴~ 若有小夥伴看過了這篇部落格,並順利面試進入龍騰簡合,記得來這留言說一聲呦~
==============================