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

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Java工程師面試題及答案

Java工程師面試題及答案

更新時(shí)間:2021-04-25 15:34:53 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1557次

Java 面試隨著時(shí)間的改變而改變。在過去的日子里,當(dāng)你知道 String 和 StringBuilder 的區(qū)別就能讓你直接進(jìn)入第二輪面試,但是現(xiàn)在問題變得越來越高級(jí),面試官問的問題也更深入。

Java工程師面試題及答案

多線程、并發(fā)及線程的基礎(chǔ)問題

1.Java 中能創(chuàng)建 Volatile數(shù)組嗎?

能,Java 中可以創(chuàng)建 volatile 類型數(shù)組,不過只是一個(gè)指向數(shù)組的引用,而不是整個(gè)數(shù)組。我的意思是,如果改變引用指向的數(shù)組,將會(huì)受到 volatile 的保護(hù),但是如果多個(gè)線程同時(shí)改變數(shù)組的元素,volatile 標(biāo)示符就不能起到之前的保護(hù)作用了。

2.volatile 能使得一個(gè)非原子操作變成原子操作嗎?

一個(gè)典型的例子是在類中有一個(gè) long 類型的成員變量。如果你知道該成員變量會(huì)被多個(gè)線程訪問,如計(jì)數(shù)器、價(jià)格等,你最好是將其設(shè)置為 volatile。為什么?因?yàn)?Java 中讀取 long 類型變量不是原子的,需要分成兩步,如果一個(gè)線程正在修改該 long 變量的值,另一個(gè)線程可能只能看到該值的一半(前 32 位)。但是對(duì)一個(gè) volatile 型的 long 或 double 變量的讀寫是原子。

3.volatile 修飾符的有過什么實(shí)踐?

一種實(shí)踐是用 volatile 修飾 long 和 double 變量,使其能按原子類型來讀寫。double 和 long 都是64位寬,因此對(duì)這兩種類型的讀是分為兩部分的,第一次讀取第一個(gè) 32 位,然后再讀剩下的 32 位,這個(gè)過程不是原子的,但 Java 中 volatile 型的 long 或 double 變量的讀寫是原子的。volatile 修復(fù)符的另一個(gè)作用是提供內(nèi)存屏障(memory barrier),例如在分布式框架中的應(yīng)用。簡單的說,就是當(dāng)你寫一個(gè) volatile 變量之前,Java 內(nèi)存模型會(huì)插入一個(gè)寫屏障(write barrier),讀一個(gè) volatile 變量之前,會(huì)插入一個(gè)讀屏障(read barrier)。意思就是說,在你寫一個(gè) volatile 域時(shí),能保證任何線程都能看到你寫的值,同時(shí),在寫之前,也能保證任何數(shù)值的更新對(duì)所有線程是可見的,因?yàn)閮?nèi)存屏障會(huì)將其他所有寫的值更新到緩存。

4.volatile 類型變量提供什么保證?(答案)

volatile 變量提供順序和可見性保證,例如,JVM 或者 JIT為了獲得更好的性能會(huì)對(duì)語句重排序,但是 volatile 類型變量即使在沒有同步塊的情況下賦值也不會(huì)與其他語句重排序。 volatile 提供 happens-before 的保證,確保一個(gè)線程的修改能對(duì)其他線程是可見的。某些情況下,volatile 還能提供原子性,如讀 64 位數(shù)據(jù)類型,像 long 和 double 都不是原子的,但 volatile 類型的 double 和 long 就是原子的。

5.10 個(gè)線程和 2 個(gè)線程的同步代碼,哪個(gè)更容易寫?

從寫代碼的角度來說,兩者的復(fù)雜度是相同的,因?yàn)橥酱a與線程數(shù)量是相互獨(dú)立的。但是同步策略的選擇依賴于線程的數(shù)量,因?yàn)樵蕉嗟?a href="/tutorial_java_advance/664.html" target="_blank" title="Java線程">Java線程意味著更大的競爭,所以你需要利用同步技術(shù),如鎖分離,這要求更復(fù)雜的代碼和專業(yè)知識(shí)。

JVM 底層 與 GC(GarbageCollection)的面試問題

1.64 位 JVM 中,int 的長度是多數(shù)?

Java 中,int 類型變量的長度是一個(gè)固定值,與平臺(tái)無關(guān),都是 32 位。意思就是說,在 32 位和 64 位的Java 虛擬機(jī)中,int 類型的長度是相同的。

2.Serial 與 Parallel GC之間的不同之處?(答案)

Serial 與 Parallel 在GC執(zhí)行的時(shí)候都會(huì)引起stop-the-world。它們之間主要不同 serial 收集器是默認(rèn)的復(fù)制收集器,執(zhí)行 GC 的時(shí)候只有一個(gè)線程,而 parallel 收集器使用多個(gè) GC 線程來執(zhí)行。

3.32 位和 64 位的 JVM,int 類型變量的長度是多數(shù)?(答案)

32 位和 64 位的 JVM 中,int 類型變量的長度是相同的,都是 32 位或者 4 個(gè)字節(jié)。

4.Java 中WeakReference 與 SoftReference的區(qū)別?(答案)

雖然 WeakReference 與 SoftReference 都有利于提高 GC 和內(nèi)存的效率,但是 WeakReference ,一旦失去最后一個(gè)強(qiáng)引用,就會(huì)被 GC 回收,而軟引用雖然不能阻止被回收,但是可以延遲到 JVM 內(nèi)存不足的時(shí)候。

5.WeakHashMap 是怎么工作的?(答案)

WeakHashMap 的工作與正常的 HashMap 類似,但是使用弱引用作為key,意思就是當(dāng) key 對(duì)象沒有任何引用時(shí),key/value 將會(huì)被回收。

JVM 底層面試題及答案

1.你能保證 GC 執(zhí)行嗎?(答案)

不能,雖然你可以調(diào)用 System.gc() 或者 Runtime.gc(),但是沒有辦法保證 GC 的執(zhí)行。

2.怎么獲取 Java 程序使用的內(nèi)存?堆使用的百分比?

可以通過 java.lang.Runtime 類中與內(nèi)存相關(guān)方法來獲取剩余的內(nèi)存,總內(nèi)存及最大堆內(nèi)存。通過這些方法你也可以獲取到堆使用的百分比及堆內(nèi)存的剩余空間。Runtime.freeMemory() 方法返回剩余空間的字節(jié)數(shù),Runtime.totalMemory() 方法總內(nèi)存的字節(jié)數(shù),Runtime.maxMemory() 返回最大內(nèi)存的字節(jié)數(shù)。

3.Java 中堆和棧有什么區(qū)別?(答案)

JVM 中堆和棧屬于不同的內(nèi)存區(qū)域,使用目的也不同。棧常用于保存方法幀和局部變量,而對(duì)象總是在堆上分配。棧通常都比堆小,也不會(huì)在多個(gè)線程之間共享,而堆被整個(gè) JVM 的所有線程共享。

Java 集合框架的面試題

1.List、Set、Map 和 Queue 之間的區(qū)別(答案)

List 是一個(gè)有序集合,允許元素重復(fù)。它的某些實(shí)現(xiàn)可以提供基于下標(biāo)值的常量訪問時(shí)間,但是這不是 List 接口保證的。Set 是一個(gè)無序集合。

2.poll() 方法和 remove() 方法的區(qū)別?

poll() 和 remove() 都是從隊(duì)列中取出一個(gè)元素,但是 poll() 在獲取元素失敗的時(shí)候會(huì)返回空,但是 remove() 失敗的時(shí)候會(huì)拋出異常。

3.Java 中LinkedHashMap 和 PriorityQueue 的區(qū)別是什么?(答案)

PriorityQueue 保證最高或者最低優(yōu)先級(jí)的的元素總是在隊(duì)列頭部,但是 LinkedHashMap 維持的順序是元素插入的順序。當(dāng)遍歷一個(gè) PriorityQueue 時(shí),沒有任何順序保證,但是 LinkedHashMap 課保證遍歷順序是元素插入的順序。

4.ArrayList 與 LinkedList 的不區(qū)別?(答案)

最明顯的區(qū)別是 ArrrayList 底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組,支持隨機(jī)訪問,而 LinkedList 的底層數(shù)據(jù)結(jié)構(gòu)書鏈表,不支持隨機(jī)訪問。使用下標(biāo)訪問一個(gè)元素,ArrayList 的時(shí)間復(fù)雜度是 O(1),而 LinkedList 是 O(n)。更多細(xì)節(jié)的討論參見答案。

5.用哪兩種方式來實(shí)現(xiàn)集合的排序?(答案)

你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有順序的的集合,如 list,然后通過 Collections.sort() 來排序。

6.Java 中怎么打印數(shù)組?(answer答案)

你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法來打印數(shù)組。由于數(shù)組沒有實(shí)現(xiàn)toString() 方法,所以如果將數(shù)組傳遞給 System.out.println() 方法,將無法打印出數(shù)組的內(nèi)容,但是 Arrays.toString() 可以打印每個(gè)元素。

關(guān)于 OOP 和設(shè)計(jì)模式的面試題

1.接口是什么?為什么要使用接口而不是直接使用具體類?

接口用于定義 API。它定義了類必須得遵循的規(guī)則。同時(shí),它提供了一種抽象,因?yàn)榭蛻舳酥皇褂媒涌冢@樣可以有多重實(shí)現(xiàn),如 List 接口,你可以使用可隨機(jī)訪問的 ArrayList,也可以使用方便插入和刪除的 LinkedList。接口中不允許寫代碼,以此來保證抽象,但是 Java 8 中你可以在接口聲明靜態(tài)的默認(rèn)方法,這種方法是具體的。

2.Java 中,抽象類與接口之間有什么不同?(答案)

Java 中,抽象類和接口有很多不同之處,但是最重要的一個(gè)是 Java 中限制一個(gè)類只能繼承一個(gè)類,但是可以實(shí)現(xiàn)多個(gè)接口。抽象類可以很好的定義一個(gè)家族類的默認(rèn)行為,而接口能更好的定義類型,有助于后面實(shí)現(xiàn)多態(tài)機(jī)制。關(guān)于這個(gè)問題的討論請(qǐng)查看答案。

3.除了單例模式,你在生產(chǎn)環(huán)境中還用過什么設(shè)計(jì)模式?

這需要根據(jù)你的經(jīng)驗(yàn)來回答。一般情況下,你可以說依賴注入,Java工廠模式,裝飾模式或者觀察者模式,隨意選擇你使用過的一種即可。不過你要準(zhǔn)備回答接下的基于你選擇的模式的問題。

以上就是動(dòng)力節(jié)點(diǎn)小編介紹的“Java工程師面試題及答案”的內(nèi)容,希望對(duì)大家有幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為您服務(wù)。

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

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 久久国产精品最新一区 | 国产福利不卡视频在免费播放 | 国模和精品嫩模私拍视频 | 一级爱爱片一级毛片-一毛 一级白嫩美女毛片免费 | 免费人成在线观看网站品爱网 | 久久精品国产久精国产80cm | 豆奶视频污 | 四虎影视精品永久免费 | 日韩在线一 | 四虎在线网站 | 天天摸日日碰天天看免费 | 欧美一级高清视频在线播放 | 五月免费视频 | 天天操综合 | 一级黄色录像免费看 | 日韩欧美在线观看视频一区二区 | 奇米影视亚洲狠狠色777不卡 | 四虎精品视频在线永久免费观看 | 欧美毛片在线播放观看 | 日本一区二区三区不卡在线视频 | 国产成人夜色91 | 欧美色图一区二区 | 91视频网| 久久久久久久久久久福利观看 | 在线观看视频亚洲 | 美女一区二区三区 | www.奇米第四色 | 久久草在线视频播放 | 欧美日韩1区 | 国产精品9999 | 亚洲综合久久久久久888 | 国产免费一级高清淫日本片 | 欧美日韩亚洲国产 | 日本欧美在线视频 | 日韩狠狠操 | 天天操夜夜草 | 成人午夜影视全部免费看 | 羞羞网站在线看 | 四虎影院黄色片 | 亚洲国产女人aaa毛片在线 | 久久久久夜夜夜精品国产 |