
- 我將跳過與本系列文章 重疊的問題,以免不必要地重複資訊。我建議閱讀這些文章,因為它們涵蓋了最常見(流行)的 Java Core 面試問題。
- 我可以更詳細地描述答案,但我不會,因為這樣每個答案都可能拖累整篇文章。在任何工作面試中,沒有人會要求您提供如此詳細的資訊。
11. 命名Object類別的所有方法
Object類別有11個方法:-
Class<?> getClass() — 取得目前物件的類別;
-
int hashCode() — 取得目前物件的雜湊碼;
-
boolean equals(Object obj) — 將目前物件與另一個物件進行比較;
-
Object 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區塊中執行,否則程式如何決定如何關閉資源?
但是您可能很少會編寫自己的資源實作及其關閉方法。
-
區塊按以下順序執行:
- try塊。
- 隱式的finally區塊。
- catch區塊,捕捉前面步驟中發生的異常。
- 顯式的finally區塊。
通常,清單中較低位置拋出的異常會中斷較高位置拋出的異常。
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
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000


14. Java中有哪些標準的不可變物件?
如果一個物件不允許其原始值改變,則該物件是不可變的。它可能具有傳回具有不同值的相同類型的新物件的方法。一些標準的不可變物件包括:- 毫無疑問,Java 最著名的不可變類型是 String;
- 包裝標準類型的包裝類別的實例:Boolean、Character、Byte、Short、Integer、Long、Double、Float;
- BigInteger 和 BigDecimal 對象,通常用於特別大的數字;
- 組成堆疊追蹤的 StackTraceElement 物件(例如,異常的堆疊追蹤);
- File 類別的物件-它可以修改文件,但同時物件本身保持不變;
- UUID,通常用於唯一識別元素;
- java.time套件中類別的所有物件;
- Locale 對象,用於識別地理、政治或文化區域。
15. 不可變物件相對於一般物件有什麼優點?
-
不可變物件可以安全地在多執行緒環境中使用。他們這樣做是為了讓您不必擔心由於競爭條件而導致的資料遺失。這與處理普通物件時不同。在這種情況下,在並行環境中使用物件時,您必須思考並想出良好的機制。
-
不可變物件非常適合作為映射中的鍵。如果您使用可變物件作為 HashMap 鍵,然後該物件的狀態發生變化,那麼資料結構可能會變得混亂:該物件仍然存在,但如果您使用 containsKey(),您可能找不到它。
-
不可變物件非常適合儲存程式運行時永遠不應更改的不可變(常數)資料。
-
另一個優點是失敗原子性。如果不可變物件拋出異常,它不會處於不必要的(損壞的)狀態。
-
這些類別很容易測試。
-
您不需要任何額外的機制,例如複製建構函式或物件複製的實作。
關於物件導向程式設計的問題
16. 與過程式設計相比,OOP 整體有哪些優點?
好吧,OOP 的優點:-
使用 OOP 比過程序編程更容易編寫複雜的應用程序,因為所有內容都被分解為小模組(彼此交互的對象),因此,編程被簡化為對象之間的關係。
-
使用 OOP 編寫的應用程式更容易修改(當正確遵守設計原則時)。
-
由於資料和資料操作都形成一個實體,因此它們不會遍布整個應用程式(在程式設計中經常出現這種情況)。
-
封裝的原則可以保護使用者最關鍵的資料。
-
相同的程式碼可以與不同的資料重複使用,因為類別允許您建立許多對象,每個對像都有自己的值。
-
繼承和多態性還允許您重複使用和擴展現有程式碼(而不是重複類似的功能)。
-
擴展應用程式比使用過程方法更簡單。
-
OOP 方法使得抽象實作細節成為可能。
17.告訴我們OOP有哪些缺點
不幸的是,它們也存在:-
OOP 需要大量的理論知識,在編寫任何東西之前必須先掌握這些知識。
-
OOP 思想並不那麼容易理解並在實踐中應用(你需要內心成為一個小哲學家)。
-
由於系統複雜性增加,OOP 會稍微降低程式的效能。
-
OOP 方法需要更多的內存,因為一切都由類別、介面、方法組成,它們比普通變數佔用更多的內存。
-
初始分析所需的時間比程序方法所需的時間長。
18.什麼是靜態多態與動態多型?
多態性允許同一類別或介面的物件有不同的行為。多態性有兩種類型,也稱為早期結合和晚期結合。靜態多態性,或早期結合:- 發生在編譯時(程式生命週期的早期);
- 決定在編譯時執行哪個方法;
- 方法重載是靜態多態性的一個例子;
- 早期綁定包括私有、靜態和最終方法;
- 早期綁定不涉及繼承;
- 靜態多態性不涉及特定對象,而是涉及出現在變數名稱左側的類別類型資訊。
- 發生在運行時(程式運行時);
- 動態多態性決定了方法在運行時將具有哪種具體實現;
- 方法重寫是動態多態性的一個例子;
- 後期綁定意味著分配一個特定的物件、其類型的引用或其超類別;
- 繼承與動態多態性相關。
GO TO FULL VERSION