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

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

在 Toto sisi 群組發布
實踐還是理論?更重要的是什麼呢?很多人自然會說,練習更重要。就像,練習直到太陽下山,你就會快樂。我敢於不同意這一點。 探索 Java 開發人員職位面試中的問題和答案。 第 8 - 1 部分在面試過程中,沒有人會知道你練習時有多酷。相反,您將被要求展示您的理論能力。直到後來,當你通過了所有的面試層並被分配到一個專案時,你才會應用你的實務技能。你可能會反對,說有時候他們給你一個測試任務,所以還是需要練習。我並不反對,但我的觀點是,有時會這樣,但你總是需要在面試中展現理論知識。你感覺有什麼不同嗎?所有這些都意味著你必須有紮實的理論基礎,這就是我們今天要繼續建立的。更具體地說,我們將繼續關注訪談中經常提出的問題。

71. 如果我們不重寫 Enum 的 toString() 方法會發生什麼事?

假設我們有以下列舉
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
讓我們透過呼叫其toString()方法在控制台上顯示STUDENT欄位:
System.out.println(Role.STUDENT.toString());
結果,我們得到以下控制台輸出:
學生
因此,我們看到對於 enum toString()的預設實作會傳回常數本身的名稱。

72. 可以在 Enum 中宣告建構子嗎?

是的當然。建構函數設定enum內部字段的值。例如,讓我們在前面的列舉中加入兩個欄位(ageFromageTo)來指示每個角色的年齡範圍:
public enum Role {
   STUDENT(5,18),
   TEACHER(20,60),
   DIRECTOR(40,70),
   SECURITY_GUARD(18,50);

   int ageFrom;
   int ageTo;

   Role(int ageFrom, int ageTo) {
       this.ageFrom = ageFrom;
       this.ageTo = ageTo;
   }
}

73.==和equals()有什麼差別?

這是未來的 Java 開發人員最常見的面試問題之一。首先,在比較簡單值(intchardouble ...)時,我們使用==,因為這些變數包含可以直接比較的特定值。更重要的是,原始變數不是成熟的物件-它們不繼承Object類,也沒有equals()方法。如果我們討論比較引用物件的變量,那麼我們需要知道==僅比較引用的值,也就是它們是否引用同一個物件。即使一個物件中的所有資料與另一個物件中的所有資料相同,使用==進行比較也會產生負結果 ( false ),因為它們是單獨的物件。正如您可能已經猜到的,我們使用equals()方法來比較引用變數。這是Object類別的標準方法之一,對於物件的全面比較是必要的。但我需要立即指出,為了使此方法正常工作,必須重寫它以準確指示應如何比較物件。如果您不重寫該方法,那麼您將獲得預設實現,它使用==比較物件。在 IntelliJ IDEA 中,您可以使用 IDEA 快速鍵自動覆寫它:Alt+Insert。在出現的視窗中,選擇equals()hashCode()。然後選擇需要涉及的欄位。瞧!這些方法是自動實現的。下面的範例展示了自動產生的equals方法如何找到具有兩個欄位( intageString name )的最簡單的Cat類別:
@Override
public boolean equals(final Object o) {
   if (this == o) return true;
   if (o == null || this.getClass() != o.getClass()) return false;
   final Cat cat = (Cat) o;
   return this.age == cat.age &&
           Objects.equals(this.name, cat.name);
}
當談到enum時, ==equals()之間沒有實際區別。 探索 Java 開發人員職位面試中的問題和答案。 第 8 - 2 部分畢竟,枚舉儲存常數,即使我們使用==來比較相同的值,我們也會得到true,因為比較的參考將始終指向相同的物件。使用equals()也能得到正確的結果。如果您進入Enum的equals方法主體,您將看到Enum類別具有以下實作: 在內部我們可以看到一個很好的舊引用比較!總而言之,對於enum,我們可以使用==equals()進行正確比較。 探索 Java 開發人員職位面試中的問題和答案。 第 8 - 3 部分探索 Java 開發人員職位面試中的問題和答案。 第 8 - 4 部分

74. Enum 的 ordinal() 方法有什麼作用?

當我們對枚舉欄位呼叫int ordinal()方法時,我們會在枚舉值清單中取得該欄位從零開始的索引。讓我們在Role枚舉中的欄位上呼叫此方法,我們之前考慮過:
System.out.println(Role.DIRECTOR.ordinal());
相應地,控制台顯示:
2

75. Enum 可以與 Java 中的 TreeSet 或 TreeMap 一起使用嗎?

我們可以在TreeSetTreeMap中使用枚舉類型。我們可以這樣寫:
TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
且控制台會顯示:
學生 教師 主任 SECURITY_GUARD
我們得到了輸出,但不是按字母順序排列的。重點是,如果我們使用枚舉欄位作為TreeSet值或TreeMap鍵,那麼欄位將按其自然順序(按照它們在 enum 中指定的順序排序。了解它的工作原理有助於我們編寫更好的程式碼。

76. Enum 的ordinal() 和compareTo() 方法有何關係?

如前所述,ordinal()傳回枚舉欄位清單中欄位的索引。另外,當我們考慮上一個問題時,您看到當枚舉欄位放入 TreeSet 這是排序集)時,它們採用在 enum 中聲明的順序。如我們所知,TreeSetTreeMap透過呼叫其Comparable介面的compareTo()方法對專案進行排序。這告訴我們Enum類別實作了Comparable接口,這意味著它實作了compareTo()方法,該方法內部使用ordinal()方法來決定排序順序。進入Enum類,我們可以確認我們的假設: 這是方法本身的主體: 這裡沒有呼叫ordinal ()方法。相反,使用序數變量,它是枚舉中元素的索引號。ordinal ()方法本身 只不過是序數變數的 getter。 探索 Java 開發人員職位面試中的問題和答案。 第 8 - 5 部分探索 Java 開發人員職位面試中的問題和答案。 第 8 - 6 部分探索 Java 開發人員職位面試中的問題和答案。 第 8 - 7 部分

77. 寫一個枚舉範例

在上面討論的問題中,我已經給了enum的範例。我認為沒有理由在這裡重複程式碼。例如,請參閱有關枚舉中的建構函數的問題 72。

78. Enum 可以用在 switch case 嗎?

可以而且應該如此!根據我的經驗,我會注意到枚舉最常見的用途之一是邏輯結構,例如switch語句。在這種情況下,您可以提供所有可能的情況——一旦您為每個枚舉欄位編寫了邏輯,您甚至不需要預設子句!畢竟,如果您使用String或數字值(例如int ),您可能會收到意外的值,但對於 enum 來說這是不可能。對於上面的範例, switch語句如下所示:
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // some logic for STUDENT
           break;
       case TEACHER:
           // some logic for TEACHER
           break;
       case DIRECTOR:
           // some logic for DIRECTOR
           break;
       case SECURITY_GUARD:
           // some logic for SECURITY_GUARD
           break;
   }
}

79. 如何取得 Enum 的所有可能值?

如果您需要取得所有可能的枚舉值,可以使用value()方法,該方法會以自然順序(即按照 enum 中指定的順序傳回枚舉的所有可能值的陣列。例子:
Role[] roles = Role.values();
for (Role role : roles) {
   System.out.println(role);
}
我們將在控制台上看到以下內容:
學生 教師 主任 SECURITY_GUARD

串流媒體介面

80.Java中的Stream是什麼?

Java Stream API是一種相對較新的與資料流互動的方式,使我們能夠更方便、更緊湊地處理大數據,以及在一定數量的流中並行處理數據,從而有可能提高效能。

81. 命名交易的主要屬性

這裡的主題是 Stream API,但問題是關於事務的。嗯...首先,我們來了解一下什麼是交易。事務是對資料庫一組順序操作。它代表一個邏輯工作單元。事務可以獨立於其他並發事務完全且成功地執行,從而保持資料完整性,或者根本不執行,在這種情況下它沒有任何影響。事務有四個主要屬性,借助首字母縮寫ACID ,我們可以輕鬆記住它們。讓我們看看這個縮寫詞的每個字母的含義: A代表Atomicity。此屬性保證系統中沒有事務部分提交。要么它的所有子操作都將被執行,要么它們都不被執行(全部或全無)。 С代表一致性。此屬性保證每個成功的事務只會提交有效的結果。換句話說,這是一個保證,如果交易成功,那麼系統針對特定資料的所有規則都將被遵守。如果交易不成功,則不會執行,系統資料將返回到先前的狀態。 I代表隔離。此屬性意味著當執行事務時,並發事務不得影響其結果。此屬性是資源密集型的,因此通常會部分實現,從而允許解決特定隔離問題的特定隔離等級。我們將在下一個問題中更詳細地討論這一點。 D代表耐用性。此屬性保證如果使用者收到交易完成的確認,則他或她可以確定變更不會因為某些故障而被取消。也就是說,如果您已經收到交易成功完成的確認訊息,則可以確定某些作業系統故障不會對您的資料產生任何影響。

82. 事務隔離等級是什麼?

正如我之前所說,當涉及 ACID 屬性時,確保隔離是一個資源密集型過程。因此,該屬性已部分實現。隔離有不同的等級:等級越高,對效能的影響越嚴重。在我們進入事務隔離等級之前,我們需要考慮因事務隔離不足而出現的各種問題
  • 幻讀:當同一請求在單一事務中多次呼叫時,由於另一個事務的插入而產生不同的結果;

  • 不可重複讀取:當相同請求在單一事務中多次呼叫時,由於另一個事務的變更(更新)和刪除而產生不同的資料;

  • 髒讀:讀取交易已新增或修改並隨後回滾的尚未提交的資料;

  • 遺失更新:當一個資料區塊被不同的事務同時更改時,除了最後一個變更之外的所有變更都會遺失(類似於多執行緒中的競爭條件)。

事實上,事務隔離等級的特徵在於它們可以防止哪些隔離問題。請考慮下表的隔離等級及其防止的問題:
隔離等級 幻讀 不可重複讀取 髒讀 遺失更新
可串列化 + + + +
可重複讀取 - + + +
已提交讀 - - + +
未提交的閱讀 - - - +
沒有任何 - - - -
並且不要忘記另一面:隔離等級越高,處理交易所需的時間就越長(假設多個事務並行執行)。

83.Statement和PreparedStatement有什麼差別?

這裡我們突然改變了過渡到JDBC的功能。無論如何,我們首先要弄清楚聲明的意思。它是一個用來形成 SQL 查詢的物件。 JDBC使用三種類型:StatementPreparedStatementCallableStatement。我們今天不考慮CallableStatement相反,我們討論的是StatementPreparedStatement之間的差異。
  1. 語句用於執行簡單的 SQL 查詢,無需執行時間輸入參數。PrepareStatement可以在運行時接受輸入參數。

  2. 要為PreparedStatement設定參數,輸入參數在請求中被寫為問號,因此可以使用各種setter將它們替換為某個值,例如setDouble()setFloat()setInt()setTime() ...意味著您不會在請求中插入錯誤類型的資料。

  3. PreparedStatement是預先編譯的並使用緩存,因此它的執行速度比由Statement物件發出的請求稍快。因此,經常執行的 SQL 語句被建立為PreparedStatement對象,以提高效能。

  4. Statement很容易受到 SQL 注入的攻擊,但PreparedStatement 可以防止它們。

至此,我們就到此為止了!
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION