Java面试准备:15个Java面试问题
并非所有的訪談都將重點放在算法和數據結構上—通常,訪談通常只側重于您聲稱是專家的語言或技術。在此類訪談中,通常沒有任何“陷阱”問題,而是它們要求您利用內存和使用該語言的經驗–換句話說,它們測試您對編程語言的了解。
但是,忘記像Java這樣的語言的所有來龍去脈很容易,因為簡單地說,我們不會處理諸如“ JVM管理哪種內存?”這樣的問題。 和“用示例描述多態”。 以一天為周期。
這篇文章概述了Java訪談中提出的一些常見問題。 由于特定于Java的問題可能相差很大,因此本文旨在指導您思考各種不同類型的問題以及應該準備的主題。
今天,我們將討論與以下內容有關的面試問題和答案:
- Java生態系統
- Java類
- 介面
- 遺產
- 多線程
- 內存管理
- 館藏
- 異常處理
- 序列化
- 辛格爾頓
讓我們開始吧!
問題1:Java獨立于平臺意味著什么?
Java按照一次編寫即可在任何地方運行的原則工作。 編寫Java程序后,它將被編譯為字節碼,然后可以在任何Java虛擬機或JVM上運行。
字節碼的編譯是Java互操作性背后的魔力。 不同的操作系統和硬件體系結構具有為自己定制的JVM,并且所有JVM都可以運行相同的字節碼。 因此,如果您在Linux上編寫Java程序,它將在為Windows操作系統設計的JVM上無縫運行,從而使代碼與基礎硬件和操作系統無關。
Q2:解釋JRE,JDK和JVM的概念
- JRE(Java運行時環境)包括Java虛擬機和標準Java API(核心類和支持文件)。 JRE包含的內容足以執行Java應用程序,但不足以對其進行編譯。
- JDK(Java開發工具包)是JRE加上Java編譯器,以及一組用于編譯和調試代碼的其他工具。 JRE由Java平臺庫,Java虛擬機(JVM),Java插件和Java Web Start組成,以運行Java應用程序。 JRE作為獨立版本不包含編譯器和調試工具。 如果需要開發Java程序,則需要完整的Java SDK。 JRE不足以進行程序開發。 只有完整的Java SDK包含Java編譯器,該編譯器會將您的.java源文件轉換為字節碼.class文件。
- JVM(Java虛擬機)是規范的實現,詳細描述了JVM的預期行為。 任何符合JVM規范的實現都應該能夠運行編譯為Java字節碼的代碼,而與最初編寫該代碼的語言無關。 在Java編程語言中,所有源代碼都首先以純文本文件編寫,擴展名為.java。 然后,這些源文件由javac編譯器編譯為.class文件。 .class文件不包含處理器本身的代碼。 相反,它包含字節碼-Java虛擬機的機器語言。 然后,Java啟動器工具將使用Java虛擬機的實例運行您的應用程序。
問題3:如何在Java中將實體包標記為私有?
沒有私有包的顯式修飾符。 在沒有任何修飾符的情況下,類或成員變量是程序包私有的。 標記為包私有的成員僅在其自己的包中可見。 考慮下面的類。
私有包是私有的一種較寬泛的形式。 關于package-private的一件好事是,您可以使用它來授予對單元測試類本來認為私有的方法的訪問權。 因此,如果您使用沒有其他用途的幫助程序類,而是為了幫助您的公共類完成客戶端需要做的事情,則有必要將它們打包為私有,這是很有意義的,因為您希望使庫用戶盡可能簡單。
有哪些替代方案?
Object類提供了一個回調方法finalize(),當該對象變為垃圾時可以在該對象上調用該方法。 對象的finalize()實現沒有任何作用-您可以覆蓋finalize()進行清理,例如釋放資源。
finalize()方法可由系統自動調用,但是何時調用,即使調用,也不確定。 因此,您不應依賴此方法為您進行清理。 例如,如果您在執行I / O之后沒有在代碼中關閉文件描述符,并且您希望finalize()為您關閉它們,則文件描述符可能用完了。
以下是一些替代方案:
- try-with-resources慣用法可以用來清理對象。 這需要實現AutoCloseable接口。
- 垃圾回收對象時使用PhantomReference進行清理
- 使用Cleaner類執行清除操作。
- 實現close()方法,該方法進行清理并記錄該方法的調用。
Q5:是否可以按下面的代碼片段所示更改最終數組的內容?
final int[] array = new int[5]; array[0] = 1;它可能看起來違反直覺,但實際上我們可以更改數組的內容,即使它被標記為final。 數組變量指向內存中放置數組內容的特定起始位置。 位置或內存地址無法更改。 例如,以下代碼將無法編譯:
final int[] array = new int [5] array = new int[10];但是,以下代碼將起作用。
public class FinalArrayExample {final int[] array = new int[5];// allowedvoid changeArrayContents(int i, int val) {array[i] = val;}// not allowed and will not compile/*void changeArray() {array = new int [10]}*/}什么時候應該使用其中一個?
抽象類不能被實例化,但是可以被子類化。 抽象類通常包含抽象和非抽象方法,子類被迫為其提供實現。
接口是完全“抽象類”,用于將相關方法與空主體組合在一起。
以下是抽象類和接口之間的四個主要區別:
- 抽象類可以具有最終變量,靜態變量或類成員變量,而接口只能具有默認為final和static的變量。
- 抽象類可以具有靜態,抽象或非抽象方法。 接口可以具有靜態,抽象或默認方法。
- 抽象類的成員可以具有對私有,受保護或公共的不同可見性。 而在接口中,所有方法和常量都是公共的。
- 一個類只能擴展另一個類,但是可以實現多個接口。 同樣,一個接口可以擴展多個接口。 接口從不實現類或接口。
當子類共享狀態或使用通用功能時,請使用抽象類。 或者,您需要聲明非靜態,非最終字段,或者需要除public之外的訪問修飾符。
如果您期望不相關的類將實現您的接口,請使用接口。 例如,接口Comparable和Cloneable由許多不相關的類實現。 接口還用于需要多重繼承類型的實例。
你能給個例子嗎?
多態是在編程中針對不同的基礎形式或數據類型呈現相同接口的能力。 多態是指您可以將對象視為某物的通用版本,但是當您訪問它時,代碼將確定其確切的類型并調用關聯的代碼。 這意味著多態性使您的代碼可以與不同的類一起使用,而無需知道它正在使用哪個類。
多態性用于使應用程序更具模塊化和可擴展性。 您可以創建根據需要選擇的可互換對象,而不必使用混亂的條件語句來描述不同的操作過程。 這是多態性的基本目標。
多態的經典示例是Shape類。 我們從父類Shape派生Circle , Triangle和Rectangle類,它公開了抽象方法draw()。 派生類為draw()方法提供了其自定義實現。 現在,通過在每個對象上調用draw()方法,很容易呈現所有包含在同一數組中的不同類型的形狀。 這使我們drawTriangle()為每種形狀創建單獨的繪制方法,例如drawTriangle() , drawCircle()等。
Q8:主要方法可以重載嗎?
是的,主要方法是靜態方法,可以重載。 但是,即使您指定一個或兩個命令行參數,當JVM啟動您的類時,也只會使用public static void main(String[] args) 。 但是,可以以編程方式調用main方法的重載版本。
問題9:如何在每次調用調用時將多個參數傳遞給方法?
我們可以使用varargs功能將可變數量的參數傳遞給方法。 下面是將相同類型的多個參數傳遞給方法的示例。
public void childrenNames(string... names) {for(int i= 0; i < names.length; i++)system.out.println(names[i]);}- 類型名稱后跟三個點,一個空格,然后是變量名稱。
- varargs變量被視為數組。
- varargs變量必須出現在方法簽名的最后。
- 由于上述原因,方法簽名中只能有一個變量。
可以按以下方式調用上述方法: 調用Varargs方法
childrenNames(); childrenNames("Jane"); childrenNames("Jane", "Tom", "Peter");Q10:信號量可以用作互斥量嗎?
如果信號量可以發出的許可數設置為1,則它有可能充當互斥量。但是,兩者之間最重要的區別是,對于互斥量,同一線程必須調用獲取并隨后釋放。互斥鎖,而在二進制信號量的情況下,不同的線程可以在信號量上調用獲取和釋放。
這將我們引向“所有權”的概念。 互斥鎖由獲取它的線程擁有,直到它釋放為止,而對于信號量則沒有所有權的概念。
需要多線程復習嗎? 請查看本文“ Java多線程和并發:進行高級工程訪談時應了解的知識”。
Q11:解釋可外部化的界面
Serializable接口為我們的類對象提供了自動序列化功能。 另一方面,Externalizable接口提供了一種實現自定義序列化機制的方法。 實現Externalizable接口的類負責保存和恢復其自己實例的內容。
Externalizable接口擴展了Serializable接口,并提供了兩種方法來序列化和反序列化對象: writeExternal()和readExternal() 。
問題12:如果一個代碼塊引發多個異常,該如何處理?
一段代碼片段引發的多種類型的異常可以由多個catch塊子句后跟try塊來處理。 下面是一個示例異常處理片段:
oid process(int val) {try {if (val == 1)//checked exceptionthrow new FileNotFoundException();if (val == 2)// runtime exceptionthrow new NullPointerExxception();if (val == 3)// error exceptionthrow new StackOverflowError} catch (RuntimeException re) {// catches all unchecked exceptions} catch (Exception e) {// catches all checked exceptions} catch (Error err) {// catches all errors}}問題13:如果要使用集合,如何確定HashSet和TreeSet之間?
最初,您可能希望使用HashSet,因為它會給您帶來更好的時間復雜度,但不能保證該集的迭代順序。 特別是,它不能保證順序會隨著時間的推移保持恒定。
因此,如果您想保持順序,最好使用TreeSet,因為它以升序而不是按插入順序存儲鍵。 它不是線程安全的。 但是,請記住,TreeSet不是線程安全的,而HashSet是線程安全的。
問題14:可以通過哪些方法來改善Java應用程序的內存占用?
您可以采取以下三個關鍵步驟來改善內存占用量:
- 限制局部變量的范圍。 每次彈出堆棧頂部的作用域時,該作用域中的引用都會丟失,這會使對象有資格進行垃圾回收。
- 不需要時將變量引用顯式設置為null。 這將使對象有資格進行垃圾回收。
- 避免終結器。 它們會降低程序性能,并且不能保證任何事情。
問題15:實現單例類的最佳方法是什么?
根據喬什·布洛赫(Josh Bloch)實現單例的最佳方法是為單例使用枚舉類型。 因為Java確保僅創建一個枚舉的單個實例,所以通過枚舉實現的單例類可以免受反射和序列化攻擊。
class Demonstration {public static void main( String args[] ) {Superman superman = Superman.INSTANCE;superman.fly();} }enum Superman {INSTANCE;private final String name = "Clark Kent";private String residence = "USA";public void fly() {System.out.println("I am flyyyyinggggg ...");} }精通
這篇文章涵蓋了很多有關Java編程語言的內容,從Java生態系統(問題1)到多線程(問題10)和異常(問題12)不等。 這些是您可以期望的Java面試問題的類型。 最好使用上面概述的材料作為您要學習的主題和可能遇到的問題類型的指南。
但是,這里的材料只是劃傷表面。 還有更多的概念需要重新研究或探索,例如面向對象的編程,靜態變量和方法重載。
學習愉快! 家
翻譯自: https://www.javacodegeeks.com/2019/12/java-interview-prep-15-java-interview-questions.html
總結
以上是生活随笔為你收集整理的Java面试准备:15个Java面试问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java8 streams_Java 8
- 下一篇: java美元兑换,(Java实现) 美元