大家好,我是田哥
一位朋友去新國都面試的面經(jīng),很多人說他們問得內(nèi)容差不多 , 所以特此給大家整理一份面經(jīng)和參考答案 。
一面 40多分鐘,二面等通知
面試問題參考答案
這里先說清楚,參考答案哈,不可能每個點都講得很清楚,畢竟 , 面試很多時候是看你是否回答到點上 。
1、自我介紹
大眾化的回答:
面試官你好,我叫張三,河南人,畢業(yè)于XX大學數(shù)據(jù)庫映射文件系統(tǒng),從XX年畢業(yè)后就一直從事java開發(fā),差不多3年了吧 。來貴公司面試數(shù)據(jù)庫映射文件系統(tǒng),尋求一份java開發(fā)工作 。
自我介紹要說幾個點:你是誰,你的優(yōu)點是什么?這么多年你干了啥?在學校獲得過什么獎?對哪些技術(shù)有深入研究?是否有高并發(fā)系統(tǒng)的設(shè)計?是否參與過什么大型項目?
總之,把你有的家底都亮出來,讓人家知道你哪方面相對比較強 。
2、熟悉 Java中有哪些 集合?
Java的集合類型主要有3種:set(集)、list(列表)和map(映射) 。
List(有序、可重復):List里存放的對象是有序的,同時也是可以重復的,List的是索引,擁有一系列和索引相關(guān)的方法,查詢速度快 。因為往list集合里插入或刪除數(shù)據(jù)時,會伴隨著后面數(shù)據(jù)的移動,所有插入刪除數(shù)據(jù)速度慢 。常用實現(xiàn)類:、 。
Set(無序、不能重復):Set里存放的對象是無序,不能重復的,集合中的對象不按特定的方式排序,只是簡單地把對象加入集合中 。常用實現(xiàn)類: 。
Map(鍵值對、鍵唯一、值不唯一):Map集合中存儲的是鍵值對,鍵不能重復,值可以重復 。根據(jù)鍵得到值,對map集合遍歷時先得到鍵的set集合,對set集合進行遍歷,得到相應(yīng)的值 。常用實現(xiàn)類:、、 。
面試官可能會深入地對某個集合框架實現(xiàn)類進行深入地追問,這是后話哈,能回答上面基本上可以了 。
3、和有什么區(qū)別
第一點:他們的底層數(shù)據(jù)結(jié)構(gòu)不同,底層是基于數(shù)組實現(xiàn)的 , 底層是基于單鏈表實現(xiàn)的 。
第二點:由于底層數(shù)據(jù)結(jié)構(gòu)不同,他們所適用的場景也不同,更適合隨機查找 , 更適合刪除和添加,查詢、添加、刪除的時間復雜度不同 。
第三點:和都實現(xiàn)了List接口,但是還額外實現(xiàn)了Deque接口,所以,還可以當做隊列來使 。
第四點:時間復雜度,:查詢O(1),增刪可能涉及數(shù)組擴容和[拷貝] (不是100%)。:查詢O(N),增刪O(1),但增刪要先找到元素位置。
4、說說JVM內(nèi)存區(qū)域
JVM內(nèi)存區(qū)域也通常稱之為運行時數(shù)據(jù)區(qū):程序計數(shù)器、虛擬機棧、本地方法棧、方法區(qū)、堆 。
其中,方法區(qū)和堆是線程共享的 。而程序計數(shù)器、java虛擬機棧和本地方法棧是線程私有 。
程序計數(shù)器:字節(jié)碼解釋器通過改變程序計數(shù)器來依次讀取指令,從而實現(xiàn)代碼的流程控制 。在多線程的情況下,程序計數(shù)器用于記錄當前線程執(zhí)行的位置 。不會出現(xiàn)OOM 。
虛擬機棧:每個線程都有自己的虛擬機棧,虛擬機棧的生命周期和線程一致 。每次方法的調(diào)用,產(chǎn)生一個棧幀并入棧,方法調(diào)用完畢該棧幀就出棧 。棧幀里包含局部變量表、操作數(shù)棧、動態(tài)鏈接和方法返回地址 ??赡軙霈F(xiàn)棧溢出,也可能會出現(xiàn)OOM 。
本地方法棧:類似虛擬機棧,不過對應(yīng)的是虛擬機使用到的本地方法 。
堆:基本上所有對象都在堆中創(chuàng)建,堆又分為新生代和老年代,新生代又分為Eden區(qū)、,(有時也叫做from區(qū)、to區(qū)) ,Eden::=8:1:1(默認) ??赡軙霈F(xiàn)OOM 。大部分對象都是在Eden區(qū)創(chuàng)建和滅亡 , 但如果對象太大了,可能會直接在老年代里創(chuàng)建 。Eden區(qū)創(chuàng)建 , 如果沒背回收,就到,如果又沒被回收,就到 , 和相互進行拷貝,到達一定程度就會到老年代 。JDK1.7 及其之前堆內(nèi)存被分為: 新生代+老年代+永久代 。JDK1.8及其之后堆內(nèi)存邏輯上分為三部分:新生區(qū) +老年代 + 元空間 。
方法區(qū):用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù) 。方法區(qū)是一種規(guī)范,JDK7之前使用永久代實現(xiàn) , JD8及以后 , 采用元空間實現(xiàn) 。
JDK1.7之前運行時常量池邏輯包含讓字符串常量池存放在方法區(qū)發(fā), 此時虛擬機對方法區(qū)的實現(xiàn)為永久代 。
JDK1.7把 字符串常量池、靜態(tài)變量拿出來放在了堆中 , 但是其他的仍在方法區(qū)(永久代) 。
JDK1.8 移除了永久代,使用元空間()取而代之,這時候字符串常量池、靜態(tài)變量還在堆,運?時常量池還在?法區(qū) 。
5、那你說一下對象從創(chuàng)建到銷毀過程
比如下面這段代碼:
Student stu = new Student(“田哥”); stu.add(); stu=null;
6、什么時候引起Full GC,有什么危害
GC:,在通常意義上大家所說的Full GC為一次特殊GC行為的描述 , 這次GC會回收整個堆的內(nèi)存,包含老年代,新生代,等。Full GC的全過程中所有用戶線程都是處于暫停的狀態(tài),也就是所謂的STW(stop the world ) 。
7、SQL 優(yōu)化手段,你知道哪些?
1、開啟查詢緩存,優(yōu)化查詢
2、你的查詢,這可以幫你分析你的查詢語句或是表結(jié)構(gòu)的性能瓶頸 。的查詢結(jié)果還會告訴你你的索引主鍵被如何利用的,你的數(shù)據(jù)表是如何被搜索和排序的
3、當只要一行數(shù)據(jù)時使用limit 1,MySQL數(shù)據(jù)庫引擎會在找到一條數(shù)據(jù)后停止搜索,而不是繼續(xù)往后查少下一條符合記錄的數(shù)據(jù)
4、為搜索字段建索引
5、使用ENUM而不是,如果你有一個字段,比如“性別”,“國家”,“民族”,“狀態(tài)”或“部門”,你知道這些字段的取值是有限而且固定的,那么,你應(yīng)該使用 ENUM 而不是 。
6、很像存儲過程,是一種運行在后臺的SQL語句集合,我們可以從使用獲得很多好處,無論是性能問題還是安全問題 。可以檢查一些你綁定好的變量,這樣可以保護你的程序不會受到“SQL注入式”攻擊
7、垂直分表

文章插圖

文章插圖
8、選擇正確的存儲引擎
說個三五種基本上過關(guān),越多越好 。
8、事物的四大特性
傳說中的ACID
1、原子性()
原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,這和前面兩篇博客介紹事務(wù)的功能是一樣的概念,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫,如果操作失敗則不能對數(shù)據(jù)庫有任何影響 。
2、一致性()
一致性是指事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài) , 也就是說一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài) 。
拿轉(zhuǎn)賬來說 , 假設(shè)用戶A和用戶B兩者的錢加起來一共是5000,那么不管A和B之間如何轉(zhuǎn)賬,轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個用戶的錢相加起來應(yīng)該還得是5000,這就是事務(wù)的一致性 。
3、隔離性()
隔離性是當多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離 。
即要達到這么一種效果:對于任意兩個并發(fā)的事務(wù)T1和T2,在事務(wù)T1看來,T2要么在T1開始之前就已經(jīng)結(jié)束,要么在T1結(jié)束之后才開始,這樣每個事務(wù)都感覺不到有其他事務(wù)在并發(fā)地執(zhí)行 。
4、持久性()
持久性是指一個事務(wù)一旦被提交了 , 那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作 。
例如我們在使用JDBC操作數(shù)據(jù)庫時,在提交事務(wù)方法后,提示用戶事務(wù)操作完成,當我們程序執(zhí)行完成直到看到提示后 , 就可以認定事務(wù)以及正確提交,即使這時候數(shù)據(jù)庫出現(xiàn)了問題,也必須要將我們的事務(wù)完全執(zhí)行完成,否則就會造成我們看到提示事務(wù)處理完畢,但是數(shù)據(jù)庫因為故障而沒有執(zhí)行事務(wù)的重大錯誤 。
9、事務(wù)如何保證原子性
MySQL原子性的保證是利用了undo log 。undo log名為回滾日志,是實現(xiàn)原子性的關(guān)鍵 , 當事務(wù)回滾時可以撤銷全部已經(jīng)成功執(zhí)行的sql語句,他須要記錄你要回滾的相應(yīng)日志信息 。undo log記錄了這些回滾須要的信息,當事務(wù)執(zhí)行失敗或調(diào)用了,致使事務(wù)須要回滾,即可以利用undo log中的信息將數(shù)據(jù)回滾到修改以前的樣子 。
10、分布式事務(wù)
當我們在跨多個服務(wù) , 操作多個數(shù)據(jù)庫時 。就會涉及分布式事務(wù),需要操作的資源位于多個資源服務(wù)器上 , 而應(yīng)用需要保證對于多個資源服務(wù)器的數(shù)據(jù)的操作,要么全部成功,要么全部失敗 。本質(zhì)上來說,分布式事務(wù)就是為了保證不同資源服務(wù)器的數(shù)據(jù)一致性 。
分布式事務(wù)解決方案幾乎都是柔性事務(wù),常見的有2PC/3PC、TCC、MQ最終一致性解決方案,至于工作中用哪種方案,需要根據(jù)業(yè)務(wù)場景選取,2PC/3PC、TCC數(shù)據(jù)強一致性高,而MQ是最終數(shù)據(jù)一致 。
@ 如何指定隔離級別
在使用時,@(= .)中的就是我們的隔離級別 , 對應(yīng)有一個枚舉,這個枚舉里定了四種隔離級別:
(對應(yīng)數(shù)據(jù)庫默認隔離級別)、、、、
11、中IOC和AOP的理解
IOC
1.IOC 控制反轉(zhuǎn),是指創(chuàng)建對象的控制權(quán)轉(zhuǎn)移,以前創(chuàng)建對象的主動權(quán)和時機是由自己把控的,而現(xiàn)在這種權(quán)力轉(zhuǎn)移到容器中,并由容器根據(jù)配置文件去創(chuàng)建實例和管理各個實例之間的依賴關(guān)系 , 對象與對象之間松散耦合,也利于功能的復用 。DI依賴注入,和控制反轉(zhuǎn)是同一個概念的不同角度的描述 , 即應(yīng)用程序在運行時依賴IOC容器來動態(tài)注入對象需要的外部資源
2.最直觀的表達就是,IOC讓對象的創(chuàng)建不用去new了 , 可以由自動生產(chǎn),使用java的反射機制,根據(jù)配置文件在運行時動態(tài)的去創(chuàng)建對象以及管理對象,并調(diào)用對象的方法
3. 的IOC有三種注入:方法注入,構(gòu)造器注入,接口注入
AOP
OOP面向?qū)ο螅试S開發(fā)者定義縱向關(guān)系,但并適用于定義橫向的關(guān)系,導致了大量代碼的重復,而不利于各個模塊的重用 。
AOP,一般稱為面向切面,作為面向?qū)ο蟮囊环N補充,用于將那些與業(yè)務(wù)無關(guān),但卻對多個對象產(chǎn)生影響的公共行為和邏輯 , 抽取并封裝為一個可重用的模塊,這個模塊被命名為“切面()”,減少系統(tǒng)中的重復代碼 , 降低了模塊間的耦合度,同時提高系統(tǒng)的可維護性 ??捎糜跈?quán)限認證、日志、事務(wù)處理等 。
AOP中的動態(tài)代理主要有倆種方式,JDK動態(tài)代理和CGLIB動態(tài)代理
12、如何進行依賴注入,和區(qū)別
就是通過Bean的屬性名稱(id或name)自動裝配 。當一個bean節(jié)點帶有的屬性時,需要注意下面三點:
(1)將查找其類中所有的set方法名 , 例如,獲得將set去掉并且首字母小寫的字符串,即cat 。(2)去容器中尋找是否有此字符串名稱id的對象 。(3)如果有,就取出注入;如果沒有 , 就報空指針異常 。
就是通過Bean的Class類型來自動裝配 。使用 首先需要保證:同一類型的對象,在容器中唯一 。如果不唯一,會報不唯一的異常 。
14、說一個自己熟悉的項目,講講收獲(實習或簡歷上的項目)
這個肯定要說自己最熟悉的項目咯,先說業(yè)務(wù),如果是負責人,那就要項目核心業(yè)務(wù)給說清楚,如果是負責部分,那就把自己負責的那部分能說清楚 。然后說項目技術(shù)棧 , 最后再說項目并發(fā)量如何?數(shù)據(jù)量如何?解決過什么問題?
15、手寫單例模式
這個得需要自己事先準備過,可以寫雙重檢查模式,也可以寫枚舉式 。自己看著辦 ??梢詤⒖嘉抑皩懙囊黄恼?。
16、反問
面試最后一個環(huán)節(jié)就是:你還有什么想我的嗎?
有時候是客氣時這么反問,有時候又是真的反問,所以,此時需要謹慎提問 。別問一些無聊的話題,你們公司什么會調(diào)薪?你們加班多嗎?但是你很牛,到也不怕,一般人還是別問哈 。
看完了,記得幫忙一健三連:、轉(zhuǎn)發(fā)、,先謝啦!
回復77獲取java面試小抄一本,回復電子書獲取java后端必讀的200本電子書 。
【新國都 Java面經(jīng) 附參考答案】本文到此結(jié)束,希望對大家有所幫助 。
- 泄露字節(jié)最新秋招面試題,“死記”這些你也可以斬獲字節(jié)offer
- 冰箱新開機要大概多久才能凍
- 新浪微博我加了的人,為什么不見了?
- ?歡迎新媳婦加入大家庭祝福語
- 新冠肺炎失去生育能力真的假的
- 唐嫣與羅晉曾因戲生情 ?羅晉唐嫣最新消息
- ?《追光吧》初舞臺全曝光 第二季全新改版
- 事關(guān)疫情防控!桓臺、高青、沂源、博山、高新區(qū)最新發(fā)布
- ?李一桐金瀚新劇陷入戀愛循環(huán) 電視劇《烏云遇皎月》劇情簡介
- 新鮮魚怎樣做好吃又簡單
