91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java常見面試題目有哪些

發布時間:2021-06-22 13:59:00 來源:億速云 閱讀:165 作者:chen 欄目:編程語言

這篇文章主要講解了“Java常見面試題目有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java常見面試題目有哪些”吧!

==== java基礎 ====

1. == 和 equals 的區別是什么?

== 對于基本類型來說是值比較,對于引用類型來說是比較的是引用;而 equals 默認情況下是引用比較,只是很多類重新了 equals 方法,比如 String、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是值是否相等。

2. 兩個對象的 hashCode()相同,則 equals()也一定為 true,對嗎?

不對,兩個對象的 hashCode()相同,equals()不一定 true。(例子,“通話”和“重地”的 hashCode() 相同)

3. final 在 java 中有什么作用?

  • final 修飾的類叫最終類,該類不能被繼承。

  • final 修飾的方法不能被重寫。

  • final 修飾的變量叫常量,常量必須初始化,初始化之后值就不能被修改。

4. String 屬于基礎的數據類型嗎?

String 不屬于基礎類型,基礎類型有 8 種:byte、boolean、char、short、int、float、long、double,而 String 屬于對象。

5. java 中操作字符串都有哪些類?它們之間有什么區別?

操作字符串的類有:String、StringBuffer、StringBuilder。

String 和 StringBuffer、StringBuilder 的區別在于 String 聲明的是不可變的對象,每次操作都會生成新的 String 對象,然后將指針指向新的 String 對象,而 StringBuffer、StringBuilder 可以在原有對象的基礎上進行操作,所以在經常改變字符串內容的情況下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的區別在于,StringBuffer 是線程安全的,而 StringBuilder 是非線程安全的,但 StringBuilder 的性能卻高于 StringBuffer,所以在單線程環境下推薦使用 StringBuilder,多線程環境下推薦使用 StringBuffer。

6. 普通類和抽象類有哪些區別?

  • 普通類不能包含抽象方法,抽象類可以包含抽象方法。

  • 抽象類不能直接實例化,普通類可以直接實例化。

7. 接口和抽象類有什么區別?

  • 實現:抽象類的子類使用 extends 來繼承;接口必須使用 implements 來實現接口。

  • 構造函數:抽象類可以有構造函數;接口不能有。

  • main 方法:抽象類可以有 main 方法,并且我們能運行它;接口不能有 main 方法。

  • 實現數量:類可以實現很多個接口;但是只能繼承一個抽象類。

  • 訪問修飾符:接口中的方法默認使用 public 修飾;抽象類中的方法可以是任意訪問修飾符。

8. java 中 IO 流分為幾種?(todo)

按功能來分:輸入流(input)、輸出流(output)。

按類型來分:字節流和字符流。

字節流和字符流的區別是:字節流按 8 位傳輸以字節為單位輸入輸出數據,字符流按 16 位傳輸以字符為單位輸入輸出數據。

9. BIO、NIO、AIO 有什么區別?

  • BIO:Block IO 同步阻塞式 IO,就是我們平常使用的傳統 IO,它的特點是模式簡單使用方便,并發處理能力低。

  • NIO:New IO 同步非阻塞 IO,是傳統 IO 的升級,客戶端和服務器端通過 Channel(通道)通訊,實現了多路復用。

  • AIO:Asynchronous IO 是 NIO 的升級,也叫 NIO2,實現了異步非堵塞 IO ,異步 IO 的操作基于事件和回調機制。

10. Java容器

Java常見面試題目有哪些

11. HashMap 和 Hashtable 有什么區別?

  • hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。

  • hashTable同步的,而HashMap是非同步的,效率上比hashTable要高。

  • hashMap允許空鍵值,而hashTable不允許。

12. 說一下 HashMap 的實現原理?

HashMap的數據結構:在java編程語言中,最基本的結構就是兩種,一個是數組,另外一個是模擬指針(引用),所有的數據結構都可以用這兩個基本結構來構造的,HashMap也不例外。HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。

當我們往Hashmap中put元素時,首先根據key的hashcode重新計算hash值,根絕hash值得到這個元素在數組中的位置(下標),如果該數組在該位置上已經存放了其他元素,那么在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放入鏈尾.如果數組中該位置沒有元素,就直接將該元素放到數組的該位置上。

需要注意Jdk 1.8中對HashMap的實現做了優化,當鏈表中的節點數據超過八個之后,該鏈表會轉為紅黑樹來提高查詢效率,從原來的O(n)到O(logn)

13. 說一下 HashSet 的實現原理?

  • HashSet底層由HashMap實現

  • HashSet的值存放于HashMap的key上

  • HashMap的value統一為PRESENT

14. ArrayList 和 LinkedList 的區別是什么?

最明顯的區別是 ArrrayList底層的數據結構是數組,支持隨機訪問,而 LinkedList 的底層數據結構是雙向循環鏈表,不支持隨機訪問。使用下標訪問一個元素,ArrayList 的時間復雜度是 O(1),而 LinkedList 是 O(n)。

15. ArrayList 和 Vector 的區別是什么?

  • Vector是同步的,而ArrayList不是。然而,如果你尋求在迭代的時候對列表進行改變,你應該使用CopyOnWriteArrayList。 

  • ArrayList比Vector快,它因為有同步,不會過載。 

  • ArrayList更加通用,因為我們可以使用Collections工具類輕易地獲取同步列表和只讀列表。

16. Array 和 ArrayList 有何區別?

  • Array可以容納基本類型和對象,而ArrayList只能容納對象。 

  • Array是指定大小的,而ArrayList大小是固定的。 

  • Array沒有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。

17. 在 Queue 中 poll()和 remove()有什么區別?

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

18. 哪些集合類是線程安全的?

  • vector:就比arraylist多了個同步化機制(線程安全),因為效率較低,現在已經不太建議使用。在web應用中,特別是前臺頁面,往往效率(頁面響應速度)是優先考慮的。

  • statck:堆棧類,先進后出。

  • hashtable:就比hashmap多了個線程安全。

  • enumeration:枚舉,相當于迭代器。

19. 迭代器 Iterator 是什么(todo)

20. Iterator 怎么使用?有什么特點?

Java中的Iterator功能比較簡單,并且只能單向移動:  

(1) 使用方法iterator()要求容器返回一個Iterator。第一次調用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。

(2) 使用next()獲得序列中的下一個元素。  

(3) 使用hasNext()檢查序列中是否還有元素。

(4) 使用remove()將迭代器新返回的元素刪除。

==== 并發 線程 鎖 相關 ====

21. 并行和并發有什么區別?

  • 并行是指兩個或者多個事件在同一時刻發生;而并發是指兩個或多個事件在同一時間間隔發生。

  • 并行是在不同實體上的多個事件,并發是在同一實體上的多個事件。

  • 在一臺處理器上“同時”處理多個任務,在多臺處理器上同時處理多個任務。如hadoop分布式集群。

并發編程的目標是充分的利用處理器的每一個核,以達到最高的處理性能。

22. 線程和進程的區別?

簡而言之,進程是程序運行和資源分配的基本單位,一個程序至少有一個進程,一個進程至少有一個線程。進程在執行過程中擁有獨立的內存單元,而多個線程共享內存資源,減少切換次數,從而效率更高。線程是進程的一個實體,是cpu調度和分派的基本單位,是比程序更小的能獨立運行的基本單位。同一進程中的多個線程之間可以并發執行。

23. 守護線程是什么?(todo)

守護線程(即daemon thread),是個服務線程,準確地來說就是服務其他的線程

24. 創建線程有哪幾種方式?

①. 繼承Thread類創建線程類

  • 定義Thread類的子類,并重寫該類的run方法,該run方法的方法體就代表了線程要完成的任務。因此把run()方法稱為執行體。

  • 創建Thread子類的實例,即創建了線程對象。

  • 調用線程對象的start()方法來啟動該線程。

②. 通過Runnable接口創建線程類

  • 定義runnable接口的實現類,并重寫該接口的run()方法,該run()方法的方法體同樣是該線程的線程執行體。

  • 創建 Runnable實現類的實例,并依此實例作為Thread的target來創建Thread對象,該Thread對象才是真正的線程對象。

  • 調用線程對象的start()方法來啟動該線程。

③. 通過Callable和Future創建線程

  • 創建Callable接口的實現類,并實現call()方法,該call()方法將作為線程執行體,并且有返回值。

  • 創建Callable實現類的實例,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法的返回值。

  • 使用FutureTask對象作為Thread對象的target創建并啟動新線程。

  • 調用FutureTask對象的get()方法來獲得子線程執行結束后的返回值。

25. 說一下 Runnable 和 Callable 有什么區別?

  • Runnable接口中的run()方法的返回值是void,它做的事情只是純粹地去執行run()方法中的代碼而已;

  • Callable接口中的call()方法是有返回值的,是一個泛型,和Future、FutureTask配合可以用來獲取異步執行的結果。

26. 線程有哪些狀態?(todo 圖)

線程通常都有五種狀態,創建、就緒、運行、阻塞和死亡。

  • 創建狀態。在生成線程對象,并沒有調用該對象的start方法,這是線程處于創建狀態。

  • 就緒狀態。當調用了線程對象的start方法之后,該線程就進入了就緒狀態,但是此時線程調度程序還沒有把該線程設置為當前線程,此時處于就緒狀態。在線程運行之后,從等待或者睡眠中回來之后,也會處于就緒狀態。

  • 運行狀態。線程調度程序將處于就緒狀態的線程設置為當前線程,此時線程就進入了運行狀態,開始運行run函數當中的代碼。

  • 阻塞狀態。線程正在運行的時候,被暫停,通常是為了等待某個時間的發生(比如說某項資源就緒)之后再繼續運行。sleep,suspend,wait等方法都可以導致線程阻塞。

  • 死亡狀態。如果一個線程的run方法執行結束或者調用stop方法后,該線程就會死亡。對于已經死亡的線程,無法再使用start方法令其進入就緒 

27. sleep() 和 wait() 有什么區別?

sleep():方法是線程類(Thread)的靜態方法,讓調用線程進入睡眠狀態,讓出執行機會給其他線程,等到休眠時間結束后,線程進入就緒狀態和其他線程一起競爭cpu的執行時間。因為sleep() 是static靜態的方法,他不能改變對象的機鎖,當一個synchronized塊中調用了sleep() 方法,線程雖然進入休眠,但是對象鎖沒有被釋放,其他線程依然無法訪問這個對象。

wait():wait()是Object類的方法,當一個線程執行到wait方法時,它就進入到一個和該對象相關的等待池,同時釋放對象鎖,使得其他線程能夠訪問,可以通過notify,notifyAll方法來喚醒等待的線程

28. notify()和 notifyAll()有什么區別?

  • 如果線程調用了對象的 wait()方法,那么線程便會處于該對象的等待池中,等待池中的線程不會去競爭該對象的鎖。

  • 當有線程調用了對象的 notifyAll()方法(喚醒所有 wait 線程)或 notify()方法(只隨機喚醒一個 wait 線程),被喚醒的的線程便會進入該對象的鎖池中,鎖池中的線程會去競爭該對象鎖。也就是說,調用了notify后只要一個線程會由等待池進入鎖池,而notifyAll會將該對象等待池內的所有線程移動到鎖池中,等待鎖競爭。

  • 優先級高的線程競爭到對象鎖的概率大,假若某線程沒有競爭到該對象鎖,它還會留在鎖池中,唯有線程再次調用 wait()方法,它才會重新回到等待池中。而競爭到對象鎖的線程則繼續往下執行,直到執行完了 synchronized 代碼塊,它會釋放掉該對象鎖,這時鎖池中的線程會繼續競爭該對象鎖。

29. 創建線程池有哪幾種方式?

①. newFixedThreadPool(int nThreads)

創建一個固定長度的線程池,每當提交一個任務就創建一個線程,直到達到線程池的最大數量,這時線程規模將不再變化,當線程發生未預期的錯誤而結束時,線程池會補充一個新的線程。

②. newCachedThreadPool()

創建一個可緩存的線程池,如果線程池的規模超過了處理需求,將自動回收空閑線程,而當需求增加時,則可以自動添加新線程,線程池的規模不存在任何限制。

③. newSingleThreadExecutor()

這是一個單線程的Executor,它創建單個工作線程來執行任務,如果這個線程異常結束,會創建一個新的來替代它;它的特點是能確保依照任務在隊列中的順序來串行執行。

④. newScheduledThreadPool(int corePoolSize)

創建了一個固定長度的線程池,而且以延遲或定時的方式來執行任務,類似于Timer。

30. 線程池都有哪些狀態?

線程池有5種狀態:Running、ShutDown、Stop、Tidying、Terminated。

31. 線程池中 submit()和 execute()方法有什么區別?

  • submit支持有返回值的線程,而execute沒有。submit的入參是callable時,可以通過future獲取返線程返回值。入參如果是普通線程實現方式(Runnable或Thread)則無返回值。

  • submit方便Exception處理

32. 在 java 程序中怎么保證多線程的運行安全?(todo 很大的問題)

線程安全在三個方面體現:

  • 原子性:提供互斥訪問,同一時刻只能有一個線程對數據進行操作,(atomic,synchronized);

  • 可見性:一個線程對主內存的修改可以及時地被其他線程看到,(synchronized,volatile);

  • 有序性:一個線程觀察其他線程中的指令執行順序,由于指令重排序,該觀察結果一般雜亂無序,(happens-before原則)。

33. 多線程鎖的升級原理是什么?(todo 很大的問題)

在Java中,鎖共有4種狀態,級別從低到高依次為:無狀態鎖,偏向鎖,輕量級鎖和重量級鎖狀態,這幾個狀態會隨著競爭情況逐漸升級。鎖可以升級但不能降級。

鎖升級的圖示過程:

Java常見面試題目有哪些

34. 什么是死鎖?(todo)

35. 怎么防止死鎖?

死鎖的四個必要條件:

  • 互斥條件:進程對所分配到的資源不允許其他進程進行訪問,若其他進程訪問該資源,只能等待,直至占有該資源的進程使用完成后釋放該資源

  • 請求和保持條件:進程獲得一定的資源之后,又對其他資源發出請求,但是該資源可能被其他進程占有,此事請求阻塞,但又對自己獲得的資源保持不放

  • 不可剝奪條件:是指進程已獲得的資源,在未完成使用之前,不可被剝奪,只能在使用完后自己釋放

  • 環路等待條件:是指進程發生死鎖后,若干進程之間形成一種頭尾相接的循環等待資源關系

這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之 一不滿足,就不會發生死鎖。

理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和 解除死鎖。

所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確 定資源的合理分配算法,避免進程永久占據系統資源。

此外,也要防止進程在處于等待狀態的情況下占用資源。因此,對資源的分配要給予合理的規劃。

36. ThreadLocal 是什么?有哪些使用場景?

線程局部變量是局限于線程內部的變量,屬于線程自身所有,不在多個線程間共享。Java提供ThreadLocal類來支持線程局部變量,是一種實現線程安全的方式。但是在管理環境下(如 web 服務器)使用線程局部變量的時候要特別小心,在這種情況下,工作線程的生命周期比任何應用變量的生命周期都要長。任何線程局部變量一旦在工作完成后沒有釋放,Java 應用就存在內存泄露的風險。

37. 說一下 synchronized 底層實現原理?(todo 很大)

synchronized可以保證方法或者代碼塊在運行時,同一時刻只有一個方法可以進入到臨界區,同時它還可以保證共享變量的內存可見性。

Java中每一個對象都可以作為鎖,這是synchronized實現同步的基礎:

  • 普通同步方法,鎖是當前實例對象

  • 靜態同步方法,鎖是當前類的class對象

  • 同步方法塊,鎖是括號里面的對象

38. synchronized 和 volatile 的區別是什么?(todo)

  • volatile本質是在告訴jvm當前變量在寄存器(工作內存)中的值是不確定的,需要從主存中讀取; synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住。

  • volatile僅能使用在變量級別;synchronized則可以使用在變量、方法、和類級別的。

  • volatile僅能實現變量的修改可見性,不能保證原子性;而synchronized則可以保證變量的修改可見性和原子性。

  • volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。

  • volatile標記的變量不會被編譯器優化;synchronized標記的變量可以被編譯器優化。

39. synchronized 和 Lock 有什么區別?(todo)

  • 首先synchronized是java內置關鍵字,在jvm層面,Lock是個java類;

  • synchronized無法判斷是否獲取鎖的狀態,Lock可以判斷是否獲取到鎖;

  • synchronized會自動釋放鎖(a 線程執行完同步代碼會釋放鎖 ;b 線程執行過程中發生異常會釋放鎖),Lock需在finally中手工釋放鎖(unlock()方法釋放鎖),否則容易造成線程死鎖;

  • 用synchronized關鍵字的兩個線程1和線程2,如果當前線程1獲得鎖,線程2線程等待。如果線程1阻塞,線程2則會一直等待下去,而Lock鎖就不一定會等待下去,如果嘗試獲取不到鎖,線程可以不用一直等待就結束了;

  • synchronized的鎖可重入、不可中斷、非公平,而Lock鎖可重入、可判斷、可公平(兩者皆可);

  • Lock鎖適合大量同步的代碼的同步問題,synchronized鎖適合代碼少量的同步問題。

40. synchronized 和 ReentrantLock 區別是什么?(todo)

synchronized是和if、else、for、while一樣的關鍵字,ReentrantLock是類,這是二者的本質區別。既然ReentrantLock是類,那么它就提供了比synchronized更多更靈活的特性,可以被繼承、可以有方法、可以有各種各樣的類變量,ReentrantLock比synchronized的擴展性體現在幾點上: 

  • ReentrantLock可以對獲取鎖的等待時間進行設置,這樣就避免了死鎖 

  • ReentrantLock可以獲取各種鎖的信息

  • ReentrantLock可以靈活地實現多路通知 

另外,二者的鎖機制其實也是不一樣的:ReentrantLock底層調用的是Unsafe的park方法加鎖,synchronized操作的應該是對象頭中mark word。

41. 說一下 atomic 的原理?(todo)

Atomic包中的類基本的特性就是在多線程環境下,當有多個線程同時對單個(包括基本類型及引用類型)變量進行操作時,具有排他性,即當多個線程同時對該變量的值進行更新時,僅有一個線程能成功,而未成功的線程可以向自旋鎖一樣,繼續嘗試,一直等到執行成功。

Atomic系列的類中的核心方法都會調用unsafe類中的幾個本地方法。我們需要先知道一個東西就是Unsafe類,全名為:sun.misc.Unsafe,這個類包含了大量的對C代碼的操作,包括很多直接內存分配以及原子操作的調用,而它之所以標記為非安全的,是告訴你這個里面大量的方法調用都會存在安全隱患,需要小心使用,否則會導致嚴重的后果,例如在通過unsafe分配內存的時候,如果自己指定某些區域可能會導致一些類似C++一樣的指針越界到其他進程的問題。

====  java 進階 ====

42. 什么是反射?怎么反射?(todo)

反射主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力

Java反射:

在Java運行時環境中,對于任意一個類,能否知道這個類有哪些屬性和方法?對于任意一個對象,能否調用它的任意一個方法

Java反射機制主要提供了以下功能:

  • 在運行時判斷任意一個對象所屬的類。

  • 在運行時構造任意一個類的對象。

  • 在運行時判斷任意一個類所具有的成員變量和方法。

  • 在運行時調用任意一個對象的方法。 

43. 什么是 java 序列化?什么情況下需要序列化?

簡單說就是為了保存在內存中的各種對象的狀態(也就是實例變量,不是方法),并且可以把保存的對象狀態再讀出來。Java提供一種保存對象狀態的機制,那就是序列化。
什么情況下需要序列化:

a)當你想把的內存中的對象狀態保存到一個文件中或者數據庫中時候;
b)當你想用套接字在網絡上傳送對象的時候;
c)當你想通過RMI傳輸對象的時候;(todo RMI)

44. 動態代理是什么?有哪些應用?

動態代理:

當想要給實現了某個接口的類中的方法,加一些額外的處理。比如說加日志,加事務等。可以給這個類創建一個代理,故名思議就是創建一個新的類,這個類不僅包含原來類方法的功能,而且還在原來的基礎上添加了額外處理的新類。這個代理類并不是定義好的,是動態生成的。具有解耦意義,靈活,擴展性強。

動態代理的應用:

  • Spring的AOP

  • 加事務

  • 加權限

  • 加日志

45. 怎么實現動態代理?動態代理原理?(todo cglib )

46. 如何實現對象克隆?

有兩種方式:

1). 實現Cloneable接口并重寫Object類中的clone()方法;

2). 實現Serializable接口,通過對象的序列化和反序列化實現克隆,可以實現真正的深度克隆。(https://mp.weixin.qq.com/s?__biz=MzIwMTY0NDU3Nw==&mid=504458948&idx=1&sn=b92a84b1a8eb1d0264077b5853aeed1f&chksm=0d0f018a3a78889c4c361b40979771068af7f25bc5097b047b252d423834aa6b921609ec2e8e#rd)

基于序列化和反序列化實現的克隆不僅僅是深度克隆,更重要的是通過泛型限定,可以檢查出要克隆的對象是否支持序列化,這項檢查是編譯器完成的,不是在運行時拋出異常,這種是方案明顯優于使用Object類的clone方法克隆對象。讓問題在編譯的時候暴露出來總是好過把問題留到運行時

47. 深拷貝和淺拷貝區別是什么?

  • 淺拷貝只是復制了對象的引用地址,兩個對象指向同一個內存地址,所以修改其中任意的值,另一個值都會隨之變化,這就是淺拷貝(例:assign())

  • 深拷貝是將對象及值復制過來,兩個對象修改其中任意的值另一個值不會改變,這就是深拷貝(例:JSON.parse()和JSON.stringify(),但是此方法無法復制函數類型)

48. throw 和 throws 的區別?

throws是用來聲明一個方法可能拋出的所有異常信息,throws是將異常聲明但是不處理,而是將異常往上傳,誰調用我就交給誰處理。而throw則是指拋出的一個具體的異常類型。

49. final、finally、finalize 有什么區別?

  • final可以修飾類、變量、方法,修飾類表示該類不能被繼承、修飾方法表示該方法不能被重寫、修飾變量表示該變量是一個常量不能被重新賦值。

  • finally一般作用在try-catch代碼塊中,在處理異常的時候,通常我們將一定要執行的代碼方法finally代碼塊中,表示不管是否出現異常,該代碼塊都會執行,一般用來存放一些關閉資源的代碼。

  • finalize是一個方法,屬于Object類的一個方法,而Object類是所有類的父類,該方法一般由垃圾回收器來調用,當我們調用System的gc()方法的時候,由垃圾回收器調用finalize(),回收垃圾。 

50. try-catch-finally 中哪個部分可以省略?

答:catch 可以省略

原因:

更為嚴格的說法其實是:try只適合處理運行時異常,try+catch適合處理運行時異常+普通異常。也就是說,如果你只用try去處理普通異常卻不加以catch處理,編譯是通不過的,因為編譯器硬性規定,普通異常如果選擇捕獲,則必須用catch顯示聲明以便進一步處理。而運行時異常在編譯時沒有如此規定,所以catch可以省略,你加上catch編譯器也覺得無可厚非。

51. try-catch-finally 中,如果 catch 中 return 了,finally 還會執行嗎?

答:會執行,在 return 前執行。

代碼示例1:

/* * java面試題--如果catch里面有return語句,finally里面的代碼還會執行嗎? */public class FinallyDemo2 {    public static void main(String[] args) {        System.out.println(getInt());    }    public static int getInt() {        int a = 10;        try {            System.out.println(a / 0);            a = 20;        } catch (ArithmeticException e) {            a = 30;            return a;            /*             * return a 在程序執行到這一步的時候,這里不是return a 而是 return 30;這個返回路徑就形成了             * 但是呢,它發現后面還有finally,所以繼續執行finally的內容,a=40             * 再次回到以前的路徑,繼續走return 30,形成返回路徑之后,這里的a就不是a變量了,而是常量30             */        } finally {            a = 40;        }//      return a;    }}

執行結果:30

代碼示例2:

package com.java_02;/* * java面試題--如果catch里面有return語句,finally里面的代碼還會執行嗎? */public class FinallyDemo2 {    public static void main(String[] args) {        System.out.println(getInt());    }    public static int getInt() {        int a = 10;        try {            System.out.println(a / 0);            a = 20;        } catch (ArithmeticException e) {            a = 30;            return a;            /*             * return a 在程序執行到這一步的時候,這里不是return a 而是 return 30;這個返回路徑就形成了             * 但是呢,它發現后面還有finally,所以繼續執行finally的內容,a=40             * 再次回到以前的路徑,繼續走return 30,形成返回路徑之后,這里的a就不是a變量了,而是常量30             */        } finally {            a = 40;            return a; //如果這樣,就又重新形成了一條返回路徑,由于只能通過1個return返回,所以這里直接返回40        }//      return a;    }}

執行結果:40

52. 常見的異常類有哪些?

  • NullPointerException:當應用程序試圖訪問空對象時,則拋出該異常。

  • SQLException:提供關于數據庫訪問錯誤或其他錯誤信息的異常。

  • IndexOutOfBoundsException:指示某排序索引(例如對數組、字符串或向量的排序)超出范圍時拋出。 

  • NumberFormatException:當應用程序試圖將字符串轉換成一種數值類型,但該字符串不能轉換為適當格式時,拋出該異常。

  • FileNotFoundException:當試圖打開指定路徑名表示的文件失敗時,拋出此異常。

  • IOException:當發生某種I/O異常時,拋出此異常。此類是失敗或中斷的I/O操作生成的異常的通用類。

  • ClassCastException:當試圖將對象強制轉換為不是實例的子類時,拋出該異常。

  • ArrayStoreException:試圖將錯誤類型的對象存儲到一個對象數組時拋出的異常。

  • IllegalArgumentException:拋出的異常表明向方法傳遞了一個不合法或不正確的參數。

  • ArithmeticException:當出現異常的運算條件時,拋出此異常。例如,一個整數“除以零”時,拋出此類的一個實例。 

  • NegativeArraySizeException:如果應用程序試圖創建大小為負的數組,則拋出該異常。

  • NoSuchMethodException:無法找到某一特定方法時,拋出該異常。

  • SecurityException:由安全管理器拋出的異常,指示存在安全侵犯。

  • UnsupportedOperationException:當不支持請求的操作時,拋出該異常。

  • RuntimeExceptionRuntimeException:是那些可能在Java虛擬機正常運行期間拋出的異常的超類。

感謝各位的閱讀,以上就是“Java常見面試題目有哪些”的內容了,經過本文的學習后,相信大家對Java常見面試題目有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安国市| 蓬安县| 涟水县| 明溪县| 泾阳县| 石棉县| 金华市| 湟中县| 皋兰县| 尼玛县| 巴林右旗| 千阳县| 昂仁县| 建湖县| 永城市| 沾化县| 易门县| 格尔木市| 汝州市| 古丈县| 宁陵县| 阳山县| 潞西市| 桃江县| 怀集县| 荣成市| 阜城县| 沭阳县| 玛多县| 沾化县| 藁城市| 澄迈县| 浦城县| 伊通| 邻水| 手机| 开封县| 海盐县| 怀集县| 富源县| 建湖县|