實踐還是理論?更重要的是什麼呢?很多人會說,當然,練習更重要。就像,盡可能努力練習,你會很高興。我敢於不同意這一點。 在面試過程中,沒有人會知道你的練習程度如何。我們將根據理論對您進行詳細的詢問。只有這樣,當你經歷了各輪面試並進入專案後,你才會運用你的實際技能。你可能會反對:有時他們會給你一個測試任務,但仍然需要練習。我不爭論,它們有時會被給出,但事實是有時會發生,但理論訪談總是會發生。你感覺到有什麼不同嗎?所以,你腳下必須有紮實的理論基礎,我們今天要繼續加強這一點。也就是說,我們將繼續分析訪談中經常被問到的問題。
並且不要忘記硬幣的另一面:隔離等級越高,處理事務所需的時間就越長(如果多個事務並行執行)。如果您想深入研究這個主題,這裡有一篇很棒的文章可以幫助您入門。
71. 如果我們不重寫 Enum 的 toString() 方法會發生什麼事?
假設我們有以下列舉:public enum Role {
STUDENT,
TEACHER,
DIRECTOR,
SECURITY_GUARD;
}
讓我們透過呼叫學生的 toString()在控制台中顯示學生:
System.out.println(Role.STUDENT.toString());
控制台中的結果:
學生
也就是說,預設情況下,枚舉的toString()是常數本身的名稱。
72. 是否可以在 Enum 中指定建構子?
是的,當然。內部枚舉變數的值是透過建構函式設定的。作為範例,讓我們在前面的枚舉中新增兩個欄位——ageFrom和ageTo——以指示每個角色的年齡範圍: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 開發人員面試問題之一。讓我們從這樣一個事實開始:當我們比較簡單值(int、char、double ...)時,我們使用==來進行,因為變數包含特定值,我們可以比較它們。原始變數不是成熟的物件 - 它們不是從Object繼承,也沒有equals()方法。當我們談論比較引用物件的變數時,==只會比較引用的值 - 無論它們是否引用同一個物件。即使一個物件與另一個物件相同,透過==進行比較也會給出負結果 ( false ),因為這是一個不同的物件。如您所知,equals()方法用於比較引用變數。這是Object類別的標準方法之一,需要對物件進行完整的比較。但值得立即澄清的是:為了使方法正確運作,需要透過準確編寫如何比較此類的物件來重新定義它。除非您重寫方法,否則預設情況下它將通過==比較物件。在IntelliJ IDEA中,您可以自動覆寫它(使用 IDEA 工具) -> alt + insert,在出現的視窗中,選擇equals() 和 hashCode() -> 選擇哪些類別欄位應該參與 -> 瞧,自動實作方法已完成。下面是一個自動產生的equals方法的範例,該方法對於具有兩個欄位(intage和String 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 時,我們也會正確地計算出功能,特別是如果你進入enum的equals方法的主體,你會看到在Enum類中該方法的實現如下:裡面- 很好的舊比較參考!總結一下:對於enum,透過==和equals進行比較是正確的。
74. Enum 中的ordinal()方法有什麼作用?
當對枚舉元素呼叫int ordinal ()方法時,我們將得到該值在一般枚舉系列中從零開始的序數。讓我們在前面討論的枚舉中的一個元素上使用此方法- Role:System.out.println(Role.DIRECTOR.ordinal());
相應地,控制台將顯示:
2
75. 在Java中是否可以將Enum與TreeSet或TreeMap一起使用?
在TreeSet和TreeMap中使用枚舉類型是可以接受的。我們可以寫: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中指定的順序)排序。了解這些功能有助於我們編寫更好的程式碼。
76. Enum 中的ordinal() 和compareTo() 方法有何關係?
如前所述,ordinal()傳回通用枚舉清單中值的序數。另外,在對上一個問題的分析中,您看到列舉的元素(例如,在TreeSet (排序集)中)採用它們在enum中聲明的順序。如我們所知,TreeSet和TreeMap透過呼叫Comparable介面的compareTo()方法對元素進行排序。由此我們可以假設Enum類別實作了Comparable接口,並在compareTo()方法中實作了它,其中ordinal()用於設定排序順序。進入Enum類別後,我們看到了這一點的確認:以及方法本身的主體:這裡沒有呼叫ordinal()方法。相反,使用序數變數- 枚舉中元素的序號。ordinal()方法本身只不過是序數變數的 getter 。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是一種相對較新的與資料流互動的方式,這反過來又允許您更方便、更緊湊地處理大數據,以及在一定數量的線程之間並行化數據處理,這可以提高使用時的性能功能。簡而言之,這個主題無法更深入地討論,因此我將在此處留下一篇文章的鏈接,以幫助您深入了解該主題。81. 交易的主要屬性是什麼?
主題叫Stream API,但問題是關於事務的。嗯...首先,我們來了解一下什麼是交易。 事務是一組順序資料庫操作,表示處理資料的邏輯單元。事務可以完全成功地完成,保持資料完整性並獨立於並行運行的其他事務,或者根本無法完成,在這種情況下它沒有任何影響。所以,事務有四個主要屬性,簡稱ACID。讓我們來看看這個縮寫的每個字母代表什麼: A - Atomicity - 原子性- 這個屬性保證沒有交易會被部分記錄在系統中。要麼執行其所有子操作,要麼不執行任何子操作(全部或全無)。 C - Consistency(一致性)-一致性是確保每個成功的交易只記錄有效結果的屬性。也就是說,這是一種保證,在交易成功的情況下,系統對特定資料施加的所有規則和限制都將得到滿足,否則交易將無法完成,系統中的資料將返回到先前的狀態。狀態。 I - Isolation - 隔離是一個屬性,表示在交易執行期間,並行事務不應影響其結果。此屬性是資源密集型的,因此通常透過允許一定程度的絕緣來解決某些絕緣問題來部分實現。我們將在下一個問題中更詳細地討論這一點。D - 持久性 -此屬性確保如果使用者從系統收到交易已完成的確認,他可以確定他所做的更改不會因為某些故障而被取消。也就是說,如果您已經收到交易成功完成的確認訊息,則可以確定某種作業系統故障不會對您的資料產生任何影響。82. 事務隔離等級是什麼?
正如我之前所說,提供 ACID 隔離是一個資源密集型過程。因此,該性質得到部分滿足。隔離有不同的級別,級別越高,對生產力的影響就越大。在討論事務隔離等級之前,我們需要先看看事務隔離不足的各種問題:-
幻讀-同一個事務中重複呼叫同一個樣本(同一個查詢)時,收到的資料不同,這是由於另一個事務插入資料造成的;
-
非重複讀取-當在同一個事務中重複呼叫相同的樣本(相同的查詢)時,接收到的資料不同,這是由於另一個事務對資料的變更(更新)和刪除而發生的;
-
髒讀- 讀取事務新增或更改的資料的過程,該資料隨後未被確認(回滾),即 讀取無效資料;
-
遺失更新-當不同事務同時更改相同資料時,除了最後一個變更之外的所有變更都會遺失(讓人想起多執行緒環境中的「競爭條件」問題)。
隔離等級 | 幻讀 | 不重複閱讀 | 髒讀 | 遺失更新 |
---|---|---|---|---|
可串列化 | + | + | + | + |
可重複讀取 | - | + | + | + |
已提交讀 | - | - | + | + |
未提交的閱讀 | - | - | - | + |
沒有任何 | - | - | - | - |
83.Statement和PreparedStatement有什麼差別?
而這裡向JDBC技術的特性過渡並不是很順利。所以,首先,讓我們弄清楚Statement實際上是什麼。這是一個用於產生 SQL 查詢的物件。JDBC使用三種類型:Statement、PreparedStatement和CallableStatement。 今天我們不看CallableStatement :我們來談談Statement和PreparedStatement之間的差異。-
語句用於執行簡單的 SQL 查詢,無需傳入、動態插入的參數。使用PrepareStatement能夠動態插入輸入參數。
-
要在PreparedStatement中設定參數,請求中的輸入參數會被寫成問號,這樣就可以使用各種設定器插入值,例如setDouble()、setFloat()、setInt()、setTime() ... 。因此,您不會在查詢中插入錯誤類型的資料。
-
PreparedStatement是「預先編譯的」並使用緩存,因此它的執行速度可能比從Statement物件查詢稍快。因此,經常執行的 SQL 查詢被編寫為PreparedStatement物件以提高效能。
-
Statement很容易受到 SQL 注入的攻擊,而PreparedStatement可以防止它們。在本文中閱讀有關消除 SQL 注入和 Java 安全性中其他最佳實踐的更多資訊。
GO TO FULL VERSION