大家好!我們繼續為初級、中級和高級開發人員尋找250 多個問題的答案。這些問題很有趣,我自己也喜歡分析它們:在這種時候你可以發現理論知識的差距,在最意想不到的地方。前一部分可以在這篇文章中找到。但在我們開始之前,我想提醒您:
- 我將跳過與本系列文章交叉的問題,以免再次重複資訊。我建議閱讀這些資料,因為它們包含最常見(流行)的 Java Core 面試問題。
- 關於 DOU 的問題以烏克蘭語提出,但我將用俄語提供所有內容。
- 答案可以更詳細地描述,但我不會,因為那樣每個問題的答案可能需要整篇文章。他們不會在任何面試中詢問你如此詳細的問題。
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() - 在刪除此物件之前,垃圾收集器會呼叫此方法(最後)。它用於清理佔用的資源。
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();
}
它以某種方式變得更容易,你不覺得嗎?除了簡化之外,還有以下幾點:
-
在try-with-resources中,括號中宣告的資源(將被關閉)必須實作 AutoCloseable 介面及其唯一方法close()。
close方法在隱式的finally 區塊中執行,否則程式如何準確地理解如何關閉給定的資源?
但是,很可能您很少會編寫自己的資源實作及其關閉方法。
-
區塊執行順序:
- 嘗試阻止。
- 終於隱了。
- 用於捕獲前面步驟中的異常的catch區塊。
- 終於明確了。
通常,清單中顯示較低的異常會中斷顯示在較高位置的異常。
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
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000
14. Java 中哪些標準的不可變類別是物件?
不可變是不允許改變其原始參數的物件。它可能具有返回給定類型的新物件的方法,以及您想要更改的參數。一些標準的不可變物件:- 到目前為止,Java 中最著名的不可變物件是 String;
- 包裝標準類型的包裝類別的實例:Boolean、Character、Byte、Short、Integer、Long、Double、Float;
- 通常用於特別大的數字的物件 - BigInteger 和 BigDecimal;
- 作為堆疊追蹤中的一個單元的物件(例如,在異常堆疊追蹤中) StackTraceElement;
- File 類別的物件 - 可以更改文件,但同時它本身是不可變的;
- UUID - 通常用作元素的唯一 ID;
- java.time 套件的所有類別物件;
- 區域設定 - 用於定義地理、政治或文化區域。
15. 不可變物件相對於常規物件有哪些優點?
- 此類物件在多線程環境中使用時是安全的。透過使用它們,您不必擔心由於線程競爭條件而丟失資料。與使用普通物件不同:在這種情況下,您必須非常仔細地思考並找出在平行環境中使用物件的機制。
- 不可變對像是映射中的好鍵,因為如果您使用可變對象,然後該對象更改其狀態,那麼在使用 HashMap 時可能會變得混亂:該對象仍然存在,而如果您使用containsKey (),它可能不會存在被發現。
- 不可變物件非常適合儲存程式運作時永遠不應更改的不可變(常數)資料。
- 「失敗的原子性」-如果一個不可變的物件拋出異常,它仍然不會保持在不需要的(損壞的)狀態。
- 這些類別很容易測試。
- 不需要諸如複製建構函式和克隆實作之類的附加機制。
關於物件導向程式設計的問題
16. 與過程式設計相比,OOP 整體有哪些優點?
那麼,OOP的優點:- 複雜的應用程式比過程式設計更容易編寫,因為所有內容都被分解為小模組(彼此互動的物件),因此,程式設計歸結為物件之間的關係。
- 使用 OOP 編寫的應用程式更容易修改(只要遵循設計概念)。
- 由於其上的數據和操作形成單個實體,因此它們不會在整個應用程式中被塗抹(這通常發生在過程編程中)。
- 資訊封裝可以保護使用者最關鍵的資料。
- 可以對不同的資料重複使用相同的程式碼,因為類別允許您建立許多對象,每個對像都有自己的屬性值。
- 繼承和多態性還允許您重複使用和擴展現有程式碼(而不是重複類似的功能)。
- 比過程方法更容易擴展應用程式。
- OOP 方法使得從實作細節中抽象化成為可能。
17.告訴我們OOP有哪些缺點
不幸的是,他們也存在:- OOP 需要大量的理論知識,在你可以寫任何東西之前需要掌握這些知識。
- OOP 的思想並不那麼容易理解並在實踐中應用(你需要有一點內心的哲學家)。
- 當使用OOP時,由於系統的組織更加複雜,軟體的效能會略微下降。
- OOP方法需要更多的內存,因為一切都由類別、介面、方法組成,它們比普通變數佔用更多的內存。
- 初始分析所需的時間比程式分析所需的時間長。
18.什麼是靜態多態和動態多態
多態性允許物件對於同一類別或介面有不同的行為。多態性有兩種類型,也稱為早期結合和晚期結合。 靜態多態性,或更早的綁定:- 發生在編譯時(程式生命週期的早期);
- 決定在編譯時執行哪個方法;
- 方法重載是靜態多態性的一個例子;
- 早期綁定包括私有方法、靜態方法和終端方法;
- 早期綁定不涉及繼承;
- 靜態多態不涉及特定的對象,而是涉及類別的訊息,類別的類型表示在變數名稱的左側。
- 發生在運行時(程式運行時);
- 動態多態性決定了一個方法在運行時會有什麼樣的具體實作;
- 方法重寫是動態多態性的一個例子;
- 後期綁定是對特定物件、其類型或其超類別的引用的賦值;
- 繼承與動態多態性相關。
GO TO FULL VERSION