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