黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java學(xué)習(xí) 高級Java程序員:21道最新Java面試題剖析

高級Java程序員:21道最新Java面試題剖析

更新時間:2019-09-25 11:05:43 來源:動力節(jié)點 瀏覽3798次

 

 

  縱觀幾年來的Java面試題,你會發(fā)現(xiàn)每家都差不多。你仔細(xì)觀察就會發(fā)現(xiàn),HashMap的出現(xiàn)幾率未免也太高了吧!連考察的知識點都一樣,什么hash碰撞啊,并發(fā)問題啊!再比如JVM,無外乎考內(nèi)存結(jié)構(gòu),GC算法等!因此,如果是為了面試,完全是有套路可以準(zhǔn)備的!記住,基礎(chǔ)再好,也架不住面試官天馬行空的問,所以刷面試題還是很有必要的!

 

  面試題解析

 

  1、Map的底層結(jié)構(gòu)?(HashMap)

 

  評注:老題目了,各位面試的人員必須熟記!

 

  回答:Map是以鍵值對來存儲對象的,它的底層實際上是數(shù)組和鏈表來組成的,經(jīng)典的一張圖如下(別人畫的);

image.png

  當(dāng)使用put方法時,先查找出數(shù)組位置是否存在對象,通過key.hashcode對數(shù)組長度取余;存在,則把里面的鏈表拿出來,判斷鏈表里面是否存在key值與傳遞過來的key值一樣的對象,存在,則把傳遞過來的value取代鏈表key對應(yīng)的value,不存在,則直接通過鏈表的add()方法加到鏈表后面;

 

  當(dāng)使用get方法時,先查找出數(shù)組位置是否存在對象,通過key.hashcode對數(shù)組長度取余;如果不存在,則返回為空,如果存在,則遍歷鏈表,判斷鏈表里面是否存在key值與傳遞過來的key值一樣的對象,存在,則把key值對應(yīng)的value取出返回,不存在,則返回為空;

 

  2、線程安全的Map(concurrentHashMap)簡單的說了下這兩1.7和1.8的區(qū)別,本想問下要不要深入的講下(源碼級別),結(jié)果面試官說不用了。

 

  評注:老題目了,如果有時間,再去了解一下,解決HashMap線程安全的各種方法,以及原理!此題只能大概回答一下結(jié)構(gòu)的變化,因為其中的實現(xiàn)代碼都變了,細(xì)說可以說很久,估計面試官也沒時間聽!

 

  回答:

 

  jdk1.7中采用Segment+HashEntry的方式進(jìn)行實現(xiàn),結(jié)構(gòu)如下:

image.png

  Segment數(shù)組的意義就是將一個大的table分割成多個小的table來進(jìn)行加鎖,而每一個Segment元素存儲的是HashEntry數(shù)組+鏈表,這個和HashMap的數(shù)據(jù)存儲結(jié)構(gòu)一樣

 

  而jdk1.8中則

 

  去除Segment+HashEntry+Unsafe的實現(xiàn),

 

  改為Synchronized+CAS+Node+Unsafe的實現(xiàn)

 

  其結(jié)構(gòu)圖如下:

image.png

  如上圖所示,取消了Segment字段,數(shù)組中存儲的就是Node。它與HashMap中的HashEntry定義很相似,但是有一些差別。它對value和next屬性設(shè)置了volatile同步鎖,它不允許調(diào)用setValue方法直接改變Node的value域。

 

  另外,將原先table數(shù)組+單向鏈表的數(shù)據(jù)結(jié)構(gòu),變更為table數(shù)組+單向鏈表+紅黑樹的結(jié)構(gòu),在hash碰撞過多的情況下會將鏈表轉(zhuǎn)化成紅黑樹。

 

  3、項目MySQL的數(shù)據(jù)量和并發(fā)量有多大?

 

  評注:此題為走向題,你的回答不同,后面問題走向就變了。

 

  關(guān)于容量:單表行數(shù)超過500萬行或者單表容量超過2GB,此時就要答分庫分表的中間件了!那后面題目的走向就變?yōu)閙ycat、sharing-jdbc等分庫分表中間件的底層原理了!

 

  關(guān)于并發(fā)量:如果并發(fā)數(shù)過1200,此時就要答利用MQ或者redis等中間件,作為補(bǔ)償措施,而不能直接操作數(shù)據(jù)庫。那后面的題目走向就是redis、mq的原理了!

 

  介于面試者還是一個應(yīng)屆生,我斗膽猜測面試者是這么答的

 

  回答:數(shù)據(jù)量估計就三四百萬吧,并發(fā)量就五六百左右!

 

  4、你對數(shù)據(jù)庫了解多少?

 

  評注:因為你答的數(shù)據(jù)量和并發(fā)量不大,因此中間件這塊沒啥好問的。因此,題目走向變?yōu)閿?shù)據(jù)庫底層!另外,此題為引導(dǎo)題,面試官在給你機(jī)會引向你最擅長的方面!

 

  回答:了解常見數(shù)據(jù)庫調(diào)優(yōu)方法,索引優(yōu)化等!

 

  5、你說下數(shù)據(jù)庫的索引實現(xiàn)和非主鍵的二級索引

 

  評注:這個問題是根據(jù)上面,你的回答而問出來的!記得引向自己最擅長的數(shù)據(jù)庫基礎(chǔ)知識!默認(rèn)是回答mysql數(shù)據(jù)庫的

 

  回答:

 

  從數(shù)據(jù)結(jié)構(gòu)角度:

 

  B-Tree索引,數(shù)據(jù)結(jié)構(gòu)就是一顆B+樹。

 

  Hash索引,Hash索引比較的是進(jìn)行Hash運算之后的Hash值,所以它只能用于等值的過濾,不能用于基于范圍的過濾。基本不用!

 

  R-Tree索引,僅支持geometry數(shù)據(jù)類型,也基本不用!

 

  至于非主鍵的二級索引,這個實際上問的就是非聚簇索引!非聚簇索引本身就是一顆B+樹,其根節(jié)點指向聚簇索引的B+樹。

 

  6、項目用的是SpringBoot,你能說下SpringBoot與Spring的區(qū)別嗎?

 

  評注:基礎(chǔ)題,會springboot的,基本都答的上來。就算沒準(zhǔn)備過,當(dāng)場思考下都可以回答的出來!也是屬于引導(dǎo)題!

 

  回答:

 

  SpringBoot可以建立獨立的Spring應(yīng)用程序;

 

  內(nèi)嵌了如Tomcat,Jetty和Undertow這樣的容器,也就是說可以直接跑起來,用不著再做部署工作了。

 

  無需再像Spring那樣搞一堆繁瑣的xml文件的配置;

 

  可以自動配置Spring;

 

  提供了一些現(xiàn)有的功能,如量度工具,表單數(shù)據(jù)驗證以及一些外部配置這樣的一些第三方功能;

 

  提供的POM可以簡化Maven的配置

 

  7、SpringBoot的自動配置是怎么做的?

 

  評注:此題也是根據(jù)你的第七問,進(jìn)一步提問而得出。

 

  回答:

 

  先答為什么需要自動配置?

 

  顧名思義,自動配置的意義是利用這種模式代替了配置XML繁瑣模式。以前使用SpringMVC,需要進(jìn)行配置組件掃描、調(diào)度器、視圖解析器等,使用SpringBoot自動配置后,只需要添加MVC組件即可自動配置所需要的Bean。所有自動配置的實現(xiàn)都在spring-boot-autoconfigure依賴中,包括SpringMVC、Data和其它框架的自動配置。

 

  接著答spring-boot-autoconfigure依賴的工作原理?

 

  spring-boot-autoconfigure依賴的工作原理很簡單,通過@EnableAutoConfiguration核心注解初始化,并掃描ClassPath目錄中自動配置類對應(yīng)依賴。比如工程中有木有添加Thymeleaf的Starter組件依賴。如果有,就按按一定規(guī)則獲取默認(rèn)配置并自動初始化所需要的Bean。

 

  其實還能再繼續(xù)答@EnableAutoConfiguration注解的工作原理!不過篇幅太長,答到上面那個地步就夠了!

 

  8、MyBatis定義的接口,怎么找到實現(xiàn)的?

 

  評注:mybatis底層原理題,考察有沒有看過mybatis的原理。博主剛好曾經(jīng)自己寫過一個mybatis,所以此題恰巧答的上來。

 

  博主內(nèi)心活動:"現(xiàn)在校招的都這么牛逼了么!"

 

  回答:一共五步

 

  1.Mapper接口在初始SqlSessionFactory注冊的。

 

  2.Mapper接口注冊在了名為MapperRegistry類的HashMap中,key=Mapperclassvalue=創(chuàng)建當(dāng)前Mapper的工廠。

 

  3.Mapper注冊之后,可以從SqlSession中g(shù)et

 

  4.SqlSession.getMapper運用了JDK動態(tài)代理,產(chǎn)生了目標(biāo)Mapper接口的代理對象。

 

  5.動態(tài)代理的代理類是MapperProxy,這里邊最終完成了增刪改查方法的調(diào)用。

 

  9、Java內(nèi)存結(jié)構(gòu)

 

  評注:基礎(chǔ)題,這個應(yīng)該學(xué)JAVA的都會吧!送分題!如果博主沒理解錯應(yīng)該是在問JVM的內(nèi)存結(jié)構(gòu)!

 

  回答:JVM內(nèi)存結(jié)構(gòu)主要有三大塊:堆內(nèi)存、方法區(qū)和棧。堆內(nèi)存是JVM中最大的一塊由年輕代和老年代組成,而年輕代內(nèi)存又被分成三部分,Eden空間、FromSurvivor空間、ToSurvivor空間,默認(rèn)情況下年輕代按照8:1:1的比例來分配;

 

  方法區(qū)存儲類信息、常量、靜態(tài)變量等數(shù)據(jù),是線程共享的區(qū)域,為與Java堆區(qū)分,方法區(qū)還有一個別名Non-Heap(非堆);棧又分為java虛擬機(jī)棧和本地方法棧主要用于方法的執(zhí)行。

 

  10、對象是否可GC?

 

  評注:這個問題就是在問,JVM如何判斷對象是否需要被回收!不用答引用計數(shù)法,答可達(dá)性分析算法就行。

 

  回答:

 

  這個算法的基本思路是通過一些列稱為“GCRoots”的對象作為起始點,從這些點開始向下搜索,搜索走過的路徑稱為引用鏈,當(dāng)一個對象到GCRoots沒有任何引用鏈相連時,則證明對象需要被回收.

 

  如圖:

image.png

  上圖中o3,o4對象沒有任何GCRoots可達(dá)到,所有這兩個對象不可用了,需要被GC回收

 

  Java可作為GCRoots的對象包括下面幾種:

 

  虛擬機(jī)棧中引用的對象

 

  方法區(qū)中類靜態(tài)屬性引用的對象

 

  方法區(qū)中產(chǎn)量引用的對象

 

  本地方法棧中JNI引用的對象

 

  11、MinorGC和FullGC

 

  評注:基礎(chǔ)題,會JVM調(diào)優(yōu)的,基本都會!我只是奇怪,怎么沒問MajorGC呢?我們還是把MajorGC也給答了吧!

 

  回答:

 

  堆內(nèi)存是JVM中最大的一塊由年輕代和老年代組成。

 

  那么,從年輕代空間(包括Eden和Survivor區(qū)域)回收內(nèi)存被稱為MinorGC。

 

  MajorGC是清理老年代。

 

  FullGC是清理整個堆空間—包括年輕代和老年代。

 

  12、垃圾回收算法

 

  評注:基礎(chǔ)題,博主斗膽猜測,應(yīng)該是在問垃圾回收算法有哪些。面試官應(yīng)該沒有耐心去聽你一個個去背算法概念!

 

  回答:

 

  標(biāo)記-清除算法、標(biāo)記整理算法、復(fù)制算法、分代收集算法

 

  13、垃圾回收器G1

 

  評注:上面的題目更深入的問法。JVM可以配置不同的回收器。比如Serial,Parallel和CMS幾種垃圾回收器。以SerialCollector(串行回收器)為例,它在在年輕代是一個使用標(biāo)記-復(fù)制算法的回收器。在老年代使用的是標(biāo)記-清掃-整理算法。

 

  另外,關(guān)于G1回收器可以問的點很多,此題作者沒有描述清楚究竟問的是G1回收器的那個點,就滿回答一下概念吧!

 

  如果是我來問,我就直接給你場景,問你該用哪種回收器了。直接問回收器,那就比較容易了!

 

  常用參數(shù):

 

  -XX:+UseSerialGC:在新生代和老年代使用串行收集器

 

  -XX:+UseParNewGC:在新生代使用并行收集器

 

  //自己查詢吧,太多了!

 

  回答:

 

  G1GC是Jdk7的新特性之一、Jdk7+版本都可以自主配置G1作為JVMGC選項。G1將整個堆劃分為一個個大小相等的小塊(每一塊稱為一個region),每一塊的內(nèi)存是連續(xù)的,每個塊也會充當(dāng)Eden、Survivor、Old三種角色,但是它們不是固定的,這使得內(nèi)存使用更加地靈活。如下圖所示

image.png

  執(zhí)行垃圾收集時,收集線程在標(biāo)記階段和應(yīng)用程序線程并發(fā)執(zhí)行,標(biāo)記結(jié)束后,G1也就知道哪些區(qū)塊基本上是垃圾,存活對象極少,G1會先從這些區(qū)塊下手,因為從這些區(qū)塊能很快釋放得到很大的可用空間,這也是為什么G1被取名為Garbage-First的原因。

 

  14、項目里用過ElasticSearch和Hbase,有深入了解他們的調(diào)優(yōu)技巧嗎?

 

  評注:一個應(yīng)屆生搭的ElasticSearch和Hbase,一般都只是demo級別的,懂基本的CRUD的使用即可!一般不會去深入了解調(diào)優(yōu)技巧的!這個問題如果答深入了解過,是給自己挖坑!因為這個問題,答案太廣了!

 

  回答:并沒有深入了解過!

 

  15、SpringRestTemplate的具體實現(xiàn)

 

  評注:這題問的博主有點懵!如果是我來問,我會先問訪問Rest服務(wù)的客戶端這么多,為什么選SpringRestTemplate?然后才來原理。這個突然就冒出一個具體實現(xiàn),我是有點懵啦!

 

  回答:

 

  其實RestTemplate和sl4fj這種門面框架很像,本質(zhì)就是在Http的網(wǎng)絡(luò)請求中增加一個馬甲,本身并沒有自己的實現(xiàn)。

 

  底層可以支持多種httpclient的http訪問,上層為ClientHttpRequestFactory接口類,底層如下所示:

image.png

 

  那么RestTemplate則封裝了組裝、發(fā)送HTTP消息,以及解析響應(yīng)的底層細(xì)節(jié)。

 

  答到這個份上可以了,難道你還要把類之間關(guān)系的引用圖,畫出來?太不現(xiàn)實了!

 

  16、描述下網(wǎng)頁一個Http請求,到后端的整個請求過程

 

  評注:基礎(chǔ)題,感覺屬于常識題!必會!

 

  回答:

 

  利用DNS進(jìn)行域名解析-->發(fā)起TCP的3次握手-->建立TCP連接后發(fā)起http請求-->服務(wù)器響應(yīng)http請求,瀏覽器得到html代碼-->瀏覽器解析html代碼,并請求html代碼中的資源(如js、css、圖片等)-->瀏覽器對頁面進(jìn)行渲染呈現(xiàn)給用戶

 

  17、多線程的常用方法和接口類及線程池的機(jī)制

 

  評注:基礎(chǔ)題,基本會點線程知識的,多多少少都會答點!但是這道題,我感覺范圍有點大啊!可能是作者沒表述清楚吧!

 

  回答:

 

  常用方法:

 

  start,run,sleep,wait,notify,notifyAll,join,isAlive,currentThread,interrupt

 

  常用接口類:

 

  Runnable、Callable、Future、FutureTask

 

  線程池的機(jī)制:

 

  在面向?qū)ο缶幊讨校瑒?chuàng)建和銷毀對象是很費時間的,因為創(chuàng)建一個對象要獲取內(nèi)存資源或者其它更多資源。所以提高服務(wù)程序效率的一個手段就是盡可能減少創(chuàng)建和銷毀對象的次數(shù),所以出現(xiàn)了池化技術(shù)!。

 

  簡單的線程池包括如下四個組成部分即可:

 

  線程池管理器(ThreadPoolManager):用于創(chuàng)建并管理線程池

 

  工作線程(WorkThread):線程池中線程

 

  任務(wù)接口(Task):每個任務(wù)必須實現(xiàn)的接口,以供工作線程調(diào)度任務(wù)的執(zhí)行

 

  任務(wù)隊列:用于存放沒有處理的任務(wù)。提供一種緩沖機(jī)制

 

  18、總結(jié)我的Java基礎(chǔ)還是不錯,但是一些主流的框架源碼還是處在使用的狀態(tài),需要繼續(xù)去看源碼

 

  評注:坦白說,我沒看出來哪些問題體現(xiàn)出主流的框架還是處在使用的狀態(tài)。

 

  19、死鎖

 

  回答:

 

  死鎖是指兩個或兩個以上的進(jìn)程在執(zhí)行過程中,因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進(jìn)下去,如果系統(tǒng)資源充足,進(jìn)程的資源請求都能夠得到滿足,死鎖出現(xiàn)的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。

 

  產(chǎn)生死鎖的原因主要是:

 

  (1)因為系統(tǒng)資源不足。

 

  (2)進(jìn)程運行推進(jìn)的順序不合適。

 

  (3)資源分配不當(dāng)?shù)取?/p>

 

  20、自己研究比較新的技術(shù),說下成果!

 

  評注:嗯,凸顯自己的潛力,大家自由發(fā)揮!

 

  21、你有什么想問的?我就問了下公司那邊的情況,這個自由發(fā)揮!

 

  以上就是動力節(jié)點java培訓(xùn)機(jī)構(gòu)小編介紹的“高級Java程序員:21道最新Java面試題剖析”的內(nèi)容,希望對大家有幫助,更多java資訊請繼續(xù)關(guān)注動力節(jié)點java培訓(xùn)機(jī)構(gòu)官網(wǎng),每天會有精彩內(nèi)容分享與你。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 精品亚洲一区二区 | 欧美国产高清 | 久久天天躁夜夜躁狠狠躁2019 | 成人禁在线观看网站 | 人与禽的免费一级毛片 | 日韩欧美国产卡通动漫 | 一插综合网 | 久久精品国产日本波多麻结衣 | 欧洲美女乱之伦 | 国产一区二区三区视频在线观看 | 日本系列 1页 亚洲系列 | 目韩一区二区三区系列片丶 | 日本视频www色变态 日本爽p大片免费观看 | 欧美精品久久久亚洲 | 美女下面粉嫩粉嫩冒白浆高清 | 久久婷婷五月综合色丁香 | 99网站在线观看 | 欧美人视频在线观看视频 | 日韩欧美国产中文字幕 | www成人免费视频 | 好吊妞gao988在线播放 | 亚洲爽 | 狠色狠狠色狠狠狠色综合久久 | 日韩在线第二页 | 边做边叫床的大尺度床戏欧美 | 亚洲另类z0zx | 欧美成人免费在线 | 欧美在线观看免费一区视频 | 亚洲日产综合欧美一区二区 | 波多野结衣在线免费视频 | 日韩欧美不卡一区二区三区 | 亚洲综合网在线观看 | ririricc在线观看麻豆 | 亚洲黄在线观看 | 在线日韩视频 | 成人1000部免费观看视频 | 午夜精品影院 | 国产欧美大片 | 图片区小说区av区 | 男女生性毛片免费观看 | 中文成人在线 |