日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

这些BATJ必考的Java面试题,你都懂了吗?

發(fā)布時(shí)間:2023/12/3 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 这些BATJ必考的Java面试题,你都懂了吗? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自? ?這些BATJ必考的Java面試題,你都懂了嗎?

題目一

請(qǐng)對(duì)比 Exception 和 Error,另外,運(yùn)行時(shí)異常與一般異常有什么區(qū)別?

考點(diǎn)分析:

分析 Exception 和 Error 的區(qū)別,是從概念角度考察了 Java 處理機(jī)制。總的來(lái)說(shuō),還處于理解的層面,面試者只要闡述清楚就好了。

我們?cè)谌粘>幊讨?#xff0c;如何處理好異常是比較考驗(yàn)功底的,我覺(jué)得需要掌握兩個(gè)方面。

第一,理解 Throwable、Exception、Error 的設(shè)計(jì)和分類(lèi)。 比如,掌握那些應(yīng)用最為廣泛的子類(lèi),以及如何自定義異常等。

很多面試官會(huì)進(jìn)一步追問(wèn)一些細(xì)節(jié),比如,你了解哪些 Error、Exception 或者 RuntimeException?我畫(huà)了一個(gè)簡(jiǎn)單的類(lèi)圖,并列出來(lái)典型例子,可以給你作為參考,至少做到基本心里有數(shù)。

?

第二,理解 Java 語(yǔ)言中操作 Throwable 的元素和實(shí)踐。 掌握最基本的語(yǔ)法是必須的,如 try-catch-finally 塊,throw、throws 關(guān)鍵字等。與此同時(shí),也要懂得如何處理典型場(chǎng)景。

典型回答:

Exception 和 Error 都是繼承了 Throwable 類(lèi),在 Java 中只有 Throwable 類(lèi)的實(shí)例才可以被拋出(throw)或者捕獲(catch),它是異常處理機(jī)制的基本組成類(lèi)型。

Exception 和 Error 體現(xiàn)了 Java 平臺(tái)設(shè)計(jì)者對(duì)不同異常情況的分類(lèi)。Exception 是程序正常運(yùn)行中,可以預(yù)料的意外情況,可能并且應(yīng)該被捕獲,進(jìn)行相應(yīng)處理。

Error 是指在正常情況下,不大可能出現(xiàn)的情況,絕大部分的 Error 都會(huì)導(dǎo)致程序(比如 JVM 自身)處于非正常的、不可恢復(fù)狀態(tài)。既然是非正常情況,所以不便于也不需要捕獲,常見(jiàn)的比如 OutOfMemoryError 之類(lèi),都是 Error 的子類(lèi)。

Exception 又分為可檢查(checked)異常和不檢查(unchecked)異常,可檢查異常在源代碼里必須顯式地進(jìn)行捕獲處理,這是編譯期檢查的一部分。前面我介紹的不可查的 Error,是 Throwable 不是 Exception。

不檢查異常就是所謂的運(yùn)行時(shí)異常,類(lèi)似 NullPointerException、ArrayIndexOutOfBoundsException 之類(lèi),通常是可以編碼避免的邏輯錯(cuò)誤,具體根據(jù)需要來(lái)判斷是否需要捕獲,并不會(huì)在編譯期強(qiáng)制要求。

?

題目二

談?wù)?Java 反射機(jī)制,動(dòng)態(tài)代理是基于什么原理?

考點(diǎn)分析:

這個(gè)題目給我的第一印象是稍微有點(diǎn)誘導(dǎo)的嫌疑,可能會(huì)下意識(shí)地以為動(dòng)態(tài)代理就是利用反射機(jī)制實(shí)現(xiàn)的,這么說(shuō)也不算錯(cuò)但稍微有些不全面。功能才是目的,實(shí)現(xiàn)的方法有很多。

總的來(lái)說(shuō),這道題目考察的是 Java 語(yǔ)言的另外一種基礎(chǔ)機(jī)制: 反射,它就像是一種魔法,引入運(yùn)行時(shí)自省能力,賦予了 Java 語(yǔ)言令人意外的活力,通過(guò)運(yùn)行時(shí)操作元數(shù)據(jù)或?qū)ο?#xff0c;Java 可以靈活地操作運(yùn)行時(shí)才能確定的信息。 而動(dòng)態(tài)代理,則是延伸出來(lái)的一種廣泛應(yīng)用于產(chǎn)品開(kāi)發(fā)中的技術(shù),很多繁瑣的重復(fù)編程,都可以被動(dòng)態(tài)代理機(jī)制優(yōu)雅地解決。

從考察知識(shí)點(diǎn)的角度,這道題涉及的知識(shí)點(diǎn)比較龐雜,所以面試官能夠擴(kuò)展或者深挖的內(nèi)容非常多,比如:

  • 考察你對(duì)反射機(jī)制的了解和掌握程度。

  • 動(dòng)態(tài)代理解決了什么問(wèn)題,在你業(yè)務(wù)系統(tǒng)中的應(yīng)用場(chǎng)景是什么?

  • JDK 動(dòng)態(tài)代理在設(shè)計(jì)和實(shí)現(xiàn)上與 cglib 等方式有什么不同,進(jìn)而如何取舍?

典型回答

反射機(jī)制是 Java 語(yǔ)言提供的一種基礎(chǔ)功能,賦予程序在運(yùn)行時(shí)自省(introspect,官方用語(yǔ))的能力。通過(guò)反射我們可以直接操作類(lèi)或者對(duì)象,比如獲取某個(gè)對(duì)象的類(lèi)定義,獲取類(lèi)聲明的屬性和方法,調(diào)用方法或者構(gòu)造對(duì)象,甚至可以運(yùn)行時(shí)修改類(lèi)定義。

動(dòng)態(tài)代理是一種方便運(yùn)行時(shí)動(dòng)態(tài)構(gòu)建代理、動(dòng)態(tài)處理代理方法調(diào)用的機(jī)制,很多場(chǎng)景都是利用類(lèi)似機(jī)制做到的,比如用來(lái)包裝 RPC 調(diào)用、面向切面的編程(AOP)。

實(shí)現(xiàn)動(dòng)態(tài)代理的方式很多,比如 JDK 自身提供的動(dòng)態(tài)代理,就是主要利用了上面提到的反射機(jī)制。還有其他的實(shí)現(xiàn)方式,比如利用傳說(shuō)中更高性能的字節(jié)碼操作機(jī)制,類(lèi)似 ASM、cglib(基于 ASM)、Javassist 等。

?

題目三

Java 提供了哪些 IO 方式? NIO 如何實(shí)現(xiàn)多路復(fù)用?

考點(diǎn)分析

在實(shí)際面試中,從傳統(tǒng) IO 到 NIO、NIO 2,其中有很多地方可以擴(kuò)展開(kāi)來(lái),考察點(diǎn)涉及方方面面,比如:

  • 基礎(chǔ) API 功能與設(shè)計(jì), InputStream/OutputStream 和 Reader/Writer 的關(guān)系和區(qū)別。

  • NIO、NIO 2 的基本組成。

  • 給定場(chǎng)景,分別用不同模型實(shí)現(xiàn),分析 BIO、NIO 等模式的設(shè)計(jì)和實(shí)現(xiàn)原理。

  • NIO 提供的高性能數(shù)據(jù)操作方式是基于什么原理,如何使用?

  • 或者,從開(kāi)發(fā)者的角度來(lái)看,你覺(jué)得 NIO 自身實(shí)現(xiàn)存在哪些問(wèn)題?有什么改進(jìn)的想法嗎?

典型回答

Java IO 方式有很多種,基于不同的 IO 抽象模型和交互方式,可以進(jìn)行簡(jiǎn)單區(qū)分。

首先,傳統(tǒng)的 java.io 包,它基于流模型實(shí)現(xiàn),提供了我們最熟知的一些 IO 功能,比如 File 抽象、輸入輸出流等。交互方式是同步、阻塞的方式,也就是說(shuō),在讀取輸入流或者寫(xiě)入輸出流時(shí),在讀、寫(xiě)動(dòng)作完成之前,線程會(huì)一直阻塞在那里,它們之間的調(diào)用是可靠的線性順序。

java.io 包的好處是代碼比較簡(jiǎn)單、直觀,缺點(diǎn)則是 IO 效率和擴(kuò)展性存在局限性,容易成為應(yīng)用性能的瓶頸。

很多時(shí)候,人們也把 java.net 下面提供的部分網(wǎng)絡(luò) API,比如 Socket、ServerSocket、HttpURLConnection 也歸類(lèi)到同步阻塞 IO 類(lèi)庫(kù),因?yàn)榫W(wǎng)絡(luò)通信同樣是 IO 行為。

第二,在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以構(gòu)建多路復(fù)用的、同步非阻塞 IO 程序,同時(shí)提供了更接近操作系統(tǒng)底層的高性能數(shù)據(jù)操作方式。

第三,在 Java 7 中,NIO 有了進(jìn)一步的改進(jìn),也就是 NIO 2,引入了異步非阻塞 IO 方式,也有很多人叫它 AIO(Asynchronous IO)。異步 IO 操作基于事件和回調(diào)機(jī)制,可以簡(jiǎn)單理解為,應(yīng)用操作直接返回,而不會(huì)阻塞在那里,當(dāng)后臺(tái)處理完成,操作系統(tǒng)會(huì)通知相應(yīng)線程進(jìn)行后續(xù)工作。

?

題目四

如何保證容器是線程安全的?ConcurrentHashMap 如何實(shí)現(xiàn)高效地線程安全?

典型回答:

Java 提供了不同層面的線程安全支持。在傳統(tǒng)集合框架內(nèi)部,除了 Hashtable 等同步容器,還提供了所謂的同步包裝器(Synchronized Wrapper),我們可以調(diào)用 Collections 工具類(lèi)提供的包裝方法,來(lái)獲取一個(gè)同步的包裝容器(如 Collections.synchronizedMap),但是它們都是利用非常粗粒度的同步方式,在高并發(fā)情況下,性能比較低下。

另外,更加普遍的選擇是利用并發(fā)包提供的線程安全容器類(lèi),它提供了:

  • 各種并發(fā)容器,比如 ConcurrentHashMap、CopyOnWriteArrayList。

  • 各種線程安全隊(duì)列(Queue/Deque),如 ArrayBlockingQueue、SynchronousQueue。

  • 各種有序容器的線程安全版本等。

具體保證線程安全的方式,包括有從簡(jiǎn)單的 synchronize 方式,到基于更加精細(xì)化的,比如基于分離鎖實(shí)現(xiàn)的 ConcurrentHashMap 等并發(fā)實(shí)現(xiàn)等。具體選擇要看開(kāi)發(fā)的場(chǎng)景需求,總體來(lái)說(shuō),并發(fā)包內(nèi)提供的容器通用場(chǎng)景,遠(yuǎn)優(yōu)于早期的簡(jiǎn)單同步實(shí)現(xiàn)。

?

題目五

談?wù)劷涌诤统橄箢?lèi)有什么區(qū)別?

考點(diǎn)分析:

這是個(gè)非常高頻的 Java 面向?qū)ο蠡A(chǔ)問(wèn)題,看起來(lái)非常簡(jiǎn)單的問(wèn)題,如果面試官稍微深入一些,你會(huì)發(fā)現(xiàn)很多有意思的地方,可以從不同角度全面地考察你對(duì)基本機(jī)制的理解和掌握。

比如:

  • 對(duì)于 Java 的基本元素的語(yǔ)法是否理解準(zhǔn)確。 能否定義出語(yǔ)法基本正確的接口、抽象類(lèi)或者相關(guān)繼承實(shí)現(xiàn),涉及重載(Overload)、重寫(xiě)(Override)更是有各種不同的題目。

  • 在軟件設(shè)計(jì)開(kāi)發(fā)中妥善地使用接口和抽象類(lèi)。 你至少知道典型應(yīng)用場(chǎng)景,掌握基礎(chǔ)類(lèi)庫(kù)重要接口的使用;掌握設(shè)計(jì)方法,能夠在 review 代碼的時(shí)候看出明顯的不利于未來(lái)維護(hù)的設(shè)計(jì)。

  • 掌握 Java 語(yǔ)言特性演進(jìn)。 現(xiàn)在非常多的框架已經(jīng)是基于 Java 8,并逐漸支持更新版本,掌握相關(guān)語(yǔ)法,理解設(shè)計(jì)目的是很有必要的。

典型回答:

1.繼承抽象類(lèi)的子類(lèi)們的本質(zhì)都是相似的,它們體現(xiàn)的是一種 “is-a" 的關(guān)系,就像動(dòng)物中的貓和狗;而對(duì)于接口的繼承更多的是一種行為的相似,是一種 “l(fā)ike-a” 的關(guān)系,比如飛機(jī)和鳥(niǎo),它們都具有飛的行為,卻并不需要在本質(zhì)上相似。

2.抽象類(lèi)可以擁有任意范圍的成員數(shù)據(jù),既可以是抽象,也可以是非抽象;但是接口,所有的方法必須是抽象的,所有的成員變量必須是 public static final的,某種程度上來(lái)說(shuō),接口是對(duì)抽象類(lèi)的一種抽象。

3.一個(gè)類(lèi)只能繼承一個(gè)抽象類(lèi),但卻可以實(shí)現(xiàn)多個(gè)接口。

?

題目六

synchronized 和 ReentrantLock 有什么區(qū)別?有人說(shuō) synchronized 最慢,這話(huà)靠譜嗎?

考點(diǎn)分析:

題目是考察并發(fā)編程的常見(jiàn)基礎(chǔ)題,下面給出的典型回答算是一個(gè)相對(duì)全面的總結(jié)。

對(duì)于并發(fā)編程,不同公司或者面試官面試風(fēng)格也不一樣,有個(gè)別大廠喜歡一直追問(wèn)你相關(guān)機(jī)制的擴(kuò)展或者底層,有的喜歡從實(shí)用角度出發(fā),所以你在準(zhǔn)備并發(fā)編程方面需要一定的耐心。

個(gè)人認(rèn)為,鎖作為并發(fā)的基礎(chǔ)工具之一,你至少需要掌握:

  • 理解什么是線程安全。

  • synchronized、ReentrantLock 等機(jī)制的基本使用與案例。

更進(jìn)一步,你還需要:

  • 掌握 synchronized、ReentrantLock 底層實(shí)現(xiàn);理解鎖膨脹、降級(jí);理解偏斜鎖、自旋鎖、輕量級(jí)鎖、重量級(jí)鎖等概念。

  • 掌握并發(fā)包中 java.util.concurrent.lock 各種不同實(shí)現(xiàn)和案例分析。

典型回答:

synchronized 是 Java 內(nèi)建的同步機(jī)制,所以也有人稱(chēng)其為 Intrinsic Locking,它提供了互斥的語(yǔ)義和可見(jiàn)性,當(dāng)一個(gè)線程已經(jīng)獲取當(dāng)前鎖時(shí),其他試圖獲取的線程只能等待或者阻塞在那里。

在 Java 5 以前,synchronized 是僅有的同步手段,在代碼中, synchronized 可以用來(lái)修飾方法,也可以使用在特定的代碼塊兒上,本質(zhì)上 synchronized 方法等同于把方法全部語(yǔ)句用 synchronized 塊包起來(lái)。

ReentrantLock,通常翻譯為再入鎖,是 Java 5 提供的鎖實(shí)現(xiàn),它的語(yǔ)義和 synchronized 基本相同。再入鎖通過(guò)代碼直接調(diào)用 lock() 方法獲取,代碼書(shū)寫(xiě)也更加靈活。與此同時(shí),ReentrantLock 提供了很多實(shí)用的方法,能夠?qū)崿F(xiàn)很多 synchronized 無(wú)法做到的細(xì)節(jié)控制,比如可以控制 fairness,也就是公平性,或者利用定義條件等。但是,編碼中也需要注意,必須要明確調(diào)用 unlock() 方法釋放,不然就會(huì)一直持有該鎖。

synchronized 和 ReentrantLock 的性能不能一概而論,早期版本 synchronized 在很多場(chǎng)景下性能相差較大,在后續(xù)版本進(jìn)行了較多改進(jìn),在低競(jìng)爭(zhēng)場(chǎng)景中表現(xiàn)可能優(yōu)于 ReentrantLock。

總結(jié)

以上是生活随笔為你收集整理的这些BATJ必考的Java面试题,你都懂了吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。