大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) 學(xué)習(xí)攻略 Java學(xué)習(xí) Java高級(jí)面試題和答案解析,看看你都會(huì)了嗎?

Java高級(jí)面試題和答案解析,看看你都會(huì)了嗎?

更新時(shí)間:2019-09-19 14:22:32 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2499次



  List和Set比較,各自的子類比較


  對(duì)比一:Arraylist與LinkedList的比較


  1、ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),因?yàn)榈刂愤B續(xù),一旦數(shù)據(jù)存儲(chǔ)好了,查詢操作效率會(huì)比較高(在內(nèi)存里是連著放的)。


  2、因?yàn)榈刂愤B續(xù),ArrayList要移動(dòng)數(shù)據(jù),所以插入和刪除操作效率比較低。


  3、LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu),地址是任意的,所以在開辟內(nèi)存空間的時(shí)候不需要等一個(gè)連續(xù)的地址,對(duì)于新增和刪除操作add和remove,LinedList比較占優(yōu)勢(shì)。


  4、因?yàn)長(zhǎng)inkedList要移動(dòng)指針,所以查詢操作性能比較低。


  適用場(chǎng)景分析:


  當(dāng)需要對(duì)數(shù)據(jù)進(jìn)行對(duì)此訪問的情況下選用ArrayList,當(dāng)需要對(duì)數(shù)據(jù)進(jìn)行多次增加刪除修改時(shí)采用LinkedList。


  對(duì)比二:ArrayList與Vector的比較


  1、Vector的方法都是同步的,是線程安全的,而ArrayList的方法不是,由于線程的同步必然要影響性能。因此,ArrayList的性能比Vector好。


  2、當(dāng)Vector或ArrayList中的元素超過(guò)它的初始大小時(shí),Vector會(huì)將它的容量翻倍,而ArrayList只增加50%的大小,這樣。ArrayList就有利于節(jié)約內(nèi)存空間。


  3、大多數(shù)情況不使用Vector,因?yàn)樾阅懿缓茫撬С志€程的同步,即某一時(shí)刻只有一個(gè)線程能夠?qū)慥ector,避免多線程同時(shí)寫而引起的不一致性。


  4、Vector可以設(shè)置增長(zhǎng)因子,而ArrayList不可以。


  適用場(chǎng)景分析:


  1、Vector是線程同步的,所以它也是線程安全的,而ArrayList是線程異步的,是不安全的。如果不考慮到線程的安全因素,一般用ArrayList效率比較高。


  2、如果集合中的元素的數(shù)目大于目前集合數(shù)組的長(zhǎng)度時(shí),在集合中使用數(shù)據(jù)量比較大的數(shù)據(jù),用Vector有一定的優(yōu)勢(shì)。


  對(duì)比三:HashSet與TreeSet的比較


  1.TreeSet是二叉樹實(shí)現(xiàn)的,Treeset中的數(shù)據(jù)是自動(dòng)排好序的,不允許放入null值。


  2.HashSet是哈希表實(shí)現(xiàn)的,HashSet中的數(shù)據(jù)是無(wú)序的,可以放入null,但只能放入一個(gè)null,兩者中的值都不能重復(fù),就如數(shù)據(jù)庫(kù)中唯一約束。


  3.HashSet要求放入的對(duì)象必須實(shí)現(xiàn)HashCode()方法,放入的對(duì)象,是以hashcode碼作為標(biāo)識(shí)的,而具有相同內(nèi)容的String對(duì)象,hashcode是一樣,所以放入的內(nèi)容不能重復(fù)。但是同一個(gè)類的對(duì)象可以放入不同的實(shí)例。


  適用場(chǎng)景分析:


  HashSet是基于Hash算法實(shí)現(xiàn)的,其性能通常都優(yōu)于TreeSet。我們通常都應(yīng)該使用HashSet,在我們需要排序的功能時(shí),我們才使用TreeSet。


  HashMap和ConcurrentHashMap的區(qū)別


  1、HashMap不是線程安全的,而ConcurrentHashMap是線程安全的。


  2、ConcurrentHashMap采用鎖分段技術(shù),將整個(gè)Hash桶進(jìn)行了分段segment,也就是將這個(gè)大的數(shù)組分成了幾個(gè)小的片段segment,而且每個(gè)小的片段segment上面都有鎖存在,那么在插入元素的時(shí)候就需要先找到應(yīng)該插入到哪一個(gè)片段segment,然后再在這個(gè)片段上面進(jìn)行插入,而且這里還需要獲取segment鎖。


  3、ConcurrentHashMap讓鎖的粒度更精細(xì)一些,并發(fā)性能更好。


  JVM的內(nèi)存結(jié)構(gòu)


  根據(jù)JVM規(guī)范,JVM內(nèi)存共分為虛擬機(jī)棧、堆、方法區(qū)、程序計(jì)數(shù)器、本地方法棧五個(gè)部分。


  1、Java虛擬機(jī)棧:


  線程私有;每個(gè)方法在執(zhí)行的時(shí)候會(huì)創(chuàng)建一個(gè)棧幀,存儲(chǔ)了局部變量表,操作數(shù)棧,動(dòng)態(tài)連接,方法返回地址等;每個(gè)方法從調(diào)用到執(zhí)行完畢,對(duì)應(yīng)一個(gè)棧幀在虛擬機(jī)棧中的入棧和出棧。


  2、堆:


  線程共享;被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建,用于存放對(duì)象實(shí)例。


  3、方法區(qū):


  線程共享;被所有線程共享的一塊內(nèi)存區(qū)域;用于存儲(chǔ)已被虛擬機(jī)加載的類信息,常量,靜態(tài)變量等。


  4、程序計(jì)數(shù)器:


  線程私有;是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器,每條線程都要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,這類內(nèi)存也稱為“線程私有”的內(nèi)存。


  5、本地方法棧:


  線程私有;主要為虛擬機(jī)使用到的Native方法服務(wù)。


  強(qiáng)引用,軟引用和弱引用的區(qū)別


  強(qiáng)引用:


  只有這個(gè)引用被釋放之后,對(duì)象才會(huì)被釋放掉,只要引用存在,垃圾回收器永遠(yuǎn)不會(huì)回收,這是最常見的New出來(lái)的對(duì)象。


  軟引用:


  內(nèi)存溢出之前通過(guò)代碼回收的引用。軟引用主要用戶實(shí)現(xiàn)類似緩存的功能,在內(nèi)存足夠的情況下直接通過(guò)軟引用取值,無(wú)需從繁忙的真實(shí)來(lái)源查詢數(shù)據(jù),提升速度;當(dāng)內(nèi)存不足時(shí),自動(dòng)刪除這部分緩存數(shù)據(jù),從真正的來(lái)源查詢這些數(shù)據(jù)。


  弱引用:


  第二次垃圾回收時(shí)回收的引用,短時(shí)間內(nèi)通過(guò)弱引用取對(duì)應(yīng)的數(shù)據(jù),可以取到,當(dāng)執(zhí)行過(guò)第二次垃圾回收時(shí),將返回null。弱引用主要用于監(jiān)控對(duì)象是否已經(jīng)被垃圾回收器標(biāo)記為即將回收的垃圾,可以通過(guò)弱引用的isEnQueued方法返回對(duì)象是否被垃圾回收器標(biāo)記。


  springmvc的核心是什么,請(qǐng)求的流程是怎么處理的,控制反轉(zhuǎn)怎么實(shí)現(xiàn)的


  核心:


  控制反轉(zhuǎn)和面向切面


  請(qǐng)求處理流程:


  1、首先用戶發(fā)送請(qǐng)求到前端控制器,前端控制器根據(jù)請(qǐng)求信息(如URL)來(lái)決定選擇哪一個(gè)頁(yè)面控制器進(jìn)行處理并把請(qǐng)求委托給它,即以前的控制器的控制邏輯部分;


  2、頁(yè)面控制器接收到請(qǐng)求后,進(jìn)行功能處理,首先需要收集和綁定請(qǐng)求參數(shù)到一個(gè)對(duì)象,并進(jìn)行驗(yàn)證,然后將命令對(duì)象委托給業(yè)務(wù)對(duì)象進(jìn)行處理;處理完畢后返回一個(gè)ModelAndView(模型數(shù)據(jù)和邏輯視圖名);


  3、前端控制器收回控制權(quán),然后根據(jù)返回的邏輯視圖名,選擇相應(yīng)的視圖進(jìn)行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染;


  4、前端控制器再次收回控制權(quán),將響應(yīng)返回給用戶。


  控制反轉(zhuǎn)如何實(shí)現(xiàn):


  我們每次使用spring框架都要配置xml文件,這個(gè)xml配置了bean的id和class。


  spring中默認(rèn)的bean為單實(shí)例模式,通過(guò)bean的class引用反射機(jī)制可以創(chuàng)建這個(gè)實(shí)例。


  因此,spring框架通過(guò)反射替我們創(chuàng)建好了實(shí)例并且替我們維護(hù)他們。


  A需要引用B類,spring框架就會(huì)通過(guò)xml把B實(shí)例的引用傳給了A的成員變量。


  BIO、NIO和AIO的區(qū)別


  JavaBIO:同步并阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)連接一個(gè)線程,即客戶端有連接請(qǐng)求時(shí)服務(wù)器端就需要啟動(dòng)一個(gè)線程進(jìn)行處理,如果這個(gè)連接不做任何事情會(huì)造成不必要的線程開銷,當(dāng)然可以通過(guò)線程池機(jī)制改善。


  JavaNIO:同步非阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)請(qǐng)求一個(gè)線程,即客戶端發(fā)送的連接請(qǐng)求都會(huì)注冊(cè)到多路復(fù)用器上,多路復(fù)用器輪詢到連接有I/O請(qǐng)求時(shí)才啟動(dòng)一個(gè)線程進(jìn)行處理。


  JavaAIO:異步非阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)有效請(qǐng)求一個(gè)線程,客戶端的I/O請(qǐng)求都是由OS先完成了再通知服務(wù)器應(yīng)用去啟動(dòng)線程進(jìn)行處理。


  NIO比BIO的改善之處是把一些無(wú)效的連接擋在了啟動(dòng)線程之前,減少了這部分資源的浪費(fèi)(因?yàn)槲覀兌贾烂縿?chuàng)建一個(gè)線程,就要為這個(gè)線程分配一定的內(nèi)存空間)


  AIO比NIO的進(jìn)一步改善之處是將一些暫時(shí)可能無(wú)效的請(qǐng)求擋在了啟動(dòng)線程之前,比如在NIO的處理方式中,當(dāng)一個(gè)請(qǐng)求來(lái)的話,開啟線程進(jìn)行處理,但這個(gè)請(qǐng)求所需要的資源還沒有就緒,此時(shí)必須等待后端的應(yīng)用資源,這時(shí)線程就被阻塞了。


  適用場(chǎng)景分析:


  BIO方式適用于連接數(shù)目比較小且固定的架構(gòu),這種方式對(duì)服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中,JDK1.4以前的唯一選擇,但程序直觀簡(jiǎn)單易理解,如之前在Apache中使用。


  NIO方式適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu),比如聊天服務(wù)器,并發(fā)局限于應(yīng)用中,編程比較復(fù)雜,JDK1.4開始支持,如在Nginx,Netty中使用。


  AIO方式使用于連接數(shù)目多且連接比較長(zhǎng)(重操作)的架構(gòu),比如相冊(cè)服務(wù)器,充分調(diào)用OS參與并發(fā)操作,編程比較復(fù)雜,JDK7開始支持,在成長(zhǎng)中,Netty曾經(jīng)使用過(guò),后來(lái)放棄。


  為什么要用線程池


  那先要明白什么是線程池


  線程池是指在初始化一個(gè)多線程應(yīng)用程序過(guò)程中創(chuàng)建一個(gè)線程集合,然后在需要執(zhí)行新的任務(wù)時(shí)重用這些線程而不是新建一個(gè)線程。


  使用線程池的好處


  1、線程池改進(jìn)了一個(gè)應(yīng)用程序的響應(yīng)時(shí)間。由于線程池中的線程已經(jīng)準(zhǔn)備好且等待被分配任務(wù),應(yīng)用程序可以直接拿來(lái)使用而不用新建一個(gè)線程。


  2、線程池節(jié)省了CLR為每個(gè)短生存周期任務(wù)創(chuàng)建一個(gè)完整的線程的開銷并可以在任務(wù)完成后回收資源。


  3、線程池根據(jù)當(dāng)前在系統(tǒng)中運(yùn)行的進(jìn)程來(lái)優(yōu)化線程時(shí)間片。


  4、線程池允許我們開啟多個(gè)任務(wù)而不用為每個(gè)線程設(shè)置屬性。


  5、線程池允許我們?yōu)檎趫?zhí)行的任務(wù)的程序參數(shù)傳遞一個(gè)包含狀態(tài)信息的對(duì)象引用。


  6、線程池可以用來(lái)解決處理一個(gè)特定請(qǐng)求最大線程數(shù)量限制問題。


  以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)小編為大家介紹的“Java高級(jí)面試題和答案解析,看看你都會(huì)了嗎?”的內(nèi)容,希望對(duì)大家有幫助,更多java最新資訊請(qǐng)繼續(xù)關(guān)注動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)官網(wǎng),每天會(huì)有精彩內(nèi)容分享與你。

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

  • 全國(guó)校區(qū) 2025-04-24 搶座中
  • 全國(guó)校區(qū) 2025-05-15 搶座中
  • 全國(guó)校區(qū) 2025-06-05 搶座中
  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 爱爱毛片 | 神马老子午夜 | 亚洲天堂三级 | 日本亚洲成高清一区二区三区 | 97人人澡人人爽人人爱 | 精品国产影院 | 亚洲精品高清久久 | 欧美一级艳片爽快片 | 成人免费aa在线观看 | 成人免费视频一区二区 | 国产高清精品自在久久 | 久久这里只有精品国产 | 亚洲综合在线成人一区 | 久久99热这里只有精品免费看 | 天天做天天做天天综合网 | 精品久久久99大香线蕉 | 久久综合九九亚洲一区 | 久久99亚洲综合精品首页 | 羞羞视频在线看 | 久久视频精品线视频在线网站 | 亚洲十欧美十日韩十国产 | 亚洲视频二 | 久久这里只精品国产99热8 | 14一15sexvideo日本| 午夜精品久久久久久久 | 网络色综合久久 | 久久一区视频 | 99爱在线视频这里只有精品 | 免费视频一区二区性色 | 中文字幕曰韩一区二区不卡 | 亚洲欧美强伦一区二区另类 | 天天在线综合网 | 一级毛片日韩a欧美 | 肉漫天堂| 91久久亚洲精品国产一区二区 | 国内精品久久国产大陆 | 久久人人干 | 国产免费人成在线视频视频 | 国产欧美成人xxx视频 | 884hutv四虎永久7777 | 久久久久久国产精品三级 |