JavaRush /Java Blog /Random-TW /Java 開發者訪談問答分析。第2部分

Java 開發者訪談問答分析。第2部分

在 Random-TW 群組發布
大家好!我們繼續為初級、中級和高級開發人員尋找250 多個問題的答案。這些問題很有趣,我自己也喜歡分析它們:在這種時候你可以發現理論知識的差距,在最意想不到的地方。前一部分可以在這篇文章中面試問題及答案分析。 第 2 - 1 部分找到。但在我們開始之前,我想提醒您:
  1. 我將跳過與本系列文章交叉的問題,以免再次重複資訊。我建議閱讀這些資料,因為它們包含最常見(流行)的 Java Core 面試問題。
  2. 關於 DOU 的問題以烏克蘭語提出,但我將用俄語提供所有內容。
  3. 答案可以更詳細地描述,但我不會,因為那樣每個問題的答案可能需要整篇文章。他們不會在任何面試中詢問你如此詳細的問題。
如果有必要,我會留下更深入研究的連結。讓我們飛!

11.命名Object類別的所有方法

Object類別有11個方法:
  • Class<?> getClass() — 取得目前物件的類別;
  • int hashCode() — 取得目前物件的雜湊碼;
  • boolean equals(Object obj) - 目前物件與另一個物件的比較;
  • 物件clone()-建立並傳回目前物件的副本;
  • String toString() — 取得物件的字串表示形式;
  • void notify() - 喚醒一個在此物件的監視器上等待的執行緒(執行緒選擇是隨機的);
  • void notifyAll() - 喚醒在此物件的監視器上等待的所有執行緒;
  • void wait() - 在目前監視器上將目前執行緒切換到待機模式(凍結它),僅在同步區塊中工作,直到某些notify或notifyAll喚醒執行緒;
  • void wait(long timeout) - 也凍結目前監視器上的目前執行緒(在目前同步的監視器上),但使用計時器退出此狀態(或再次:直到notify或notifyAll喚醒);
  • void wait(long timeout, int nanos) - 與上述方法類似的方法,但具有更精確的退出凍結計時器;
  • void Finalize() - 在刪除此物件之前,垃圾收集器會呼叫此方法(最後)。它用於清理佔用的資源。
要正確使用hashCodeequals clonetoString和 Finalize 方法,必須重新定義它們,同時考慮到目前的任務和情況。

12.處理資源時try-with-resources和try-catch-finally有什麼差別?

通常,當使用try-catch-finally 時, final 區塊用於關閉資源。Java 7 引進了一種新型運算子try-with-resources ,它與try-catch-finally類似,用於釋放資源,但更緊湊且可讀。讓我們記住try-catch-finally是什麼樣子的:
String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
   bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
   bufferedWriter.write(text);
} catch (IOException e) {
   e.printStackTrace();
} finally {
   try {
       bufferedWriter.close();
   } catch (IOException e) {
       e.printStackTrace();
   }
}
現在讓我們重寫這段程式碼,但使用try-with-resources
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
   bufferedWriter.write(text);
} catch (IOException e) {
   e.printStackTrace();
}
它以某種方式變得更容易,你不覺得嗎?除了簡化之外,還有以下幾點:
  1. try-with-resources中,括號中宣告的資源(將被關閉)必須實作 AutoCloseable 介面及其唯一方法close()

    close方法在隱式的finally 區塊中執行,否則程式如何準確地理解如何關閉給定的資源?

    但是,很可能您很少會編寫自己的資源實作及其關閉方法。

  2. 區塊執行順序:

    1. 嘗試阻止。
    2. 終於隱了。
    3. 用於捕獲前面步驟中的異常的catch區塊。
    4. 終於明確了。

    通常,清單中顯示較低的異常會中斷顯示在較高位置的異常。

想像一下這樣一種情況,當使用try-catch-finally時,您的try中發生了異常。因此,特定的catch區塊立即開始執行,您在其中編寫另一個異常(例如,使用更詳細地描述錯誤的訊息),並且您希望該方法進一步拋出此異常。接下來是finally區塊的執行,其中也拋出了異常。但這是不同的。該方法最終會拋出這兩個異常中的哪一個?最後塊拋出異常!但try-with-resources也有一點。現在讓我們來看看相同情況下try-with-resources的行為。當我們嘗試在close()方法中(即隱式的finally中)關閉資源時,我們會在try區塊中遇到異常。這些異常中的哪一個會被捕獲被try塊拋出的那個!來自隱式finally(來自close()方法)的異常將被忽略。這種忽略也稱為異常抑制。

13.什麼是位元運算?

位元運算是對位元串的運算,包括邏輯運算和按位移位元。 邏輯運算:
  • 位元- 比較位元值,在此過程中,任何設定為0(假)的位元都會將結果中的對應位元設為0。也就是說,如果在比較的兩個值中該位元為1(真),則結果也將是1。

    表示為 - AND , &

    範例:10111101 & 01100111 = 00100101

  • 按位或是前一運算的逆運算。任何設定為 1 的位元都會將結果中的相似位元設為 1。因此,如果兩個比較值中該位元均為 0,則結果位元也將為 0。

    表示為 - OR , |

    範例:10100101 | 01100011 = 11100111

  • 按位元- 應用於一個值,翻轉(反轉)位元。即原來為1的位將變為0;那些原來為 0 的人將變成 1。

    表示為 - NOT , ~

    範例:~10100101 = 01011010

  • 按位 異或- 比較位值,如果兩個值中該位都等於 1,則結果將為 0,如果兩個值中該位都等於 0,則結果將為 0。即,要使結果等於1,只有一位必須等於1,第二位必須等於0。

    表示為 - XOR , ^

    例:10100101 ^ 01100011 = 11000110

按位移位- >><<將值的位元沿指定方向移位指定的數字。空出的位置用零填滿。例如:
  1. 01100011 >> 4 = 00000110
  2. 01100011 << 3 = 00011000
右移負數時也有一個例外。正如您所記得的,第一位負責符號,如果該位等於 1,則該數字為負數。如果移動負數,則空出的位置將不再用零填充,而是用 1 填充,因為需要保留符號位。例如:10100010 >> 2 = 11101000 同時,在Java中還多了一個無符號右移運算符>>>這個運算符類似於>>,移位時,空出的位置都補0,無論是否數字是負數還是正數。例如: 10100010 >>> 2 = 00101000在此閱讀更多關於位元運算的資訊。面試問題及答案分析。 第 2 - 2 部分作為在 Java 中使用按位移位的範例,您可以引用HashMap 的hash()方法,該方法用於確定鍵的特殊內部哈希碼:面試問題及答案分析。 第 2 - 3 部分該方法允許您均勻分佈HashMap 中的數據,以最大限度地減少資料量。碰撞次數。

14. Java 中哪些標準的不可變類別是物件?

不可變是不允許改變其原始參數的物件。它可能具有返回給定類型的新物件的方法,以及您想要更改的參數。一些標準的不可變物件:
  • 到目前為止,Java 中最著名的不可變物件是 String;
  • 包裝標準類型的包裝類別的實例:Boolean、Character、Byte、Short、Integer、Long、Double、Float;
  • 通常用於特別大的數字的物件 - BigInteger 和 BigDecimal;
  • 作為堆疊追蹤中的一個單元的物件(例如,在異常堆疊追蹤中) StackTraceElement;
  • File 類別的物件 - 可以更改文件,但同時它本身是不可變的;
  • UUID - 通常用作元素的唯一 ID;
  • java.time 套件的所有類別物件;
  • 區域設定 - 用於定義地理、政治或文化區域。

15. 不可變物件相對於常規物件有哪些優點?

  1. 此類物件在多線程環境中使用時是安全的。透過使用它們,您不必擔心由於線程競爭條件而丟失資料。與使用普通物件不同:在這種情況下,您必須非常仔細地思考並找出在平行環境中使用物件的機制。
  2. 不可變對像是映射中的好鍵,因為如果您使用可變對象,然後該對象更改其狀態,那麼在使用 HashMap 時可能會變得混亂:該對象仍然存在,而如果您使用containsKey (),它可能不會存在被發現。
  3. 不可變物件非常適合儲存程式運作時永遠不應更改的不可變(常數)資料。
  4. 「失敗的原子性」-如果一個不可變的物件拋出異常,它仍然不會保持在不需要的(損壞的)狀態。
  5. 這些類別很容易測試。
  6. 不需要諸如複製建構函式和克隆實作之類的附加機制。

關於物件導向程式設計的問題

面試問題及答案分析。 第 2 - 4 部分

16. 與過程式設計相比,OOP 整體有哪些優點?

那麼,OOP的優點:
  1. 複雜的應用程式比過程式設計更容易編寫,因為所有內容都被分解為小模組(彼此互動的物件),因此,程式設計歸結為物件之間的關係。
  2. 使用 OOP 編寫的應用程式更容易修改(只要遵循設計概念)。
  3. 由於其上的數據和操作形成單個實體,因此它們不會在整個應用程式中被塗抹(這通常發生在過程編程中)。
  4. 資訊封裝可以保護使用者最關鍵的資料。
  5. 可以對不同的資料重複使用相同的程式碼,因為類別允許您建立許多對象,每個對像都有自己的屬性值。
  6. 繼承和多態性還允許您重複使用和擴展現有程式碼(而不是重複類似的功能)。
  7. 比過程方法更容易擴展應用程式。
  8. OOP 方法使得從實作細節中抽象化成為可能。

17.告訴我們OOP有哪些缺點

不幸的是,他們也存在:
  1. OOP 需要大量的理論知識,在你可以寫任何東西之前需要掌握這些知識。面試問題及答案分析。 第 2 - 5 部分
  2. OOP 的思想並不那麼容易理解並在實踐中應用(你需要有一點內心的哲學家)。
  3. 當使用OOP時,由於系統的組織更加複雜,軟體的效能會略微下降。
  4. OOP方法需要更多的內存,因為一切都由類別、介面、方法組成,它們比普通變數佔用更多的內存。
  5. 初始分析所需的時間比程式分析所需的時間長。

18.什麼是靜態多態和動態多態

多態性允許物件對於同一類別或介面有不同的行為。多態性有兩種類型,也稱為早期結合和晚期結合靜態多態性,或更早的綁定:
  • 發生在編譯時(程式生命週期的早期);
  • 決定在編譯時執行哪個方法;
  • 方法重載是靜態多態性的一個例子;
  • 早期綁定包括私有方法、靜態方法和終端方法;
  • 早期綁定不涉及繼承;
  • 靜態多態不涉及特定的對象,而是涉及類別的訊息,類別的類型表示在變數名稱的左側。
動態多態性,或後期結合:
  • 發生在運行時(程式運行時);
  • 動態多態性決定了一個方法在運行時會有什麼樣的具體實作;
  • 方法重寫是動態多態性的一個例子;
  • 後期綁定是對特定物件、其類型或其超類別的引用的賦值;
  • 繼承與動態多態性相關。
您可以在本文中詳細了解早期綁定和後期綁定之間的差異。

19.定義OOP中的抽象原則

OOP 中的抽像是一種突出物件的一組重要特徵,排除不重要細節的方法。也就是說,當使用 OOP 方法設計程式時,您通常會專注於模型,而不深入研究其實現的細節。在Java中,介面負責抽象。例如,您有一台機器,這將是介面。以及與之進行的各種互動 - 例如,啟動引擎、使用變速箱 - 這些是我們使用的功能,無需深入了解實現細節。畢竟,當您駕駛汽車時,您不會考慮變速箱究竟如何實現其目的,或者鑰匙如何啟動發動機,或者方向盤到底如何轉動車輪。即使此功能之一的實現被替換(例如引擎),您也可能不會注意到。這對你來說並不重要:你不需要深入了解實作的細節。執行該行動對您來說很重要。實際上,這是對實作細節的抽象。今天我們就到此為止:未完待續!面試問題及答案分析。 第 2 - 6 部分
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION