CodeGym /Java Blog /Toto sisi /探索 Java 開發人員職位面試中的問題和答案。第2部分
John Squirrels
等級 41
San Francisco

探索 Java 開發人員職位面試中的問題和答案。第2部分

在 Toto sisi 群組發布
大家好!我們繼續為初級、中級和高級 Java 開發人員尋找問題的答案。問題超有趣。我個人喜歡分析它們,因為它可以幫助我發現理論知識中的差距,有時甚至是最意想不到的地方。 前一部分可以在這篇文章 探索 Java 開發人員職位面試中的問題和答案。 第 2 - 1 部分中找到。但在我們開始之前,我想提醒您:
  1. 我將跳過與本系列文章 重疊的問題,以免不必要地重複資訊。我建議閱讀這些文章,因為它們涵蓋了最常見(流行)的 Java Core 面試問題。
  2. 我可以更詳細地描述答案,但我不會,因為這樣每個答案都可能拖累整篇文章。在任何工作面試中,沒有人會要求您提供如此詳細的資訊。
如果您願意,我會留下更深入研究的連結。讓我們飛!

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

Object類別有11個方法:
  1. Class<?> getClass() — 取得目前物件的類別;

  2. int hashCode() — 取得目前物件的雜湊碼;

  3. boolean equals(Object obj) — 將目前物件與另一個物件進行比較;

  4. Object clone() — 建立並傳回目前物件的副本;

  5. String toString() — 取得物件的字串表示形式;

  6. void notify() — 喚醒在此物件監視器上等待的一個執行緒(執行緒的選擇是隨機的);

  7. void notifyAll() — 喚醒在此物件監視器上等待的所有執行緒;

  8. void wait() — 讓目前執行緒在目前監視器上等待(凍結目前執行緒),直到notify或notifyAll呼叫喚醒執行緒(僅適用於同步區塊);

  9. void wait(long timeout) — 使目前執行緒在目前監視器上等待(在目前同步區塊上),但退出等待狀態逾時(或再次,直到notify或notifyAll呼叫喚醒執行緒);

  10. void wait(long timeout, int nanos) — 此方法與先前的方法類似,但逾時時間較精確;

  11. void Finalize() — 在垃圾收集器刪除物件之前(最終)呼叫此方法。它用於清理獲取的資源。

要正確使用hashCodeequalsclonetoStringFinalize方法,必須根據目前任務的具體情況重寫它們。

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. try
    2. 隱式的finally區塊。
    3. catch區塊捕捉前面步驟中發生的異常。
    4. 顯式的finally區塊。

    通常,清單中較低位置拋出的異常會中斷較高位置拋出的異常。

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

13.什麼是位元運算?

位運算是對位序列的運算。它們包括邏輯運算和按位移位。 邏輯運算符:
  • 按位AND — 比較位值。任何設定為 0 (假) 的位元都會將結果中的對應位元設為 0。也就是說,如果兩個比較值中的某個位元均為 1 (真),則結果位元也將為 1。

    表示為AND&

    範例:10111101 & 01100111 = 00100101

  • 按位— 此操作與前一個操作相反。任何設定為 1 的位元都會將結果中的對應位元設為 1。因此,如果兩個比較值中該位元均為 0,則結果位元也將為 0。

    表示為OR|

    範例:10100101 | 01100011 = 11100111

  • 位元NOT — 此運算子套用於單一值。它翻轉(反轉)位元。即原來為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在此 閱讀更多關於位元運算的資訊。 探索 Java 開發人員職位面試中的問題和答案。 第 2 - 2 部分您可以將HashMap 中的hash()方法作為 Java 中按位移位的範例。此方法用於確定鍵的特殊內部雜湊碼: 探索 Java 開發人員職位面試中的問題和答案。 第 2 - 3 部分此方法可讓您均勻分佈 HashMap 中的數據,以最大程度地減少衝突次數。

14. Java中有哪些標準的不可變物件?

如果一個物件不允許其原始值改變,則該物件是不可變的。它可能具有傳回具有不同值的相同類型的新物件的方法。一些標準的不可變物件包括:
  • 毫無疑問,Java 最著名的不可變類型是 String;
  • 包裝標準類型的包裝類別的實例:Boolean、Character、Byte、Short、Integer、Long、Double、Float;
  • BigInteger 和 BigDecimal 對象,通常用於特別大的數字;
  • 組成堆疊追蹤的 StackTraceElement 物件(例如,異常的堆疊追蹤);
  • File 類別的物件-它可以修改文件,但同時物件本身保持不變;
  • UUID,通常用於唯一識別元素;
  • java.time套件中類別的所有物件;
  • Locale 對象,用於識別地理、政治或文化區域。

15. 不可變物件相對於一般物件有什麼優點?

  1. 不可變物件可以安全地在多執行緒環境中使用。他們這樣做是為了讓您不必擔心由於競爭條件而導致的資料遺失。這與處理普通物件時不同。在這種情況下,在並行環境中使用物件時,您必須思考並想出良好的機制。

  2. 不可變物件非常適合作為映射中的鍵。如果您使用可變物件作為 HashMap 鍵,然後該物件的狀態發生變化,那麼資料結構可能會變得混亂:該物件仍然存在,但如果您使用 containsKey(),您可能找不到它。

  3. 不可變物件非常適合儲存程式運行時永遠不應更改的不可變(常數)資料。

  4. 另一個優點是失敗原子性。如果不可變物件拋出異常,它不會處於不必要的(損壞的)狀態。

  5. 這些類別很容易測試。

  6. 您不需要任何額外的機制,例如複製建構函式或物件複製的實作。

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

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

好吧,OOP 的優點:
  1. 使用 OOP 比過程序編程更容易編寫複雜的應用程序,因為所有內容都被分解為小模組(彼此交互的對象),因此,編程被簡化為對象之間的關係。

  2. 使用 OOP 編寫的應用程式更容易修改(當正確遵守設計原則時)。

  3. 由於資料和資料操作都形成一個實體,因此它們不會遍布整個應用程式(在程式設計中經常出現這種情況)。

  4. 封裝的原則可以保護使用者最關鍵的資料。

  5. 相同的程式碼可以與不同的資料重複使用,因為類別允許您建立許多對象,每個對像都有自己的值。

  6. 繼承和多態性還允許您重複使用和擴展現有程式碼(而不是重複類似的功能)。

  7. 擴展應用程式比使用過程方法更簡單。

  8. OOP 方法使得抽象實作細節成為可能。

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

不幸的是,它們也存在:
  1. OOP 需要大量的理論知識,在編寫任何東西之前必須先掌握這些知識。

  2. OOP 思想並不那麼容易理解並在實踐中應用(你需要內心成為一個小哲學家)。

  3. 由於系統複雜性增加,OOP 會稍微降低程式的效能。

  4. OOP 方法需要更多的內存,因為一切都由類別、介面、方法組成,它們比普通變數佔用更多的內存。

  5. 初始分析所需的時間比程序方法所需的時間長。

18.什麼是靜態多態與動態多型?

多態性允許同一類別或介面的物件有不同的行為。多態性有兩種類型,也稱為早期結合和晚期結合。靜態多態性,或早期結合:
  • 發生在編譯時(程式生命週期的早期);
  • 決定在編譯時執行哪個方法;
  • 方法重載是靜態多態性的一個例子;
  • 早期綁定包括私有、靜態和最終方法;
  • 早期綁定不涉及繼承;
  • 靜態多態性不涉及特定對象,而是涉及出現在變數名稱左側的類別類型資訊。
動態多態性,或後期結合:
  • 發生在運行時(程式運行時);
  • 動態多態性決定了方法在運行時將具有哪種具體實現;
  • 方法重寫是動態多態性的一個例子;
  • 後期綁定意味著分配一個特定的物件、其類型的引用或其超類別;
  • 繼承與動態多態性相關。

19. 提供 OOP 中抽象原則的定義

在 OOP 中,抽像是一種隔離物件的一組有意義的特徵,同時排除無關緊要的細節的方法。也就是說,當使用 OOP 方法設計程式時,您將專注於通用模型,而不深入研究其實現的細節。在Java中,抽像是透過介面 來實現的。例如,您有一輛汽車,這將是一個介面。與之進行的各種互動(例如啟動引擎、換檔)都是函數,我們無需深入研究實現細節即可使用它們。事實上,當您開車時,您不會具體考慮變速箱如何實現其目的,或者鑰匙如何啟動發動機,或者方向盤如何準確地轉動車輪。如果您替換某些功能(例如引擎)的實現,您甚至可能不會注意到它。這對你來說並不重要:你不需要深入研究實作細節。對你來說重要的是行動得到執行。從本質上講,這抽象化了實作細節。至此,今天就到此為止:未完待續!
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION