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

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

在 Random-TW 群組發布
實踐還是理論?更重要的是什麼呢?很多人會說,當然,練習更重要。就像,盡可能努力練習,你會很高興。我敢於不同意這一點。 Java 開發者訪談問答分析。 第 8 - 1 部分在面試過程中,沒有人會知道你的練習程度如何。我們將根據理論對您進行詳細的詢問。只有這樣,當你經歷了各輪面試並進入專案後,你才會運用你的實際技能。你可能會反對:有時他們會給你一個測試任務,但仍然需要練習。我不爭論,它們有時會被給出,但事實是有時會發生,但理論訪談總是會發生。你感覺到有什麼不同嗎?所以,你腳下必須有紮實的理論基礎,我們今天要繼續加強這一點。也就是說,我們將繼續分析訪談中經常被問到的問題。

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

假設我們有以下列舉
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
讓我們透過呼叫學生的 toString()在控制台中顯示學生:
System.out.println(Role.STUDENT.toString());
控制台中的結果:
學生
也就是說,預設情況下,枚舉toString()是常數本身的名稱。

72. 是否可以在 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);
}
如果我們討論枚舉的 == 和 equals 之間的區別,其實沒有太多區別。畢竟,枚舉儲存常數,即使使用==來比較相似的值,我們也會收到true,因為引用總是相同的物件。好吧,當使用equals 時,我們也會正確地計算出功能,特別是如果你進入enumequals方法的主體,你會看到在Enum類中該方法的實現如下:裡面- 很好的舊比較參考!總結一下:對於enum,透過==equals進行比較是正確的。Java 開發者訪談問答分析。 第 8 - 2 部分Java 開發者訪談問答分析。 第 8 - 3 部分Java 開發者訪談問答分析。 第 8 - 4 部分

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

當對枚舉元素呼叫int ordinal ()方法時,我們將得到該值在一般枚舉系列中從零開始的序數。讓我們在前面討論的枚舉中的一個元素上使用此方法- Role
System.out.println(Role.DIRECTOR.ordinal());
相應地,控制台將顯示:
2

75. 在Java中是否可以將Enum與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
我們收到的輸出不是按字母順序排列的。重點是,如果我們使用enum元素作為TreeSet值或作為TreeMap 的鍵,則元素將按其自然順序(它們在enum中指定的順序)排序。了解這些功能有助於我們編寫更好的程式碼。Java 開發者訪談問答分析。 第 8 - 5 部分

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

如前所述,ordinal()傳回通用枚舉清單中值的序數。另外,在對上一個問題的分析中,您看到列舉的元素(例如,在TreeSet (排序集)中)採用它們在enum中聲明的順序。如我們所知,TreeSetTreeMap透過呼叫Comparable介面的compareTo()方法對元素進行排序。由此我們可以假設Enum類別實作了Comparable接口,並在compareTo()方法中實作了它,其中ordinal()用於設定排序順序。進入Enum類別後,我們看到了這一點的確認:以及方法本身的主體:這裡沒有呼叫ordinal()方法。相反,使用序數變數- 枚舉中元素的序號。ordinal()方法本身只不過是序數變數的 getter 。Java 開發者訪談問答分析。 第 8 - 6 部分Java 開發者訪談問答分析。 第 8 - 7 部分Java 開發者訪談問答分析。 第 8 - 8 部分

77. 寫一個 EnumM 範例

在上面討論的問題中,我已經給出了枚舉的範例,我不認為重複程式碼有什麼意義(例如,關於枚舉中的建構函數的問題 72)。

78. 是否可以在 switch case 中使用 Enum?

這是可能的,也是必要的!回顧我的實踐,我注意到使用enum最常見的地方之一是像switch這樣的邏輯結構。在這種情況下,您可以提供case 的所有可能變體,並且在編寫所有枚舉值的邏輯之後-甚至可能不需要使用預設運算符!畢竟,如果您使用String或數字值(例如int類型),您可能會收到意外的值,而使用enum又是不可能的。對於前面討論的範例, 開關會是什麼樣子:
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // некая логика для STUDENT
           break;
       case TEACHER:
           // некая логика для TEACHER
           break;
       case DIRECTOR:
           // некая логика для DIRECTOR
           break;
       case SECURITY_GUARD:
           // некая логика для 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是一種相對較新的與資料流互動的方式,這反過來又允許您更方便、更緊湊地處理大數據,以及在一定數量的線程之間並行化數據處理,這可以提高使用時的性能功能。簡而言之,這個主題無法更深入地討論,因此我將在此處留下一篇文章的鏈接,以幫助您深入了解該主題。Java 開發者訪談問答分析。 第 8 - 9 部分

81. 交易的主要屬性是什麼?

主題叫Stream API,但問題是關於事務的。嗯...首先,我們來了解一下什麼是交易。 事務是一組順序資料庫操作,表示處理資料的邏輯單元。事務可以完全成功地完成,保持資料完整性並獨立於並行運行的其他事務,或者根本無法完成,在這種情況下它沒有任何影響。所以,事務有四個主要屬性,簡稱ACID。讓我們來看看這個縮寫的每個字母代表什麼: A - Atomicity - 原子性- 這個屬性保證沒有交易會被部分記錄在系統中。要麼執行其所有子操作,要麼不執行任何子操作(全部或全無)。 C - Consistency(一致性)-一致性是確保每個成功的交易只記錄有效結果的屬性。也就是說,這是一種保證,在交易成功的情況下,系統對特定資料施加的所有規則和限制都將得到滿足,否則交易將無法完成,系統中的資料將返回到先前的狀態。狀態。 I - Isolation - 隔離是一個屬性,表示在交易執行期間,並行事務不應影響其結果。此屬性是資源密集型的,因此通常透過允許一定程度的絕緣來解決某些絕緣問題來部分實現。我們將在下一個問題中更詳細地討論這一點。Java 開發者訪談問答分析。 第 8 - 10 部分D - 持久性 -此屬性確保如果使用者從系統收到交易已完成的確認,他可以確定他所做的更改不會因為某些故障而被取消。也就是說,如果您已經收到交易成功完成的確認訊息,則可以確定某種作業系統故障不會對您的資料產生任何影響。

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

正如我之前所說,提供 ACID 隔離是一個資源密集型過程。因此,該性質得到部分滿足。隔離有不同的級別,級別越高,對生產力的影響就越大。在討論事務隔離等級之前,我們需要先看看事務隔離不足的各種問題
  • 幻讀-同一個事務中重複呼叫同一個樣本(同一個查詢)時,收到的資料不同,這是由於另一個事務插入資料造成的;

  • 非重複讀取-當在同一個事務中重複呼叫相同的樣本(相同的查詢)時,接收到的資料不同,這是由於另一個事務對資料的變更(更新)和刪除而發生的;

  • 髒讀- 讀取事務新增或更改的資料的過程,該資料隨後未被確認(回滾),即 讀取無效資料;

  • 遺失更新-當不同事務同時更改相同資料時,除了最後一個變更之外的所有變更都會遺失(讓人想起多執行緒環境中的「競爭條件」問題)。

事務隔離等級的特徵在於它們可以防止哪些隔離問題。讓我們以表格的形式考慮絕緣水平以及它們可以防止哪些問題:
隔離等級 幻讀 不重複閱讀 髒讀 遺失更新
可串列化 + + + +
可重複讀取 - + + +
已提交讀 - - + +
未提交的閱讀 - - - +
沒有任何 - - - -
並且不要忘記硬幣的另一面:隔離等級越高,處理事務所需的時間就越長(如果多個事務並行執行)。如果您想深入研究這個主題,這裡有一篇很棒的文章可以幫助您入門。

83.Statement和PreparedStatement有什麼差別?

而這裡向JDBC技術的特性過渡並不是很順利。所以,首先,讓我們弄清楚Statement實際上是什麼。這是一個用於產生 SQL 查詢的物件。JDBC使用三種類型StatementPreparedStatementCallableStatement。 今天我們不看CallableStatement :我們來談談StatementPreparedStatement之間的差異。
  1. 語句用於執行簡單的 SQL 查詢,無需傳入、動態插入的參數。使用PrepareStatement能夠動態插入輸入參數。

  2. 要在PreparedStatement中設定參數,請求中的輸入參數會被寫成問號,這樣就可以使用各種設定器插入值,例如setDouble()setFloat()setInt()setTime() ... 。因此,您不會在查詢中插入錯誤類型的資料。

  3. PreparedStatement是「預先編譯的」並使用緩存,因此它的執行速度可能比從Statement物件查詢稍快。因此,經常執行的 SQL 查詢被編寫為PreparedStatement物件以提高效能。

  4. Statement很容易受到 SQL 注入的攻擊,而PreparedStatement可以防止它們。在本文中閱讀有關消除 SQL 注入和 Java 安全性中其他最佳實踐的更多資訊。

如果您開始研究將 Java 應用程式連接到資料庫的技術 - JDBC,我建議您從本文開始。好了,今天我們就到此為止。Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 8 - 11
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION